diff --git a/.gitignore b/.gitignore index db7a09e0..8ffc5fb9 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,15 @@ /third_party/osqp/ /third_party/OsqpEigen/ /output + +# Generated development artifacts +compile_commands.json +MUJOCO_LOG.TXT +__pycache__/ +*.py[cod] +*.log + +# Generated plots and vision debug output +/data/*.png +/data/*.svg +/python/vision_servo/red_point.png diff --git a/MUJOCO_LOG.TXT b/MUJOCO_LOG.TXT deleted file mode 100644 index 55930968..00000000 --- a/MUJOCO_LOG.TXT +++ /dev/null @@ -1,6 +0,0 @@ -Fri Jul 24 15:39:05 2026 -ERROR: could not create window - -Fri Jul 24 15:40:37 2026 -ERROR: could not create window - diff --git a/cmvr-es/algorithms/controllers/ume_legacy/CMakeLists.txt b/cmvr-es/algorithms/controllers/ume_legacy/CMakeLists.txt index 73bc703c..6e847056 100644 --- a/cmvr-es/algorithms/controllers/ume_legacy/CMakeLists.txt +++ b/cmvr-es/algorithms/controllers/ume_legacy/CMakeLists.txt @@ -20,59 +20,3 @@ add_library( ) install(TARGETS ume_legacy_controller LIBRARY DESTINATION lib) - -if(BUILD_TESTING) - add_executable(ume_legacy_controller_golden_test - tests/ume_legacy_controller_golden_test.cpp - ) - add_executable(pinocchio_ume_legacy_model_adapter_test - tests/pinocchio_ume_legacy_model_adapter_test.cpp - ) - - target_link_libraries(ume_legacy_controller_golden_test - PRIVATE - cmvr_es::algorithms::ume_legacy - gtest - gtest_main - pthread - ) - target_link_libraries(pinocchio_ume_legacy_model_adapter_test - PRIVATE - cmvr_es::algorithms::ume_legacy - gtest - gtest_main - pthread - ) - - foreach(_ume_legacy_test_target - ume_legacy_controller_golden_test - pinocchio_ume_legacy_model_adapter_test) - target_compile_definitions(${_ume_legacy_test_target} - PRIVATE - CMVR_UME_FIXED_MODEL_PATH="${CMAKE_SOURCE_DIR}/model/ume/v6_bimanual/robot.xml" - CMVR_UME_FLOATING_MODEL_PATH="${CMAKE_SOURCE_DIR}/model/ume/v6_imu/robot.xml" - ) - add_test( - NAME ${_ume_legacy_test_target} - COMMAND ${_ume_legacy_test_target} - ) - endforeach() - - set(_ume_legacy_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _ume_legacy_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - - foreach(_ume_legacy_test_target - ume_legacy_controller_golden_test - pinocchio_ume_legacy_model_adapter_test) - set_tests_properties(${_ume_legacy_test_target} PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_ume_legacy_test_environment}" - ) - endforeach() -endif() diff --git a/cmvr-es/algorithms/controllers/ume_legacy/tests/pinocchio_ume_legacy_model_adapter_test.cpp b/cmvr-es/algorithms/controllers/ume_legacy/tests/pinocchio_ume_legacy_model_adapter_test.cpp deleted file mode 100644 index 568ff28e..00000000 --- a/cmvr-es/algorithms/controllers/ume_legacy/tests/pinocchio_ume_legacy_model_adapter_test.cpp +++ /dev/null @@ -1,392 +0,0 @@ -#include "pinocchio_ume_legacy_model_adapter.h" - -#include -#include -#include -#include -#include -#include - -#include - -#ifndef CMVR_UME_FIXED_MODEL_PATH -#error "CMVR_UME_FIXED_MODEL_PATH must identify the deployed fixed UME MJCF" -#endif - -#ifndef CMVR_UME_FLOATING_MODEL_PATH -#error "CMVR_UME_FLOATING_MODEL_PATH must identify the deployed floating UME MJCF" -#endif - -namespace cmvr::ume_legacy { -namespace { - -constexpr double kNumericalTolerance = 1e-10; - -PinocchioUmeLegacyModelAdapter makeAdapter() -{ - return PinocchioUmeLegacyModelAdapter( - CMVR_UME_FIXED_MODEL_PATH, - CMVR_UME_FLOATING_MODEL_PATH); -} - -BimanualModelState makeGoldenState( - const PinocchioUmeLegacyModelAdapter& adapter) -{ - BimanualModelState state; - state.world_from_imu = - adapter.contract().base_from_imu; - state.right_position_rad = - {0.1, -0.2, 0.3, -0.4, - 0.2, -0.1, 0.15, -0.05}; - state.left_position_rad = - {-0.1, 0.2, -0.3, 0.4, - -0.2, 0.1, -0.15, 0.05}; - return state; -} - -template -void expectFinite(const std::array& values) -{ - for (std::size_t index = 0; index < Size; ++index) { - EXPECT_TRUE(std::isfinite(values[index])) - << "index " << index; - } -} - -template -void expectNear( - const std::array& actual, - const std::array& expected, - double tolerance = kNumericalTolerance) -{ - for (std::size_t index = 0; index < Size; ++index) { - EXPECT_NEAR(actual[index], expected[index], tolerance) - << "index " << index; - } -} - -Transform4x4RowMajor multiplyTransforms( - const Transform4x4RowMajor& left, - const Transform4x4RowMajor& right) -{ - Transform4x4RowMajor result{}; - for (std::size_t row = 0; row < 4; ++row) { - for (std::size_t column = 0; column < 4; ++column) { - for (std::size_t inner = 0; inner < 4; ++inner) { - result[row * 4 + column] += - left[row * 4 + inner] * - right[inner * 4 + column]; - } - } - } - return result; -} - -Transform4x4RowMajor makeNoncommutingWorldFromBase() -{ - constexpr double roll = 0.2; - constexpr double pitch = -0.35; - constexpr double yaw = 0.47; - const double sr = std::sin(roll); - const double cr = std::cos(roll); - const double sp = std::sin(pitch); - const double cp = std::cos(pitch); - const double sy = std::sin(yaw); - const double cy = std::cos(yaw); - return { - cy * cp, - cy * sp * sr - sy * cr, - cy * sp * cr + sy * sr, - 0.4, - sy * cp, - sy * sp * sr + cy * cr, - sy * sp * cr - cy * sr, - -0.1, - -sp, - cp * sr, - cp * cr, - 0.8, - 0.0, 0.0, 0.0, 1.0}; -} - -TEST(PinocchioUmeLegacyModelAdapterTest, - LoadsOriginalMjcfWithoutGeometryAssetsAndFreezesContract) -{ - const auto adapter = makeAdapter(); - const auto& contract = adapter.contract(); - - EXPECT_EQ(contract.fixed_nq, 16U); - EXPECT_EQ(contract.fixed_nv, 16U); - EXPECT_EQ(contract.floating_nq, 23U); - EXPECT_EQ(contract.floating_nv, 22U); - EXPECT_EQ(adapter.fixedModelPath(), CMVR_UME_FIXED_MODEL_PATH); - EXPECT_EQ( - adapter.floatingModelPath(), - CMVR_UME_FLOATING_MODEL_PATH); - - // This transform comes from the original floating model's imu site. - // Pinocchio buildModel parses it without loading STL geometry. - const Transform4x4RowMajor expected_base_from_imu{ - 0.0, 0.0, -1.0, -0.0298, - 0.0, 1.0, 0.0, 0.0, - 1.0, 0.0, 0.0, -0.229564, - 0.0, 0.0, 0.0, 1.0}; - expectNear( - contract.base_from_imu, - expected_base_from_imu, - 1e-5); -} - -TEST(PinocchioUmeLegacyModelAdapterTest, - FloatingBaseRneaProducesFiniteFrozenJointEfforts) -{ - const auto adapter = makeAdapter(); - const auto state = makeGoldenState(adapter); - JointVector right{}; - JointVector left{}; - - ASSERT_TRUE( - adapter.computeGravityCompensation( - state, right, left)); - expectFinite(right); - expectFinite(left); - expectNear( - right, - {4.2579946000243867, - -3.101883528283977, - 5.8349126697703291, - -3.2335040596068012, - 0.54313804667559806, - -0.28419763993223052, - 0.075420409617272505, - -0.0050792810993999194}); - expectNear( - left, - {-4.2570142852347947, - 3.1002195124462104, - -5.8319486672094438, - 3.2334454894750602, - -0.54274278459746039, - 0.28419800074629464, - -0.075420524366616282, - 0.0050792800399334561}); -} - -TEST(PinocchioUmeLegacyModelAdapterTest, - ImuDerivedBaseOrientationReversesGravityUnderHalfTurn) -{ - const auto adapter = makeAdapter(); - auto state = makeGoldenState(adapter); - JointVector upright_right{}; - JointVector upright_left{}; - ASSERT_TRUE(adapter.computeGravityCompensation( - state, upright_right, upright_left)); - - const Transform4x4RowMajor world_from_base_half_turn_x{ - 1.0, 0.0, 0.0, 0.0, - 0.0, -1.0, 0.0, 0.0, - 0.0, 0.0, -1.0, 0.0, - 0.0, 0.0, 0.0, 1.0}; - state.world_from_imu = multiplyTransforms( - world_from_base_half_turn_x, - adapter.contract().base_from_imu); - - JointVector inverted_right{}; - JointVector inverted_left{}; - ASSERT_TRUE(adapter.computeGravityCompensation( - state, inverted_right, inverted_left)); - for (std::size_t index = 0; index < kArmDof; ++index) { - EXPECT_NEAR( - inverted_right[index], - -upright_right[index], - kNumericalTolerance) - << "right joint index " << index; - EXPECT_NEAR( - inverted_left[index], - -upright_left[index], - kNumericalTolerance) - << "left joint index " << index; - } -} - -TEST(PinocchioUmeLegacyModelAdapterTest, - NoncommutingImuPoseAndAsymmetricVelocitiesMatchFrozenRnea) -{ - const auto adapter = makeAdapter(); - auto state = makeGoldenState(adapter); - state.world_from_imu = multiplyTransforms( - makeNoncommutingWorldFromBase(), - adapter.contract().base_from_imu); - state.right_velocity_rad_s = - {0.7, -0.4, 0.2, -0.1, - 1.1, -0.8, 0.5, -0.3}; - state.left_velocity_rad_s = - {-0.6, 0.9, -0.2, 0.4, - -1.0, 0.7, -0.5, 0.25}; - - JointVector right{}; - JointVector left{}; - ASSERT_TRUE(adapter.computeGravityCompensation( - state, right, left)); - expectFinite(right); - expectFinite(left); - expectNear( - right, - {2.080988418159027, - -1.3277143244666021, - 2.3194639604892364, - -2.0699331198781317, - 0.40716561983947641, - -0.20631486209184946, - 0.19335176308712126, - -0.01319194690287678}); - expectNear( - left, - {-5.6976332776660232, - 2.9915426497221254, - -2.5700109870406949, - 2.1379083447512071, - -0.36441212045948712, - 0.19226687457105307, - -0.085601264411386338, - 0.0065129700338426369}); -} - -TEST(PinocchioUmeLegacyModelAdapterTest, - FixedModelRotationalProjectionMatchesFrozenValues) -{ - const auto adapter = makeAdapter(); - const auto state = makeGoldenState(adapter); - RawHapticFeedback feedback; - feedback.shoulder_moment = {0.5, -0.2, 0.3}; - feedback.elbow_effort = 1.2; - feedback.wrist_moment = {-0.4, 0.1, 0.6}; - feedback.gripper_effort = -0.7; - - ProjectedHapticEffort right{}; - ASSERT_TRUE(adapter.projectHapticFeedback( - state, ArmSide::Right, feedback, right)); - expectFinite(right.shoulder_joint_torque); - expectFinite(right.wrist_joint_torque); - expectNear( - right.shoulder_joint_torque, - {-0.5, - -0.12674237993402607, - -0.30915027509149773}); - expectNear( - right.wrist_joint_torque, - {-0.065872923184419674, - -0.028130723042130143, - -0.72743566625468636}); - EXPECT_DOUBLE_EQ(right.elbow_effort, feedback.elbow_effort); - EXPECT_DOUBLE_EQ( - right.gripper_effort, - feedback.gripper_effort); - - ProjectedHapticEffort left{}; - ASSERT_TRUE(adapter.projectHapticFeedback( - state, ArmSide::Left, feedback, left)); - expectFinite(left.shoulder_joint_torque); - expectFinite(left.wrist_joint_torque); - expectNear( - left.shoulder_joint_torque, - {-0.5, - -0.36032671657345572, - 0.083245914753940151}); - expectNear( - left.wrist_joint_torque, - {-0.13497315246130309, - 0.15764759010789803, - -0.70779204949804098}); - EXPECT_DOUBLE_EQ(left.elbow_effort, feedback.elbow_effort); - EXPECT_DOUBLE_EQ( - left.gripper_effort, - feedback.gripper_effort); -} - -TEST(PinocchioUmeLegacyModelAdapterTest, - RejectsNonRigidOrNonFiniteInputsAndZerosOutputs) -{ - const auto adapter = makeAdapter(); - auto state = makeGoldenState(adapter); - JointVector right; - JointVector left; - right.fill(1.0); - left.fill(1.0); - - state.world_from_imu = {}; - EXPECT_FALSE(adapter.computeGravityCompensation( - state, right, left)); - expectNear(right, JointVector{}); - expectNear(left, JointVector{}); - - state = makeGoldenState(adapter); - state.right_position_rad[3] = - std::numeric_limits::quiet_NaN(); - right.fill(1.0); - left.fill(1.0); - EXPECT_FALSE(adapter.computeGravityCompensation( - state, right, left)); - expectNear(right, JointVector{}); - expectNear(left, JointVector{}); - - state = makeGoldenState(adapter); - RawHapticFeedback feedback; - feedback.shoulder_moment[1] = - std::numeric_limits::infinity(); - ProjectedHapticEffort projected; - projected.elbow_effort = 1.0; - EXPECT_FALSE(adapter.projectHapticFeedback( - state, ArmSide::Right, feedback, projected)); - expectNear( - projected.shoulder_joint_torque, - Vector3{}); - expectNear(projected.wrist_joint_torque, Vector3{}); - EXPECT_DOUBLE_EQ(projected.elbow_effort, 0.0); - EXPECT_DOUBLE_EQ(projected.gripper_effort, 0.0); - - feedback = {}; - projected.elbow_effort = 1.0; - EXPECT_FALSE(adapter.projectHapticFeedback( - state, - static_cast(99), - feedback, - projected)); - expectNear( - projected.shoulder_joint_torque, - Vector3{}); - expectNear(projected.wrist_joint_torque, Vector3{}); - EXPECT_DOUBLE_EQ(projected.elbow_effort, 0.0); - EXPECT_DOUBLE_EQ(projected.gripper_effort, 0.0); -} - -TEST(PinocchioUmeLegacyModelAdapterTest, - MissingModelFailsAtConstruction) -{ - EXPECT_THROW( - PinocchioUmeLegacyModelAdapter( - "/definitely/missing/ume_fixed.xml", - CMVR_UME_FLOATING_MODEL_PATH), - std::runtime_error); -} - -TEST(PinocchioUmeLegacyModelAdapterTest, - RejectsModelRoleSwapEvenThoughBothMjcfFilesParse) -{ - try { - PinocchioUmeLegacyModelAdapter adapter( - CMVR_UME_FLOATING_MODEL_PATH, - CMVR_UME_FIXED_MODEL_PATH); - (void)adapter; - FAIL() << "swapped fixed/floating models were accepted"; - } catch (const std::runtime_error& error) { - EXPECT_NE( - std::string(error.what()).find( - "UME fixed MJCF contract violation: " - "expected nq/nv/njoints 16/16/17"), - std::string::npos); - } -} - -} // namespace -} // namespace cmvr::ume_legacy diff --git a/cmvr-es/algorithms/controllers/ume_legacy/tests/ume_legacy_controller_golden_test.cpp b/cmvr-es/algorithms/controllers/ume_legacy/tests/ume_legacy_controller_golden_test.cpp deleted file mode 100644 index b5610c20..00000000 --- a/cmvr-es/algorithms/controllers/ume_legacy/tests/ume_legacy_controller_golden_test.cpp +++ /dev/null @@ -1,216 +0,0 @@ -#include "ume_legacy_controller.h" -#include "ume_legacy_model_adapter.h" - -#include -#include -#include -#include - -#include - -namespace cmvr::ume_legacy { -namespace { - -constexpr double kTolerance = 1e-12; - -void expectJointVectorNear( - const JointVector& actual, - const JointVector& expected, - double tolerance = kTolerance) -{ - for (std::size_t index = 0; index < kArmDof; ++index) { - EXPECT_NEAR(actual[index], expected[index], tolerance) - << "joint index " << index; - } -} - -TEST(UmeLegacyControllerGoldenTest, - OriginalTuningAndFrictionMatchPythonOracle) -{ - const auto tuning = originalTuning(); - EXPECT_DOUBLE_EQ(tuning.friction_coefficient[0], 1.6); - EXPECT_DOUBLE_EQ(tuning.friction_coefficient[4], 0.032); - EXPECT_DOUBLE_EQ(tuning.feedback_limit_dm4340_nm, 4.0); - EXPECT_DOUBLE_EQ(tuning.feedback_limit_dm4310_nm, 1.0); - - const JointVector velocity{ - -1.0, -0.1, 0.0, 2.0 * std::acos(-1.0) / 180.0, - -10.0, -1.0, 1.0, 10.0}; - const JointVector expected{ - -0.4, -0.16000000000000003, 0.0, - 0.055850536063818547, - -0.1, -0.032, 0.032, 0.1}; - - expectJointVectorNear( - frictionCompensation(velocity, tuning), - expected); -} - -TEST(UmeLegacyControllerGoldenTest, - StictionUsesStrictLegacyThresholds) -{ - const auto tuning = originalTuning(); - const double minimum = - tuning.stiction_threshold_min_rad_s[0]; - const double maximum = - tuning.stiction_threshold_max_rad_s[0]; - const JointVector at_threshold{ - minimum, - -minimum, - maximum, - -maximum, - 0.0, 0.0, 0.0, 0.0}; - expectJointVectorNear( - stictionCompensation(at_threshold, tuning), - JointVector{}); - - const JointVector strictly_inside{ - 2.0 * minimum, - -2.0 * minimum, - std::nextafter( - minimum, std::numeric_limits::infinity()), - std::nextafter(maximum, 0.0), - 2.0 * minimum, - -2.0 * minimum, - std::nextafter( - minimum, std::numeric_limits::infinity()), - std::nextafter(maximum, 0.0)}; - expectJointVectorNear( - stictionCompensation(strictly_inside, tuning), - {0.5, -0.5, 0.5, 0.5, - 0.0, 0.0, 0.0, 0.0}); -} - -TEST(UmeLegacyControllerGoldenTest, - FeedbackScaleMatchesLegacyNormAndTanhGoldenValues) -{ - const auto tuning = originalTuning(); - EXPECT_NEAR( - feedbackScale(0.0, tuning), - 0.20680448412090907, - kTolerance); - EXPECT_DOUBLE_EQ( - feedbackScale(tuning.feedback_error_tolerance_rad, tuning), - 0.25); - EXPECT_NEAR( - feedbackScale(0.05, tuning), - 0.32861047013244982, - kTolerance); - EXPECT_NEAR( - feedbackScale(-0.2, tuning), - 0.48734517579834447, - kTolerance); -} - -TEST(UmeLegacyControllerGoldenTest, - CompleteRightSideCommandMatchesPythonGoldenVector) -{ - SideControlInput input; - input.side = ArmSide::Right; - input.joint_velocity_rad_s = { - -1.0, -0.1, 0.0, 2.0 * std::acos(-1.0) / 180.0, - -10.0, -1.0, 1.0, 10.0}; - input.gravity_compensation_nm = - {0.5, -0.5, 1.0, -1.0, - 0.25, -0.25, 0.75, -0.75}; - input.projected_haptic.shoulder_joint_torque = - {1.2, -3.0, 10.0}; - input.projected_haptic.elbow_effort = 2.0; - input.projected_haptic.wrist_joint_torque = - {0.5, -2.0, 5.0}; - input.projected_haptic.gripper_effort = 3.0; - input.tracking_error.shoulder_rotation = {0.0, 0.0, 0.0}; - input.tracking_error.elbow = - originalTuning().feedback_error_tolerance_rad; - input.tracking_error.wrist_rotation = {0.03, 0.04, 0.0}; - input.tracking_error.gripper = -0.2; - - const auto output = computeSideCommand(input); - - expectJointVectorNear( - output.friction_compensation_nm, - {-0.4, -0.16000000000000003, 0.0, - 0.055850536063818547, - -0.1, -0.032, 0.032, 0.1}); - expectJointVectorNear( - output.stiction_compensation_nm, - {0.0, -0.5, 0.0, 0.5, - 0.0, 0.0, 0.0, 0.0}); - expectJointVectorNear( - output.feedforward_without_haptic_nm, - {0.099999999999999978, -1.1600000000000001, - 1.0, -0.44414946393618149, - 0.14999999999999999, -0.28200000000000003, - 0.78200000000000003, -0.65000000000000002}); - expectJointVectorNear( - output.signed_interaction_nm, - {1.2, -3.0, 10.0, 2.0, - 0.5, -2.0, 5.0, -3.0}); - expectJointVectorNear( - output.limited_feedback_nm, - {0.24816538094509089, -0.62041345236272716, - 2.0680448412090908, 0.5, - 0.16430523506622491, -0.65722094026489963, - 1.0, -1.0}); - expectJointVectorNear( - output.command_torque_nm, - {-0.14816538094509091, -0.53958654763727298, - -1.0680448412090908, -0.94414946393618149, - -0.014305235066224914, 0.37522094026489961, - -0.21799999999999997, 0.34999999999999998}); -} - -TEST(UmeLegacyControllerGoldenTest, - LeftAndRightScalarSignsAndGroupLimitsArePreserved) -{ - SideControlInput input; - input.projected_haptic.shoulder_joint_torque = - {100.0, -100.0, 100.0}; - input.projected_haptic.elbow_effort = 100.0; - input.projected_haptic.wrist_joint_torque = - {100.0, -100.0, 100.0}; - input.projected_haptic.gripper_effort = 100.0; - input.tracking_error.shoulder_rotation = {10.0, 0.0, 0.0}; - input.tracking_error.elbow = 10.0; - input.tracking_error.wrist_rotation = {10.0, 0.0, 0.0}; - input.tracking_error.gripper = 10.0; - - input.side = ArmSide::Right; - const auto right = computeSideCommand(input); - expectJointVectorNear( - right.signed_interaction_nm, - {100.0, -100.0, 100.0, 100.0, - 100.0, -100.0, 100.0, -100.0}); - expectJointVectorNear( - right.command_torque_nm, - {-4.0, 4.0, -4.0, -4.0, - -1.0, 1.0, -1.0, 1.0}); - - input.side = ArmSide::Left; - const auto left = computeSideCommand(input); - expectJointVectorNear( - left.signed_interaction_nm, - {100.0, -100.0, 100.0, -100.0, - 100.0, -100.0, 100.0, 100.0}); - expectJointVectorNear( - left.command_torque_nm, - {-4.0, 4.0, -4.0, 4.0, - -1.0, 1.0, -1.0, -1.0}); -} - -TEST(UmeLegacyControllerGoldenTest, - FeedbackClipDoesNotClampOtherFeedforwardTerms) -{ - SideControlInput input; - input.gravity_compensation_nm = - {50.0, -50.0, 0.0, 0.0, 0.0, 0.0, 20.0, -20.0}; - const auto output = computeSideCommand(input); - - EXPECT_DOUBLE_EQ(output.command_torque_nm[0], 50.0); - EXPECT_DOUBLE_EQ(output.command_torque_nm[1], -50.0); - EXPECT_DOUBLE_EQ(output.command_torque_nm[6], 20.0); - EXPECT_DOUBLE_EQ(output.command_torque_nm[7], -20.0); -} - -} // namespace -} // namespace cmvr::ume_legacy diff --git a/cmvr-es/common/CMakeLists.txt b/cmvr-es/common/CMakeLists.txt index 3bedb230..b34192ff 100644 --- a/cmvr-es/common/CMakeLists.txt +++ b/cmvr-es/common/CMakeLists.txt @@ -28,20 +28,3 @@ target_link_libraries(common PUBLIC add_library(cmvr_es::common ALIAS common) install(TARGETS common LIBRARY DESTINATION lib) - -#add_executable(image_display_test -# utils/visualization/image_display_test.cpp -#) -# -#target_link_libraries(image_display_test -# PRIVATE -# cmvr_es::common -# cmvr_es::perception -# cmvr_es::device::realsense_camera -# cmvr_es::proto -# glog -# gtest -# gtest_main -# pthread -#) -# diff --git a/cmvr-es/common/base/logging/CMakeLists.txt b/cmvr-es/common/base/logging/CMakeLists.txt index 5322a2e5..c6c31e5c 100644 --- a/cmvr-es/common/base/logging/CMakeLists.txt +++ b/cmvr-es/common/base/logging/CMakeLists.txt @@ -13,26 +13,3 @@ target_link_libraries(logging PUBLIC add_library(cmvr_es::logging ALIAS logging) install(TARGETS logging ARCHIVE DESTINATION lib) - -if(BUILD_TESTING) - add_executable(logger_test - tests/logger_test.cpp - ) - target_link_libraries(logger_test PRIVATE - cmvr_es::logging - gtest - gtest_main - pthread - ) - add_test(NAME logger_test COMMAND logger_test) - set(_logger_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}") - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _logger_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(logger_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_logger_test_environment}" - ) -endif() diff --git a/cmvr-es/common/base/logging/tests/logger_test.cpp b/cmvr-es/common/base/logging/tests/logger_test.cpp deleted file mode 100644 index cc0aef19..00000000 --- a/cmvr-es/common/base/logging/tests/logger_test.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "common/base/logging/logger.h" - -#include -#include -#include -#include -#include -#include - -#include -#include - -namespace cmvr::logging { -namespace { - -class LoggerTest : public testing::Test { -protected: - void SetUp() override - { - std::array pattern{}; - const std::string value = "/tmp/cmvr-logger-test-XXXXXX"; - std::copy(value.begin(), value.end(), pattern.begin()); - if (char* created = ::mkdtemp(pattern.data())) { - directory_ = created; - } - ASSERT_FALSE(directory_.empty()); - } - - void TearDown() override - { - shutdownLogging(); - std::error_code error; - std::filesystem::remove_all(directory_, error); - } - - config::LoggerConfig warningFileConfig() const - { - config::LoggerConfig config; - config.set_minimum_level(config::LOG_LEVEL_DEBUG); - config.set_directory(directory_.string()); - config.set_flush_interval_seconds(3600); - auto* route = config.add_routes(); - route->set_level(config::LOG_LEVEL_WARNING); - route->set_terminal(false); - route->set_file(true); - return config; - } - - std::string fileContents() const - { - std::ifstream input(directory_ / "logger_test.log"); - return {std::istreambuf_iterator(input), - std::istreambuf_iterator()}; - } - - std::filesystem::path directory_; -}; - -TEST_F(LoggerTest, ExplicitFlushMakesWarningVisibleInFile) -{ - ASSERT_TRUE(initLogging( - warningFileConfig(), "logger_test", directory_)); - - Logger::instance().write( - Level::WARNING, __FILE__, __LINE__, "warning sentinel"); - Logger::instance().flush(); - - EXPECT_NE(fileContents().find("warning sentinel"), std::string::npos); -} - -TEST_F(LoggerTest, ErrorIsVisibleInFileImmediately) -{ - auto config = warningFileConfig(); - config.mutable_routes(0)->set_level(config::LOG_LEVEL_ERROR); - ASSERT_TRUE(initLogging(config, "logger_test", directory_)); - - Logger::instance().write( - Level::ERROR, __FILE__, __LINE__, "error sentinel"); - - EXPECT_NE(fileContents().find("error sentinel"), std::string::npos); -} - -TEST_F(LoggerTest, FlushIsSafeOutsideInitializedLifetime) -{ - Logger::instance().flush(); - ASSERT_TRUE(initLogging( - warningFileConfig(), "logger_test", directory_)); - shutdownLogging(); - Logger::instance().flush(); -} - -} // namespace -} // namespace cmvr::logging diff --git a/cmvr-es/common/vision/image_display.h b/cmvr-es/common/vision/image_display.h deleted file mode 100644 index 67b3f781..00000000 --- a/cmvr-es/common/vision/image_display.h +++ /dev/null @@ -1,609 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include -#include -#include - -namespace cmvr::common { - -/** - * @brief 图像像素坐标。 - * - * 坐标系约定: - * - `u`:图像列坐标,向右为正,单位像素。 - * - `v`:图像行坐标,向下为正,单位像素。 - */ -struct Pixel { - int u{0}; // 图像像素列坐标,单位像素。 - int v{0}; // 图像像素行坐标,单位像素。 -}; - -/** - * @brief BGR 颜色定义。 - */ -struct Color { - uint8_t b{0}; // 蓝色通道,范围 [0, 255]。 - uint8_t g{255}; // 绿色通道,范围 [0, 255]。 - uint8_t r{0}; // 红色通道,范围 [0, 255]。 - - /** - * @brief 转为 OpenCV 的 `cv::Scalar`。 - */ - cv::Scalar toCvScalar() const { - return cv::Scalar(static_cast(b), - static_cast(g), - static_cast(r)); - } - - /** - * @brief 预定义红色。 - */ - static Color red() { return Color{0, 0, 255}; } - - /** - * @brief 预定义绿色。 - */ - static Color green() { return Color{0, 255, 0}; } - - /** - * @brief 预定义蓝色。 - */ - static Color blue() { return Color{255, 0, 0}; } - - /** - * @brief 预定义黄色。 - */ - static Color yellow() { return Color{0, 255, 255}; } - - /** - * @brief 预定义白色。 - */ - static Color white() { return Color{255, 255, 255}; } - - /** - * @brief 预定义黑色。 - */ - static Color black() { return Color{0, 0, 0}; } -}; - -/** - * @brief 图像上的文本叠加配置。 - */ -struct TextOverlay { - std::string text; // 需要显示的字符串内容。 - Pixel position_px{}; // 文本左下角在图像像素坐标系中的位置。 - Color color{Color::green()}; // 文本颜色。 - double font_scale{0.7}; // OpenCV 字体缩放系数。 - int thickness{2}; // 文本线宽,单位像素。 - int font_face{cv::FONT_HERSHEY_SIMPLEX}; // OpenCV 字体类型。 - bool draw_background{false}; // 是否绘制文本背景框。 - Color background_color{Color::black()}; // 文本背景框颜色。 - int background_padding_px{2}; // 文本背景框四周留白,单位像素。 -}; - -/** - * @brief 图像上的点叠加配置。 - */ -struct PointOverlay { - Pixel position_px{}; // 点中心在图像像素坐标系中的位置。 - Color color{Color::red()}; // 点颜色。 - int radius_px{5}; // 圆点半径,单位像素。 - int thickness{2}; // 线宽,`-1` 表示填充。 - std::string label; // 点旁边附带显示的字符串;为空时不显示。 - Pixel label_offset_px{8, -8}; // 标签相对点中心的像素偏移。 - double label_font_scale{0.6}; // 点标签字体缩放系数。 - int label_thickness{2}; // 点标签线宽,单位像素。 -}; - -/** - * @brief 图像上的圆圈叠加配置。 - */ -struct CircleOverlay { - Pixel center_px{}; // 圆心在图像像素坐标系中的位置。 - int radius_px{10}; // 圆半径,单位像素。 - Color color{Color::yellow()}; // 圆圈颜色。 - int thickness{2}; // 圆圈线宽,单位像素,`-1` 表示填充。 -}; - -/** - * @brief 图像上的十字叠加配置。 - */ -struct CrossOverlay { - Pixel center_px{}; // 十字中心在图像像素坐标系中的位置。 - int arm_length_px{8}; // 单侧十字臂长度,单位像素。 - Color color{Color::blue()}; // 十字颜色。 - int thickness{2}; // 十字线宽,单位像素。 -}; - -/** - * @brief 通用图像叠加显示接口。 - * - * 该接口不依赖任何感知或跟踪类,只抽象三类输入: - * - 待显示的图像数据; - * - 文本叠加项; - * - 点叠加项。 - */ -class ImageDisplay { -public: - virtual ~ImageDisplay() = default; - - /** - * @brief 设置窗口名称。 - * @param window_name 显示窗口名称。 - */ - virtual void setWindowName(const std::string& window_name) = 0; - - /** - * @brief 设置待显示的图像。 - * @param image 输入图像,支持灰度图、BGR 图或 BGRA 图。 - */ - virtual void setImage(const cv::Mat& image) = 0; - - /** - * @brief 清空所有叠加项,但保留当前图像。 - */ - virtual void clearOverlays() = 0; - - /** - * @brief 添加文本叠加项。 - * @param overlay 文本叠加配置。 - */ - virtual void showText(const TextOverlay& overlay) = 0; - - /** - * @brief 按位置、字符串、颜色和大小直接添加文本。 - * @param text 需要显示的字符串内容。 - * @param position_px 文本左下角在图像像素坐标系中的位置。 - * @param color 文本颜色。 - * @param font_scale OpenCV 字体缩放系数。 - * @param thickness 文本线宽,单位像素。 - */ - virtual void showText(const std::string& text, - const Pixel& position_px, - const Color& color, - double font_scale = 0.7, - int thickness = 2) = 0; - - /** - * @brief 添加点叠加项。 - * @param overlay 点叠加配置。 - */ - virtual void showPoint(const PointOverlay& overlay) = 0; - - /** - * @brief 按位置、颜色和大小直接添加点。 - * @param position_px 点中心在图像像素坐标系中的位置。 - * @param color 点颜色。 - * @param radius_px 圆点半径,单位像素。 - * @param thickness 线宽,`-1` 表示填充。 - * @param label 点旁边附带显示的字符串;为空时不显示。 - */ - virtual void showPoint(const Pixel& position_px, - const Color& color, - int radius_px = 5, - int thickness = 2, - const std::string& label = {}) = 0; - - /** - * @brief 显示圆圈叠加项。 - * @param overlay 圆圈叠加配置。 - */ - virtual void showCircle(const CircleOverlay& overlay) = 0; - - /** - * @brief 按位置、半径、颜色和线宽直接显示圆圈。 - * @param center_px 圆心在图像像素坐标系中的位置。 - * @param radius_px 圆半径,单位像素。 - * @param color 圆圈颜色。 - * @param thickness 圆圈线宽,单位像素,`-1` 表示填充。 - */ - virtual void showCircle(const Pixel& center_px, - int radius_px, - const Color& color, - int thickness = 2) = 0; - - /** - * @brief 显示十字叠加项。 - * @param overlay 十字叠加配置。 - */ - virtual void showCross(const CrossOverlay& overlay) = 0; - - /** - * @brief 按位置、尺寸、颜色和线宽直接显示十字。 - * @param center_px 十字中心在图像像素坐标系中的位置。 - * @param arm_length_px 单侧十字臂长度,单位像素。 - * @param color 十字颜色。 - * @param thickness 十字线宽,单位像素。 - */ - virtual void showCross(const Pixel& center_px, - int arm_length_px, - const Color& color, - int thickness = 2) = 0; - - /** - * @brief 判断当前是否已有待显示图像。 - */ - virtual bool hasImage() const = 0; - - /** - * @brief 将当前图像和叠加项渲染到输出图像。 - * @param rendered_image 输出的渲染结果图像,BGR 三通道。 - * @return 渲染成功返回 `true`。 - */ - virtual bool render(cv::Mat& rendered_image) const = 0; - - /** - * @brief 显示当前渲染结果。 - * @param wait_key_ms `cv::waitKey` 等待时间,单位毫秒。 - * @return 返回 `cv::waitKey` 的按键值;若没有可显示图像则返回 `-1`。 - */ - virtual int show(int wait_key_ms = 1) = 0; - - /** - * @brief 关闭显示窗口。 - */ - virtual void close() = 0; -}; - -/** - * @brief 基于 OpenCV HighGUI 的图像叠加显示实现。 - */ -class OpenCvImageCvDisplay final : public ImageDisplay { -public: - /** - * @brief 构造显示器。 - * @param window_name 显示窗口名称。 - */ - explicit OpenCvImageCvDisplay(std::string window_name = "image_overlay") - : window_name_(std::move(window_name)) {} - - /** - * @brief 设置窗口名称。 - * @param window_name 显示窗口名称。 - */ - void setWindowName(const std::string& window_name) override { - window_name_ = window_name; - } - - /** - * @brief 设置待显示图像。 - * @param image 输入图像,支持灰度图、BGR 图或 BGRA 图。 - */ - void setImage(const cv::Mat& image) override { - image_ = image.clone(); - } - - /** - * @brief 清空所有叠加项,但保留当前图像。 - */ - void clearOverlays() override { - texts_.clear(); - points_.clear(); - circles_.clear(); - crosses_.clear(); - } - - /** - * @brief 添加文本叠加项。 - * @param overlay 文本叠加配置。 - */ - void showText(const TextOverlay& overlay) override { - texts_.push_back(overlay); - } - - /** - * @brief 按位置、字符串、颜色和大小直接添加文本。 - * @param text 需要显示的字符串内容。 - * @param position_px 文本左下角在图像像素坐标系中的位置。 - * @param color 文本颜色。 - * @param font_scale OpenCV 字体缩放系数。 - * @param thickness 文本线宽,单位像素。 - */ - void showText(const std::string& text, - const Pixel& position_px, - const Color& color, - double font_scale = 0.7, - int thickness = 2) override { - TextOverlay overlay; - overlay.text = text; - overlay.position_px = position_px; - overlay.color = color; - overlay.font_scale = font_scale; - overlay.thickness = thickness; - showText(overlay); - } - - /** - * @brief 添加点叠加项。 - * @param overlay 点叠加配置。 - */ - void showPoint(const PointOverlay& overlay) override { - points_.push_back(overlay); - } - - /** - * @brief 按位置、颜色和大小直接添加点。 - * @param position_px 点中心在图像像素坐标系中的位置。 - * @param color 点颜色。 - * @param radius_px 圆点半径,单位像素。 - * @param thickness 线宽,`-1` 表示填充。 - * @param label 点旁边附带显示的字符串;为空时不显示。 - */ - void showPoint(const Pixel& position_px, - const Color& color, - int radius_px = 5, - int thickness = 2, - const std::string& label = {}) override { - PointOverlay overlay; - overlay.position_px = position_px; - overlay.color = color; - overlay.radius_px = radius_px; - overlay.thickness = thickness; - overlay.label = label; - showPoint(overlay); - } - - /** - * @brief 显示圆圈叠加项。 - * @param overlay 圆圈叠加配置。 - */ - void showCircle(const CircleOverlay& overlay) override { - circles_.push_back(overlay); - } - - /** - * @brief 按位置、半径、颜色和线宽直接显示圆圈。 - * @param center_px 圆心在图像像素坐标系中的位置。 - * @param radius_px 圆半径,单位像素。 - * @param color 圆圈颜色。 - * @param thickness 圆圈线宽,单位像素,`-1` 表示填充。 - */ - void showCircle(const Pixel& center_px, - int radius_px, - const Color& color, - int thickness = 2) override { - CircleOverlay overlay; - overlay.center_px = center_px; - overlay.radius_px = radius_px; - overlay.color = color; - overlay.thickness = thickness; - showCircle(overlay); - } - - /** - * @brief 显示十字叠加项。 - * @param overlay 十字叠加配置。 - */ - void showCross(const CrossOverlay& overlay) override { - crosses_.push_back(overlay); - } - - /** - * @brief 按位置、尺寸、颜色和线宽直接显示十字。 - * @param center_px 十字中心在图像像素坐标系中的位置。 - * @param arm_length_px 单侧十字臂长度,单位像素。 - * @param color 十字颜色。 - * @param thickness 十字线宽,单位像素。 - */ - void showCross(const Pixel& center_px, - int arm_length_px, - const Color& color, - int thickness = 2) override { - CrossOverlay overlay; - overlay.center_px = center_px; - overlay.arm_length_px = arm_length_px; - overlay.color = color; - overlay.thickness = thickness; - showCross(overlay); - } - - /** - * @brief 判断当前是否已有待显示图像。 - */ - bool hasImage() const override { - return !image_.empty(); - } - - /** - * @brief 将当前图像和叠加项渲染到输出图像。 - * @param rendered_image 输出的渲染结果图像,BGR 三通道。 - * @return 渲染成功返回 `true`。 - */ - bool render(cv::Mat& rendered_image) const override { - if (!toBgrImage(image_, rendered_image)) { - return false; - } - - for (const CircleOverlay& overlay : circles_) { - drawCircle(rendered_image, overlay); - } - for (const CrossOverlay& overlay : crosses_) { - drawCross(rendered_image, overlay); - } - for (const PointOverlay& overlay : points_) { - drawPoint(rendered_image, overlay); - } - for (const TextOverlay& overlay : texts_) { - drawText(rendered_image, overlay); - } - return true; - } - - /** - * @brief 显示当前渲染结果。 - * @param wait_key_ms `cv::waitKey` 等待时间,单位毫秒。 - * @return 返回 `cv::waitKey` 的按键值;若没有可显示图像则返回 `-1`。 - */ - int show(int wait_key_ms = 1) override { - cv::Mat rendered_image; - if (!render(rendered_image)) { - return -1; - } - - if (!window_created_) { - cv::namedWindow(window_name_, cv::WINDOW_NORMAL); - window_created_ = true; - } - cv::imshow(window_name_, rendered_image); - return cv::waitKey(wait_key_ms); - } - - /** - * @brief 关闭显示窗口。 - */ - void close() override { - if (!window_created_) { - return; - } - cv::destroyWindow(window_name_); - window_created_ = false; - } - -private: - /** - * @brief 将输入图像转换为可叠加绘制的 BGR 三通道图像。 - * @param input 输入图像。 - * @param output 输出 BGR 图像。 - * @return 转换成功返回 `true`。 - */ - static bool toBgrImage(const cv::Mat& input, cv::Mat& output) { - if (input.empty()) { - return false; - } - - if (input.channels() == 1) { - cv::cvtColor(input, output, cv::COLOR_GRAY2BGR); - return true; - } - if (input.channels() == 3) { - output = input.clone(); - return true; - } - if (input.channels() == 4) { - cv::cvtColor(input, output, cv::COLOR_BGRA2BGR); - return true; - } - return false; - } - - /** - * @brief 在图像上绘制文本叠加项。 - * @param image 目标图像,BGR 三通道。 - * @param overlay 文本叠加配置。 - */ - static void drawText(cv::Mat& image, const TextOverlay& overlay) { - const cv::Point origin(overlay.position_px.u, overlay.position_px.v); - const int thickness = std::max(1, overlay.thickness); - const double font_scale = std::max(0.0, overlay.font_scale); - - if (overlay.draw_background) { - int baseline = 0; - const cv::Size text_size = cv::getTextSize(overlay.text, - overlay.font_face, - font_scale, - thickness, - &baseline); - const int pad = std::max(0, overlay.background_padding_px); - const cv::Point top_left(origin.x - pad, origin.y - text_size.height - pad); - const cv::Point bottom_right(origin.x + text_size.width + pad, origin.y + baseline + pad); - cv::rectangle(image, - top_left, - bottom_right, - overlay.background_color.toCvScalar(), - cv::FILLED); - } - - cv::putText(image, - overlay.text, - origin, - overlay.font_face, - font_scale, - overlay.color.toCvScalar(), - thickness, - cv::LINE_AA); - } - - /** - * @brief 在图像上绘制点叠加项。 - * @param image 目标图像,BGR 三通道。 - * @param overlay 点叠加配置。 - */ - static void drawPoint(cv::Mat& image, const PointOverlay& overlay) { - const cv::Point center(overlay.position_px.u, overlay.position_px.v); - const int radius = std::max(1, overlay.radius_px); - cv::circle(image, - center, - radius, - overlay.color.toCvScalar(), - overlay.thickness, - cv::LINE_AA); - - if (!overlay.label.empty()) { - TextOverlay label_overlay; - label_overlay.text = overlay.label; - label_overlay.position_px = Pixel{center.x + overlay.label_offset_px.u, - center.y + overlay.label_offset_px.v}; - label_overlay.color = overlay.color; - label_overlay.font_scale = overlay.label_font_scale; - label_overlay.thickness = overlay.label_thickness; - drawText(image, label_overlay); - } - } - - /** - * @brief 在图像上绘制圆圈叠加项。 - * @param image 目标图像,BGR 三通道。 - * @param overlay 圆圈叠加配置。 - */ - static void drawCircle(cv::Mat& image, const CircleOverlay& overlay) { - const cv::Point center(overlay.center_px.u, overlay.center_px.v); - const int radius = std::max(1, overlay.radius_px); - const int thickness = (overlay.thickness == 0) ? 1 : overlay.thickness; - cv::circle(image, - center, - radius, - overlay.color.toCvScalar(), - thickness, - cv::LINE_AA); - } - - /** - * @brief 在图像上绘制十字叠加项。 - * @param image 目标图像,BGR 三通道。 - * @param overlay 十字叠加配置。 - */ - static void drawCross(cv::Mat& image, const CrossOverlay& overlay) { - const cv::Point center(overlay.center_px.u, overlay.center_px.v); - const int arm_length = std::max(1, overlay.arm_length_px); - const int thickness = std::max(1, overlay.thickness); - const cv::Scalar color = overlay.color.toCvScalar(); - cv::line(image, - cv::Point(center.x - arm_length, center.y), - cv::Point(center.x + arm_length, center.y), - color, - thickness, - cv::LINE_AA); - cv::line(image, - cv::Point(center.x, center.y - arm_length), - cv::Point(center.x, center.y + arm_length), - color, - thickness, - cv::LINE_AA); - } - - std::string window_name_; // 显示窗口名称。 - cv::Mat image_; // 当前待显示图像。 - std::vector texts_; // 当前待绘制的文本叠加列表。 - std::vector points_; // 当前待绘制的点叠加列表。 - std::vector circles_; // 当前待绘制的圆圈叠加列表。 - std::vector crosses_; // 当前待绘制的十字叠加列表。 - bool window_created_{false}; // 显示窗口是否已经创建。 -}; - -} // namespace cmvr::common diff --git a/cmvr-es/common/vision/matplotlibcpp.h b/cmvr-es/common/vision/matplotlibcpp.h deleted file mode 100644 index 06735df4..00000000 --- a/cmvr-es/common/vision/matplotlibcpp.h +++ /dev/null @@ -1,2988 +0,0 @@ -#pragma once - -// Python headers must be included before any system headers, since -// they define _POSIX_C_SOURCE -#include - -#include -#include -#include -#include -#include -#include -#include -#include // requires c++11 support -#include -#include // std::stod - -#ifndef WITHOUT_NUMPY -# define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION -# include - -# ifdef WITH_OPENCV -# include -# endif // WITH_OPENCV - -/* - * A bunch of constants were removed in OpenCV 4 in favour of enum classes, so - * define the ones we need here. - */ -# if CV_MAJOR_VERSION > 3 -# define CV_BGR2RGB cv::COLOR_BGR2RGB -# define CV_BGRA2RGBA cv::COLOR_BGRA2RGBA -# endif -#endif // WITHOUT_NUMPY - -#if PY_MAJOR_VERSION >= 3 -# define PyString_FromString PyUnicode_FromString -# define PyInt_FromLong PyLong_FromLong -# define PyString_FromString PyUnicode_FromString -#endif - - -namespace matplotlibcpp { -namespace detail { - -static std::string s_backend; - -struct _interpreter { - PyObject* s_python_function_arrow; - PyObject *s_python_function_show; - PyObject *s_python_function_close; - PyObject *s_python_function_draw; - PyObject *s_python_function_pause; - PyObject *s_python_function_save; - PyObject *s_python_function_figure; - PyObject *s_python_function_fignum_exists; - PyObject *s_python_function_plot; - PyObject *s_python_function_quiver; - PyObject* s_python_function_contour; - PyObject *s_python_function_semilogx; - PyObject *s_python_function_semilogy; - PyObject *s_python_function_loglog; - PyObject *s_python_function_fill; - PyObject *s_python_function_fill_between; - PyObject *s_python_function_hist; - PyObject *s_python_function_imshow; - PyObject *s_python_function_scatter; - PyObject *s_python_function_boxplot; - PyObject *s_python_function_subplot; - PyObject *s_python_function_subplot2grid; - PyObject *s_python_function_legend; - PyObject *s_python_function_xlim; - PyObject *s_python_function_ion; - PyObject *s_python_function_ginput; - PyObject *s_python_function_ylim; - PyObject *s_python_function_title; - PyObject *s_python_function_axis; - PyObject *s_python_function_axhline; - PyObject *s_python_function_axvline; - PyObject *s_python_function_axvspan; - PyObject *s_python_function_xlabel; - PyObject *s_python_function_ylabel; - PyObject *s_python_function_gca; - PyObject *s_python_function_xticks; - PyObject *s_python_function_yticks; - PyObject* s_python_function_margins; - PyObject *s_python_function_tick_params; - PyObject *s_python_function_grid; - PyObject* s_python_function_cla; - PyObject *s_python_function_clf; - PyObject *s_python_function_errorbar; - PyObject *s_python_function_annotate; - PyObject *s_python_function_tight_layout; - PyObject *s_python_colormap; - PyObject *s_python_empty_tuple; - PyObject *s_python_function_stem; - PyObject *s_python_function_xkcd; - PyObject *s_python_function_text; - PyObject *s_python_function_suptitle; - PyObject *s_python_function_bar; - PyObject *s_python_function_barh; - PyObject *s_python_function_colorbar; - PyObject *s_python_function_subplots_adjust; - PyObject *s_python_function_rcparams; - PyObject *s_python_function_spy; - - /* For now, _interpreter is implemented as a singleton since its currently not possible to have - multiple independent embedded python interpreters without patching the python source code - or starting a separate process for each. [1] - Furthermore, many python objects expect that they are destructed in the same thread as they - were constructed. [2] So for advanced usage, a `kill()` function is provided so that library - users can manually ensure that the interpreter is constructed and destroyed within the - same thread. - - 1: http://bytes.com/topic/python/answers/793370-multiple-independent-python-interpreters-c-c-program - 2: https://github.com/lava/matplotlib-cpp/pull/202#issue-436220256 - */ - - static _interpreter& get() { - return interkeeper(false); - } - - static _interpreter& kill() { - return interkeeper(true); - } - - // Stores the actual singleton object referenced by `get()` and `kill()`. - static _interpreter& interkeeper(bool should_kill) { - static _interpreter ctx; - if (should_kill) - ctx.~_interpreter(); - return ctx; - } - - PyObject* safe_import(PyObject* module, std::string fname) { - PyObject* fn = PyObject_GetAttrString(module, fname.c_str()); - - if (!fn) - throw std::runtime_error(std::string("Couldn't find required function: ") + fname); - - if (!PyFunction_Check(fn)) - throw std::runtime_error(fname + std::string(" is unexpectedly not a PyFunction.")); - - return fn; - } - -private: - -#ifndef WITHOUT_NUMPY -# if PY_MAJOR_VERSION >= 3 - - void *import_numpy() { - import_array(); // initialize C-API - return NULL; - } - -# else - - void import_numpy() { - import_array(); // initialize C-API - } - -# endif -#endif - - _interpreter() { - - // optional but recommended -#if PY_MAJOR_VERSION >= 3 - wchar_t name[] = L"plotting"; -#else - char name[] = "plotting"; -#endif - Py_SetProgramName(name); - Py_Initialize(); - - wchar_t const *dummy_args[] = {L"Python", NULL}; // const is needed because literals must not be modified - wchar_t const **argv = dummy_args; - int argc = sizeof(dummy_args)/sizeof(dummy_args[0])-1; - -#if PY_MAJOR_VERSION >= 3 - PySys_SetArgv(argc, const_cast(argv)); -#else - PySys_SetArgv(argc, (char **)(argv)); -#endif - -#ifndef WITHOUT_NUMPY - import_numpy(); // initialize numpy C-API -#endif - - PyObject* matplotlibname = PyString_FromString("matplotlib"); - PyObject* pyplotname = PyString_FromString("matplotlib.pyplot"); - PyObject* cmname = PyString_FromString("matplotlib.cm"); - PyObject* pylabname = PyString_FromString("pylab"); - if (!pyplotname || !pylabname || !matplotlibname || !cmname) { - throw std::runtime_error("couldnt create string"); - } - - PyObject* matplotlib = PyImport_Import(matplotlibname); - - Py_DECREF(matplotlibname); - if (!matplotlib) { - PyErr_Print(); - throw std::runtime_error("Error loading module matplotlib!"); - } - - // matplotlib.use() must be called *before* pylab, matplotlib.pyplot, - // or matplotlib.backends is imported for the first time - if (!s_backend.empty()) { - PyObject_CallMethod(matplotlib, const_cast("use"), const_cast("s"), s_backend.c_str()); - } - - - - PyObject* pymod = PyImport_Import(pyplotname); - Py_DECREF(pyplotname); - if (!pymod) { throw std::runtime_error("Error loading module matplotlib.pyplot!"); } - - s_python_colormap = PyImport_Import(cmname); - Py_DECREF(cmname); - if (!s_python_colormap) { throw std::runtime_error("Error loading module matplotlib.cm!"); } - - PyObject* pylabmod = PyImport_Import(pylabname); - Py_DECREF(pylabname); - if (!pylabmod) { throw std::runtime_error("Error loading module pylab!"); } - - s_python_function_arrow = safe_import(pymod, "arrow"); - s_python_function_show = safe_import(pymod, "show"); - s_python_function_close = safe_import(pymod, "close"); - s_python_function_draw = safe_import(pymod, "draw"); - s_python_function_pause = safe_import(pymod, "pause"); - s_python_function_figure = safe_import(pymod, "figure"); - s_python_function_fignum_exists = safe_import(pymod, "fignum_exists"); - s_python_function_plot = safe_import(pymod, "plot"); - s_python_function_quiver = safe_import(pymod, "quiver"); - s_python_function_contour = safe_import(pymod, "contour"); - s_python_function_semilogx = safe_import(pymod, "semilogx"); - s_python_function_semilogy = safe_import(pymod, "semilogy"); - s_python_function_loglog = safe_import(pymod, "loglog"); - s_python_function_fill = safe_import(pymod, "fill"); - s_python_function_fill_between = safe_import(pymod, "fill_between"); - s_python_function_hist = safe_import(pymod,"hist"); - s_python_function_scatter = safe_import(pymod,"scatter"); - s_python_function_boxplot = safe_import(pymod,"boxplot"); - s_python_function_subplot = safe_import(pymod, "subplot"); - s_python_function_subplot2grid = safe_import(pymod, "subplot2grid"); - s_python_function_legend = safe_import(pymod, "legend"); - s_python_function_xlim = safe_import(pymod, "xlim"); - s_python_function_ylim = safe_import(pymod, "ylim"); - s_python_function_title = safe_import(pymod, "title"); - s_python_function_axis = safe_import(pymod, "axis"); - s_python_function_axhline = safe_import(pymod, "axhline"); - s_python_function_axvline = safe_import(pymod, "axvline"); - s_python_function_axvspan = safe_import(pymod, "axvspan"); - s_python_function_xlabel = safe_import(pymod, "xlabel"); - s_python_function_ylabel = safe_import(pymod, "ylabel"); - s_python_function_gca = safe_import(pymod, "gca"); - s_python_function_xticks = safe_import(pymod, "xticks"); - s_python_function_yticks = safe_import(pymod, "yticks"); - s_python_function_margins = safe_import(pymod, "margins"); - s_python_function_tick_params = safe_import(pymod, "tick_params"); - s_python_function_grid = safe_import(pymod, "grid"); - s_python_function_ion = safe_import(pymod, "ion"); - s_python_function_ginput = safe_import(pymod, "ginput"); - s_python_function_save = safe_import(pylabmod, "savefig"); - s_python_function_annotate = safe_import(pymod,"annotate"); - s_python_function_cla = safe_import(pymod, "cla"); - s_python_function_clf = safe_import(pymod, "clf"); - s_python_function_errorbar = safe_import(pymod, "errorbar"); - s_python_function_tight_layout = safe_import(pymod, "tight_layout"); - s_python_function_stem = safe_import(pymod, "stem"); - s_python_function_xkcd = safe_import(pymod, "xkcd"); - s_python_function_text = safe_import(pymod, "text"); - s_python_function_suptitle = safe_import(pymod, "suptitle"); - s_python_function_bar = safe_import(pymod,"bar"); - s_python_function_barh = safe_import(pymod, "barh"); - s_python_function_colorbar = PyObject_GetAttrString(pymod, "colorbar"); - s_python_function_subplots_adjust = safe_import(pymod,"subplots_adjust"); - s_python_function_rcparams = PyObject_GetAttrString(pymod, "rcParams"); - s_python_function_spy = PyObject_GetAttrString(pymod, "spy"); -#ifndef WITHOUT_NUMPY - s_python_function_imshow = safe_import(pymod, "imshow"); -#endif - s_python_empty_tuple = PyTuple_New(0); - } - - ~_interpreter() { - Py_Finalize(); - } -}; - -} // end namespace detail - -/// Select the backend -/// -/// **NOTE:** This must be called before the first plot command to have -/// any effect. -/// -/// Mainly useful to select the non-interactive 'Agg' backend when running -/// matplotlibcpp in headless mode, for example on a machine with no display. -/// -/// See also: https://matplotlib.org/2.0.2/api/matplotlib_configuration_api.html#matplotlib.use -inline void backend(const std::string& name) -{ - detail::s_backend = name; -} - -inline bool annotate(std::string annotation, double x, double y) -{ - detail::_interpreter::get(); - - PyObject * xy = PyTuple_New(2); - PyObject * str = PyString_FromString(annotation.c_str()); - - PyTuple_SetItem(xy,0,PyFloat_FromDouble(x)); - PyTuple_SetItem(xy,1,PyFloat_FromDouble(y)); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "xy", xy); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, str); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_annotate, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); - - return res; -} - -namespace detail { - -#ifndef WITHOUT_NUMPY -// Type selector for numpy array conversion -template struct select_npy_type { const static NPY_TYPES type = NPY_NOTYPE; }; //Default -template <> struct select_npy_type { const static NPY_TYPES type = NPY_DOUBLE; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_FLOAT; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_BOOL; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT8; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_SHORT; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT64; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_UINT8; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_USHORT; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_ULONG; }; -template <> struct select_npy_type { const static NPY_TYPES type = NPY_UINT64; }; - -// Sanity checks; comment them out or change the numpy type below if you're compiling on -// a platform where they don't apply -static_assert(sizeof(long long) == 8); -template <> struct select_npy_type { const static NPY_TYPES type = NPY_INT64; }; -static_assert(sizeof(unsigned long long) == 8); -template <> struct select_npy_type { const static NPY_TYPES type = NPY_UINT64; }; - -template -PyObject* get_array(const std::vector& v) -{ - npy_intp vsize = v.size(); - NPY_TYPES type = select_npy_type::type; - if (type == NPY_NOTYPE) { - size_t memsize = v.size()*sizeof(double); - double* dp = static_cast(::malloc(memsize)); - for (size_t i=0; i(varray), NPY_ARRAY_OWNDATA); - return varray; - } - - PyObject* varray = PyArray_SimpleNewFromData(1, &vsize, type, (void*)(v.data())); - return varray; -} - - -template -PyObject* get_2darray(const std::vector<::std::vector>& v) -{ - if (v.size() < 1) throw std::runtime_error("get_2d_array v too small"); - - npy_intp vsize[2] = {static_cast(v.size()), - static_cast(v[0].size())}; - - PyArrayObject *varray = - (PyArrayObject *)PyArray_SimpleNew(2, vsize, NPY_DOUBLE); - - double *vd_begin = static_cast(PyArray_DATA(varray)); - - for (const ::std::vector &v_row : v) { - if (v_row.size() != static_cast(vsize[1])) - throw std::runtime_error("Missmatched array size"); - std::copy(v_row.begin(), v_row.end(), vd_begin); - vd_begin += vsize[1]; - } - - return reinterpret_cast(varray); -} - -#else // fallback if we don't have numpy: copy every element of the given vector - -template -PyObject* get_array(const std::vector& v) -{ - PyObject* list = PyList_New(v.size()); - for(size_t i = 0; i < v.size(); ++i) { - PyList_SetItem(list, i, PyFloat_FromDouble(v.at(i))); - } - return list; -} - -#endif // WITHOUT_NUMPY - -// sometimes, for labels and such, we need string arrays -inline PyObject * get_array(const std::vector& strings) -{ - PyObject* list = PyList_New(strings.size()); - for (std::size_t i = 0; i < strings.size(); ++i) { - PyList_SetItem(list, i, PyString_FromString(strings[i].c_str())); - } - return list; -} - -// not all matplotlib need 2d arrays, some prefer lists of lists -template -PyObject* get_listlist(const std::vector>& ll) -{ - PyObject* listlist = PyList_New(ll.size()); - for (std::size_t i = 0; i < ll.size(); ++i) { - PyList_SetItem(listlist, i, get_array(ll[i])); - } - return listlist; -} - -} // namespace detail - -/// Plot a line through the given x and y data points.. -/// -/// See: https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.plot.html -template -bool plot(const std::vector &x, const std::vector &y, const std::map& keywords) -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - // using numpy arrays - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - // construct positional args - PyObject* args = PyTuple_New(2); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -// TODO - it should be possible to make this work by implementing -// a non-numpy alternative for `detail::get_2darray()`. -#ifndef WITHOUT_NUMPY -template -void plot_surface(const std::vector<::std::vector> &x, - const std::vector<::std::vector> &y, - const std::vector<::std::vector> &z, - const std::map &keywords = - std::map(), - const long fig_number=0) -{ - detail::_interpreter::get(); - - // We lazily load the modules here the first time this function is called - // because I'm not sure that we can assume "matplotlib installed" implies - // "mpl_toolkits installed" on all platforms, and we don't want to require - // it for people who don't need 3d plots. - static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; - if (!mpl_toolkitsmod) { - detail::_interpreter::get(); - - PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); - PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); - if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } - - mpl_toolkitsmod = PyImport_Import(mpl_toolkits); - Py_DECREF(mpl_toolkits); - if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } - - axis3dmod = PyImport_Import(axis3d); - Py_DECREF(axis3d); - if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } - } - - assert(x.size() == y.size()); - assert(y.size() == z.size()); - - // using numpy arrays - PyObject *xarray = detail::get_2darray(x); - PyObject *yarray = detail::get_2darray(y); - PyObject *zarray = detail::get_2darray(z); - - // construct positional args - PyObject *args = PyTuple_New(3); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - PyTuple_SetItem(args, 2, zarray); - - // Build up the kw args. - PyObject *kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "rstride", PyInt_FromLong(1)); - PyDict_SetItemString(kwargs, "cstride", PyInt_FromLong(1)); - - PyObject *python_colormap_coolwarm = PyObject_GetAttrString( - detail::_interpreter::get().s_python_colormap, "coolwarm"); - - PyDict_SetItemString(kwargs, "cmap", python_colormap_coolwarm); - - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - if (it->first == "linewidth" || it->first == "alpha") { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyFloat_FromDouble(std::stod(it->second))); - } else { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - } - - PyObject *fig_args = PyTuple_New(1); - PyObject* fig = nullptr; - PyTuple_SetItem(fig_args, 0, PyLong_FromLong(fig_number)); - PyObject *fig_exists = - PyObject_CallObject( - detail::_interpreter::get().s_python_function_fignum_exists, fig_args); - if (!PyObject_IsTrue(fig_exists)) { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - detail::_interpreter::get().s_python_empty_tuple); - } else { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - fig_args); - } - Py_DECREF(fig_exists); - if (!fig) throw std::runtime_error("Call to figure() failed."); - - PyObject *gca_kwargs = PyDict_New(); - PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("3d")); - - PyObject *gca = PyObject_GetAttrString(fig, "gca"); - if (!gca) throw std::runtime_error("No gca"); - Py_INCREF(gca); - PyObject *axis = PyObject_Call( - gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); - - if (!axis) throw std::runtime_error("No axis"); - Py_INCREF(axis); - - Py_DECREF(gca); - Py_DECREF(gca_kwargs); - - PyObject *plot_surface = PyObject_GetAttrString(axis, "plot_surface"); - if (!plot_surface) throw std::runtime_error("No surface"); - Py_INCREF(plot_surface); - PyObject *res = PyObject_Call(plot_surface, args, kwargs); - if (!res) throw std::runtime_error("failed surface"); - Py_DECREF(plot_surface); - - Py_DECREF(axis); - Py_DECREF(args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); -} - -template -void contour(const std::vector<::std::vector> &x, - const std::vector<::std::vector> &y, - const std::vector<::std::vector> &z, - const std::map &keywords = {}) -{ - detail::_interpreter::get(); - - // using numpy arrays - PyObject *xarray = detail::get_2darray(x); - PyObject *yarray = detail::get_2darray(y); - PyObject *zarray = detail::get_2darray(z); - - // construct positional args - PyObject *args = PyTuple_New(3); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - PyTuple_SetItem(args, 2, zarray); - - // Build up the kw args. - PyObject *kwargs = PyDict_New(); - - PyObject *python_colormap_coolwarm = PyObject_GetAttrString( - detail::_interpreter::get().s_python_colormap, "coolwarm"); - - PyDict_SetItemString(kwargs, "cmap", python_colormap_coolwarm); - - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - - PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_contour, args, kwargs); - if (!res) - throw std::runtime_error("failed contour"); - - Py_DECREF(args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); -} - -template -void spy(const std::vector<::std::vector> &x, - const double markersize = -1, // -1 for default matplotlib size - const std::map &keywords = {}) -{ - detail::_interpreter::get(); - - PyObject *xarray = detail::get_2darray(x); - - PyObject *kwargs = PyDict_New(); - if (markersize != -1) { - PyDict_SetItemString(kwargs, "markersize", PyFloat_FromDouble(markersize)); - } - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - - PyObject *plot_args = PyTuple_New(1); - PyTuple_SetItem(plot_args, 0, xarray); - - PyObject *res = PyObject_Call( - detail::_interpreter::get().s_python_function_spy, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); -} -#endif // WITHOUT_NUMPY - -template -void plot3(const std::vector &x, - const std::vector &y, - const std::vector &z, - const std::map &keywords = - std::map(), - const long fig_number=0) -{ - detail::_interpreter::get(); - - // Same as with plot_surface: We lazily load the modules here the first time - // this function is called because I'm not sure that we can assume "matplotlib - // installed" implies "mpl_toolkits installed" on all platforms, and we don't - // want to require it for people who don't need 3d plots. - static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; - if (!mpl_toolkitsmod) { - detail::_interpreter::get(); - - PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); - PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); - if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } - - mpl_toolkitsmod = PyImport_Import(mpl_toolkits); - Py_DECREF(mpl_toolkits); - if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } - - axis3dmod = PyImport_Import(axis3d); - Py_DECREF(axis3d); - if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } - } - - assert(x.size() == y.size()); - assert(y.size() == z.size()); - - PyObject *xarray = detail::get_array(x); - PyObject *yarray = detail::get_array(y); - PyObject *zarray = detail::get_array(z); - - // construct positional args - PyObject *args = PyTuple_New(3); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - PyTuple_SetItem(args, 2, zarray); - - // Build up the kw args. - PyObject *kwargs = PyDict_New(); - - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - - PyObject *fig_args = PyTuple_New(1); - PyObject* fig = nullptr; - PyTuple_SetItem(fig_args, 0, PyLong_FromLong(fig_number)); - PyObject *fig_exists = - PyObject_CallObject(detail::_interpreter::get().s_python_function_fignum_exists, fig_args); - if (!PyObject_IsTrue(fig_exists)) { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - detail::_interpreter::get().s_python_empty_tuple); - } else { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - fig_args); - } - if (!fig) throw std::runtime_error("Call to figure() failed."); - - PyObject *gca_kwargs = PyDict_New(); - PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("3d")); - - PyObject *gca = PyObject_GetAttrString(fig, "gca"); - if (!gca) throw std::runtime_error("No gca"); - Py_INCREF(gca); - PyObject *axis = PyObject_Call( - gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); - - if (!axis) throw std::runtime_error("No axis"); - Py_INCREF(axis); - - Py_DECREF(gca); - Py_DECREF(gca_kwargs); - - PyObject *plot3 = PyObject_GetAttrString(axis, "plot"); - if (!plot3) throw std::runtime_error("No 3D line plot"); - Py_INCREF(plot3); - PyObject *res = PyObject_Call(plot3, args, kwargs); - if (!res) throw std::runtime_error("Failed 3D line plot"); - Py_DECREF(plot3); - - Py_DECREF(axis); - Py_DECREF(args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); -} - -template -bool stem(const std::vector &x, const std::vector &y, const std::map& keywords) -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - // using numpy arrays - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - // construct positional args - PyObject* args = PyTuple_New(2); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for (std::map::const_iterator it = - keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call( - detail::_interpreter::get().s_python_function_stem, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if (res) - Py_DECREF(res); - - return res; -} - -template< typename Numeric > -bool fill(const std::vector& x, const std::vector& y, const std::map& keywords) -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - // using numpy arrays - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - // construct positional args - PyObject* args = PyTuple_New(2); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_fill, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if (res) Py_DECREF(res); - - return res; -} - -template< typename Numeric > -bool fill_between(const std::vector& x, const std::vector& y1, const std::vector& y2, const std::map& keywords) -{ - assert(x.size() == y1.size()); - assert(x.size() == y2.size()); - - detail::_interpreter::get(); - - // using numpy arrays - PyObject* xarray = detail::get_array(x); - PyObject* y1array = detail::get_array(y1); - PyObject* y2array = detail::get_array(y2); - - // construct positional args - PyObject* args = PyTuple_New(3); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, y1array); - PyTuple_SetItem(args, 2, y2array); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_fill_between, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -template -bool arrow(Numeric x, Numeric y, Numeric end_x, Numeric end_y, const std::string& fc = "r", - const std::string ec = "k", Numeric head_length = 0.25, Numeric head_width = 0.1625) { - PyObject* obj_x = PyFloat_FromDouble(x); - PyObject* obj_y = PyFloat_FromDouble(y); - PyObject* obj_end_x = PyFloat_FromDouble(end_x); - PyObject* obj_end_y = PyFloat_FromDouble(end_y); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "fc", PyString_FromString(fc.c_str())); - PyDict_SetItemString(kwargs, "ec", PyString_FromString(ec.c_str())); - PyDict_SetItemString(kwargs, "head_width", PyFloat_FromDouble(head_width)); - PyDict_SetItemString(kwargs, "head_length", PyFloat_FromDouble(head_length)); - - PyObject* plot_args = PyTuple_New(4); - PyTuple_SetItem(plot_args, 0, obj_x); - PyTuple_SetItem(plot_args, 1, obj_y); - PyTuple_SetItem(plot_args, 2, obj_end_x); - PyTuple_SetItem(plot_args, 3, obj_end_y); - - PyObject* res = - PyObject_Call(detail::_interpreter::get().s_python_function_arrow, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if (res) - Py_DECREF(res); - - return res; -} - -template< typename Numeric> -bool hist(const std::vector& y, long bins=10,std::string color="b", - double alpha=1.0, bool cumulative=false) -{ - detail::_interpreter::get(); - - PyObject* yarray = detail::get_array(y); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "bins", PyLong_FromLong(bins)); - PyDict_SetItemString(kwargs, "color", PyString_FromString(color.c_str())); - PyDict_SetItemString(kwargs, "alpha", PyFloat_FromDouble(alpha)); - PyDict_SetItemString(kwargs, "cumulative", cumulative ? Py_True : Py_False); - - PyObject* plot_args = PyTuple_New(1); - - PyTuple_SetItem(plot_args, 0, yarray); - - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_hist, plot_args, kwargs); - - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -#ifndef WITHOUT_NUMPY -namespace detail { - -inline void imshow(void *ptr, const NPY_TYPES type, const int rows, const int columns, const int colors, const std::map &keywords, PyObject** out) -{ - assert(type == NPY_UINT8 || type == NPY_FLOAT); - assert(colors == 1 || colors == 3 || colors == 4); - - detail::_interpreter::get(); - - // construct args - npy_intp dims[3] = { rows, columns, colors }; - PyObject *args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyArray_SimpleNewFromData(colors == 1 ? 2 : 3, dims, type, ptr)); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_imshow, args, kwargs); - Py_DECREF(args); - Py_DECREF(kwargs); - if (!res) - throw std::runtime_error("Call to imshow() failed"); - if (out) - *out = res; - else - Py_DECREF(res); -} - -} // namespace detail - -inline void imshow(const unsigned char *ptr, const int rows, const int columns, const int colors, const std::map &keywords = {}, PyObject** out = nullptr) -{ - detail::imshow((void *) ptr, NPY_UINT8, rows, columns, colors, keywords, out); -} - -inline void imshow(const float *ptr, const int rows, const int columns, const int colors, const std::map &keywords = {}, PyObject** out = nullptr) -{ - detail::imshow((void *) ptr, NPY_FLOAT, rows, columns, colors, keywords, out); -} - -#ifdef WITH_OPENCV -void imshow(const cv::Mat &image, const std::map &keywords = {}) -{ - // Convert underlying type of matrix, if needed - cv::Mat image2; - NPY_TYPES npy_type = NPY_UINT8; - switch (image.type() & CV_MAT_DEPTH_MASK) { - case CV_8U: - image2 = image; - break; - case CV_32F: - image2 = image; - npy_type = NPY_FLOAT; - break; - default: - image.convertTo(image2, CV_MAKETYPE(CV_8U, image.channels())); - } - - // If color image, convert from BGR to RGB - switch (image2.channels()) { - case 3: - cv::cvtColor(image2, image2, CV_BGR2RGB); - break; - case 4: - cv::cvtColor(image2, image2, CV_BGRA2RGBA); - } - - detail::imshow(image2.data, npy_type, image2.rows, image2.cols, image2.channels(), keywords); -} -#endif // WITH_OPENCV -#endif // WITHOUT_NUMPY - -template -bool scatter(const std::vector& x, - const std::vector& y, - const double s=1.0, // The marker size in points**2 - const std::map & keywords = {}) -{ - detail::_interpreter::get(); - - assert(x.size() == y.size()); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "s", PyLong_FromLong(s)); - for (const auto& it : keywords) - { - PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str())); - } - - PyObject* plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_scatter, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -template - bool scatter_colored(const std::vector& x, - const std::vector& y, - const std::vector& colors, - const double s=1.0, // The marker size in points**2 - const std::map & keywords = {}) - { - detail::_interpreter::get(); - - assert(x.size() == y.size()); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - PyObject* colors_array = detail::get_array(colors); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "s", PyLong_FromLong(s)); - PyDict_SetItemString(kwargs, "c", colors_array); - - for (const auto& it : keywords) - { - PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str())); - } - - PyObject* plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_scatter, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; - } - - -template -bool scatter(const std::vector& x, - const std::vector& y, - const std::vector& z, - const double s=1.0, // The marker size in points**2 - const std::map & keywords = {}, - const long fig_number=0) { - detail::_interpreter::get(); - - // Same as with plot_surface: We lazily load the modules here the first time - // this function is called because I'm not sure that we can assume "matplotlib - // installed" implies "mpl_toolkits installed" on all platforms, and we don't - // want to require it for people who don't need 3d plots. - static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; - if (!mpl_toolkitsmod) { - detail::_interpreter::get(); - - PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); - PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); - if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } - - mpl_toolkitsmod = PyImport_Import(mpl_toolkits); - Py_DECREF(mpl_toolkits); - if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } - - axis3dmod = PyImport_Import(axis3d); - Py_DECREF(axis3d); - if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } - } - - assert(x.size() == y.size()); - assert(y.size() == z.size()); - - PyObject *xarray = detail::get_array(x); - PyObject *yarray = detail::get_array(y); - PyObject *zarray = detail::get_array(z); - - // construct positional args - PyObject *args = PyTuple_New(3); - PyTuple_SetItem(args, 0, xarray); - PyTuple_SetItem(args, 1, yarray); - PyTuple_SetItem(args, 2, zarray); - - // Build up the kw args. - PyObject *kwargs = PyDict_New(); - - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - PyObject *fig_args = PyTuple_New(1); - PyObject* fig = nullptr; - PyTuple_SetItem(fig_args, 0, PyLong_FromLong(fig_number)); - PyObject *fig_exists = - PyObject_CallObject(detail::_interpreter::get().s_python_function_fignum_exists, fig_args); - if (!PyObject_IsTrue(fig_exists)) { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - detail::_interpreter::get().s_python_empty_tuple); - } else { - fig = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - fig_args); - } - Py_DECREF(fig_exists); - if (!fig) throw std::runtime_error("Call to figure() failed."); - - PyObject *gca_kwargs = PyDict_New(); - PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("3d")); - - PyObject *gca = PyObject_GetAttrString(fig, "gca"); - if (!gca) throw std::runtime_error("No gca"); - Py_INCREF(gca); - PyObject *axis = PyObject_Call( - gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); - - if (!axis) throw std::runtime_error("No axis"); - Py_INCREF(axis); - - Py_DECREF(gca); - Py_DECREF(gca_kwargs); - - PyObject *plot3 = PyObject_GetAttrString(axis, "scatter"); - if (!plot3) throw std::runtime_error("No 3D line plot"); - Py_INCREF(plot3); - PyObject *res = PyObject_Call(plot3, args, kwargs); - if (!res) throw std::runtime_error("Failed 3D line plot"); - Py_DECREF(plot3); - - Py_DECREF(axis); - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(fig); - if (res) Py_DECREF(res); - return res; - -} - -template -bool boxplot(const std::vector>& data, - const std::vector& labels = {}, - const std::map & keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* listlist = detail::get_listlist(data); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, listlist); - - PyObject* kwargs = PyDict_New(); - - // kwargs needs the labels, if there are (the correct number of) labels - if (!labels.empty() && labels.size() == data.size()) { - PyDict_SetItemString(kwargs, "labels", detail::get_array(labels)); - } - - // take care of the remaining keywords - for (const auto& it : keywords) - { - PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_boxplot, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); - - return res; -} - -template -bool boxplot(const std::vector& data, - const std::map & keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* vector = detail::get_array(data); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, vector); - - PyObject* kwargs = PyDict_New(); - for (const auto& it : keywords) - { - PyDict_SetItemString(kwargs, it.first.c_str(), PyString_FromString(it.second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_boxplot, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); - - return res; -} - -template -bool bar(const std::vector & x, - const std::vector & y, - std::string ec = "black", - std::string ls = "-", - double lw = 1.0, - const std::map & keywords = {}) -{ - detail::_interpreter::get(); - - PyObject * xarray = detail::get_array(x); - PyObject * yarray = detail::get_array(y); - - PyObject * kwargs = PyDict_New(); - - PyDict_SetItemString(kwargs, "ec", PyString_FromString(ec.c_str())); - PyDict_SetItemString(kwargs, "ls", PyString_FromString(ls.c_str())); - PyDict_SetItemString(kwargs, "lw", PyFloat_FromDouble(lw)); - - for (std::map::const_iterator it = - keywords.begin(); - it != keywords.end(); - ++it) { - PyDict_SetItemString( - kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject * plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject * res = PyObject_Call( - detail::_interpreter::get().s_python_function_bar, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); - - return res; -} - -template -bool bar(const std::vector & y, - std::string ec = "black", - std::string ls = "-", - double lw = 1.0, - const std::map & keywords = {}) -{ - using T = typename std::remove_reference::type::value_type; - - detail::_interpreter::get(); - - std::vector x; - for (std::size_t i = 0; i < y.size(); i++) { x.push_back(i); } - - return bar(x, y, ec, ls, lw, keywords); -} - - -template -bool barh(const std::vector &x, const std::vector &y, std::string ec = "black", std::string ls = "-", double lw = 1.0, const std::map &keywords = { }) { - PyObject *xarray = detail::get_array(x); - PyObject *yarray = detail::get_array(y); - - PyObject *kwargs = PyDict_New(); - - PyDict_SetItemString(kwargs, "ec", PyString_FromString(ec.c_str())); - PyDict_SetItemString(kwargs, "ls", PyString_FromString(ls.c_str())); - PyDict_SetItemString(kwargs, "lw", PyFloat_FromDouble(lw)); - - for (std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject *plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_barh, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); - - return res; -} - - -inline bool subplots_adjust(const std::map& keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - for (std::map::const_iterator it = - keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyFloat_FromDouble(it->second)); - } - - - PyObject* plot_args = PyTuple_New(0); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_subplots_adjust, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -template< typename Numeric> -bool named_hist(std::string label,const std::vector& y, long bins=10, std::string color="b", double alpha=1.0) -{ - detail::_interpreter::get(); - - PyObject* yarray = detail::get_array(y); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(label.c_str())); - PyDict_SetItemString(kwargs, "bins", PyLong_FromLong(bins)); - PyDict_SetItemString(kwargs, "color", PyString_FromString(color.c_str())); - PyDict_SetItemString(kwargs, "alpha", PyFloat_FromDouble(alpha)); - - - PyObject* plot_args = PyTuple_New(1); - PyTuple_SetItem(plot_args, 0, yarray); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_hist, plot_args, kwargs); - - Py_DECREF(plot_args); - Py_DECREF(kwargs); - if(res) Py_DECREF(res); - - return res; -} - -template -bool plot(const std::vector& x, const std::vector& y, const std::string& s = "") -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(s.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_plot, plot_args); - - Py_DECREF(plot_args); - if(res) Py_DECREF(res); - - return res; -} - -template -bool contour(const std::vector& x, const std::vector& y, - const std::vector& z, - const std::map& keywords = {}) { - assert(x.size() == y.size() && x.size() == z.size()); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - PyObject* zarray = detail::get_array(z); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, zarray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for (std::map::const_iterator it = keywords.begin(); - it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = - PyObject_Call(detail::_interpreter::get().s_python_function_contour, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) - Py_DECREF(res); - - return res; -} - -template -bool quiver(const std::vector& x, const std::vector& y, const std::vector& u, const std::vector& w, const std::map& keywords = {}) -{ - assert(x.size() == y.size() && x.size() == u.size() && u.size() == w.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - PyObject* uarray = detail::get_array(u); - PyObject* warray = detail::get_array(w); - - PyObject* plot_args = PyTuple_New(4); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, uarray); - PyTuple_SetItem(plot_args, 3, warray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call( - detail::_interpreter::get().s_python_function_quiver, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) - Py_DECREF(res); - - return res; -} - -template -bool quiver(const std::vector& x, const std::vector& y, const std::vector& z, const std::vector& u, const std::vector& w, const std::vector& v, const std::map& keywords = {}) -{ - //set up 3d axes stuff - static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; - if (!mpl_toolkitsmod) { - detail::_interpreter::get(); - - PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); - PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); - if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } - - mpl_toolkitsmod = PyImport_Import(mpl_toolkits); - Py_DECREF(mpl_toolkits); - if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } - - axis3dmod = PyImport_Import(axis3d); - Py_DECREF(axis3d); - if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } - } - - //assert sizes match up - assert(x.size() == y.size() && x.size() == u.size() && u.size() == w.size() && x.size() == z.size() && x.size() == v.size() && u.size() == v.size()); - - //set up parameters - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - PyObject* zarray = detail::get_array(z); - PyObject* uarray = detail::get_array(u); - PyObject* warray = detail::get_array(w); - PyObject* varray = detail::get_array(v); - - PyObject* plot_args = PyTuple_New(6); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, zarray); - PyTuple_SetItem(plot_args, 3, uarray); - PyTuple_SetItem(plot_args, 4, warray); - PyTuple_SetItem(plot_args, 5, varray); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - //get figure gca to enable 3d projection - PyObject *fig = - PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, - detail::_interpreter::get().s_python_empty_tuple); - if (!fig) throw std::runtime_error("Call to figure() failed."); - - PyObject *gca_kwargs = PyDict_New(); - PyDict_SetItemString(gca_kwargs, "projection", PyString_FromString("3d")); - - PyObject *gca = PyObject_GetAttrString(fig, "gca"); - if (!gca) throw std::runtime_error("No gca"); - Py_INCREF(gca); - PyObject *axis = PyObject_Call( - gca, detail::_interpreter::get().s_python_empty_tuple, gca_kwargs); - - if (!axis) throw std::runtime_error("No axis"); - Py_INCREF(axis); - Py_DECREF(gca); - Py_DECREF(gca_kwargs); - - //plot our boys bravely, plot them strongly, plot them with a wink and clap - PyObject *plot3 = PyObject_GetAttrString(axis, "quiver"); - if (!plot3) throw std::runtime_error("No 3D line plot"); - Py_INCREF(plot3); - PyObject* res = PyObject_Call( - plot3, plot_args, kwargs); - if (!res) throw std::runtime_error("Failed 3D plot"); - Py_DECREF(plot3); - Py_DECREF(axis); - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) - Py_DECREF(res); - - return res; -} - -template -bool stem(const std::vector& x, const std::vector& y, const std::string& s = "") -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(s.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_stem, plot_args); - - Py_DECREF(plot_args); - if (res) - Py_DECREF(res); - - return res; -} - -template -bool semilogx(const std::vector& x, const std::vector& y, const std::string& s = "") -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(s.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_semilogx, plot_args); - - Py_DECREF(plot_args); - if(res) Py_DECREF(res); - - return res; -} - -template -bool semilogy(const std::vector& x, const std::vector& y, const std::string& s = "") -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(s.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_semilogy, plot_args); - - Py_DECREF(plot_args); - if(res) Py_DECREF(res); - - return res; -} - -template -bool loglog(const std::vector& x, const std::vector& y, const std::string& s = "") -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(s.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_loglog, plot_args); - - Py_DECREF(plot_args); - if(res) Py_DECREF(res); - - return res; -} - -template -bool errorbar(const std::vector &x, const std::vector &y, const std::vector &yerr, const std::map &keywords = {}) -{ - assert(x.size() == y.size()); - - detail::_interpreter::get(); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - PyObject* yerrarray = detail::get_array(yerr); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyDict_SetItemString(kwargs, "yerr", yerrarray); - - PyObject *plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject *res = PyObject_Call(detail::_interpreter::get().s_python_function_errorbar, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - - if (res) - Py_DECREF(res); - else - throw std::runtime_error("Call to errorbar() failed."); - - return res; -} - -template -bool named_plot(const std::string& name, const std::vector& y, const std::string& format = "") -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(2); - - PyTuple_SetItem(plot_args, 0, yarray); - PyTuple_SetItem(plot_args, 1, pystring); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) Py_DECREF(res); - - return res; -} - -template -bool named_plot(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) Py_DECREF(res); - - return res; -} - -template -bool named_semilogx(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_semilogx, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) Py_DECREF(res); - - return res; -} - -template -bool named_semilogy(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_semilogy, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) Py_DECREF(res); - - return res; -} - -template -bool named_loglog(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") -{ - detail::_interpreter::get(); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_loglog, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - if (res) Py_DECREF(res); - - return res; -} - -template -bool plot(const std::vector& y, const std::string& format = "") -{ - std::vector x(y.size()); - for(size_t i=0; i -bool plot(const std::vector& y, const std::map& keywords) -{ - std::vector x(y.size()); - for(size_t i=0; i -bool stem(const std::vector& y, const std::string& format = "") -{ - std::vector x(y.size()); - for (size_t i = 0; i < x.size(); ++i) x.at(i) = i; - return stem(x, y, format); -} - -template -void text(Numeric x, Numeric y, const std::string& s = "") -{ - detail::_interpreter::get(); - - PyObject* args = PyTuple_New(3); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(x)); - PyTuple_SetItem(args, 1, PyFloat_FromDouble(y)); - PyTuple_SetItem(args, 2, PyString_FromString(s.c_str())); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_text, args); - if(!res) throw std::runtime_error("Call to text() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -inline void colorbar(PyObject* mappable = NULL, const std::map& keywords = {}) -{ - if (mappable == NULL) - throw std::runtime_error("Must call colorbar with PyObject* returned from an image, contour, surface, etc."); - - detail::_interpreter::get(); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, mappable); - - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyFloat_FromDouble(it->second)); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_colorbar, args, kwargs); - if(!res) throw std::runtime_error("Call to colorbar() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - - -inline long figure(long number = -1) -{ - detail::_interpreter::get(); - - PyObject *res; - if (number == -1) - res = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, detail::_interpreter::get().s_python_empty_tuple); - else { - assert(number > 0); - - // Make sure interpreter is initialised - detail::_interpreter::get(); - - PyObject *args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyLong_FromLong(number)); - res = PyObject_CallObject(detail::_interpreter::get().s_python_function_figure, args); - Py_DECREF(args); - } - - if(!res) throw std::runtime_error("Call to figure() failed."); - - PyObject* num = PyObject_GetAttrString(res, "number"); - if (!num) throw std::runtime_error("Could not get number attribute of figure object"); - const long figureNumber = PyLong_AsLong(num); - - Py_DECREF(num); - Py_DECREF(res); - - return figureNumber; -} - -inline bool fignum_exists(long number) -{ - detail::_interpreter::get(); - - PyObject *args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyLong_FromLong(number)); - PyObject *res = PyObject_CallObject(detail::_interpreter::get().s_python_function_fignum_exists, args); - if(!res) throw std::runtime_error("Call to fignum_exists() failed."); - - bool ret = PyObject_IsTrue(res); - Py_DECREF(res); - Py_DECREF(args); - - return ret; -} - -inline void figure_size(size_t w, size_t h) -{ - detail::_interpreter::get(); - - const size_t dpi = 100; - PyObject* size = PyTuple_New(2); - PyTuple_SetItem(size, 0, PyFloat_FromDouble((double)w / dpi)); - PyTuple_SetItem(size, 1, PyFloat_FromDouble((double)h / dpi)); - - PyObject* kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "figsize", size); - PyDict_SetItemString(kwargs, "dpi", PyLong_FromSize_t(dpi)); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_figure, - detail::_interpreter::get().s_python_empty_tuple, kwargs); - - Py_DECREF(kwargs); - - if(!res) throw std::runtime_error("Call to figure_size() failed."); - Py_DECREF(res); -} - -inline void legend() -{ - detail::_interpreter::get(); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_legend, detail::_interpreter::get().s_python_empty_tuple); - if(!res) throw std::runtime_error("Call to legend() failed."); - - Py_DECREF(res); -} - -inline void legend(const std::map& keywords) -{ - detail::_interpreter::get(); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_legend, detail::_interpreter::get().s_python_empty_tuple, kwargs); - if(!res) throw std::runtime_error("Call to legend() failed."); - - Py_DECREF(kwargs); - Py_DECREF(res); -} - -template -inline void set_aspect(Numeric ratio) -{ - detail::_interpreter::get(); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(ratio)); - PyObject* kwargs = PyDict_New(); - - PyObject *ax = - PyObject_CallObject(detail::_interpreter::get().s_python_function_gca, - detail::_interpreter::get().s_python_empty_tuple); - if (!ax) throw std::runtime_error("Call to gca() failed."); - Py_INCREF(ax); - - PyObject *set_aspect = PyObject_GetAttrString(ax, "set_aspect"); - if (!set_aspect) throw std::runtime_error("Attribute set_aspect not found."); - Py_INCREF(set_aspect); - - PyObject *res = PyObject_Call(set_aspect, args, kwargs); - if (!res) throw std::runtime_error("Call to set_aspect() failed."); - Py_DECREF(set_aspect); - - Py_DECREF(ax); - Py_DECREF(args); - Py_DECREF(kwargs); -} - -inline void set_aspect_equal() -{ - // expect ratio == "equal". Leaving error handling to matplotlib. - detail::_interpreter::get(); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyString_FromString("equal")); - PyObject* kwargs = PyDict_New(); - - PyObject *ax = - PyObject_CallObject(detail::_interpreter::get().s_python_function_gca, - detail::_interpreter::get().s_python_empty_tuple); - if (!ax) throw std::runtime_error("Call to gca() failed."); - Py_INCREF(ax); - - PyObject *set_aspect = PyObject_GetAttrString(ax, "set_aspect"); - if (!set_aspect) throw std::runtime_error("Attribute set_aspect not found."); - Py_INCREF(set_aspect); - - PyObject *res = PyObject_Call(set_aspect, args, kwargs); - if (!res) throw std::runtime_error("Call to set_aspect() failed."); - Py_DECREF(set_aspect); - - Py_DECREF(ax); - Py_DECREF(args); - Py_DECREF(kwargs); -} - -template -void ylim(Numeric left, Numeric right) -{ - detail::_interpreter::get(); - - PyObject* list = PyList_New(2); - PyList_SetItem(list, 0, PyFloat_FromDouble(left)); - PyList_SetItem(list, 1, PyFloat_FromDouble(right)); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, list); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_ylim, args); - if(!res) throw std::runtime_error("Call to ylim() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -template -void xlim(Numeric left, Numeric right) -{ - detail::_interpreter::get(); - - PyObject* list = PyList_New(2); - PyList_SetItem(list, 0, PyFloat_FromDouble(left)); - PyList_SetItem(list, 1, PyFloat_FromDouble(right)); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, list); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_xlim, args); - if(!res) throw std::runtime_error("Call to xlim() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - - -inline std::array xlim() -{ - PyObject* args = PyTuple_New(0); - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_xlim, args); - - if(!res) throw std::runtime_error("Call to xlim() failed."); - - Py_DECREF(res); - - PyObject* left = PyTuple_GetItem(res,0); - PyObject* right = PyTuple_GetItem(res,1); - return { PyFloat_AsDouble(left), PyFloat_AsDouble(right) }; -} - - -inline std::array ylim() -{ - PyObject* args = PyTuple_New(0); - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_ylim, args); - - if(!res) throw std::runtime_error("Call to ylim() failed."); - - Py_DECREF(res); - - PyObject* left = PyTuple_GetItem(res,0); - PyObject* right = PyTuple_GetItem(res,1); - return { PyFloat_AsDouble(left), PyFloat_AsDouble(right) }; -} - -template -inline void xticks(const std::vector &ticks, const std::vector &labels = {}, const std::map& keywords = {}) -{ - assert(labels.size() == 0 || ticks.size() == labels.size()); - - detail::_interpreter::get(); - - // using numpy array - PyObject* ticksarray = detail::get_array(ticks); - - PyObject* args; - if(labels.size() == 0) { - // construct positional args - args = PyTuple_New(1); - PyTuple_SetItem(args, 0, ticksarray); - } else { - // make tuple of tick labels - PyObject* labelstuple = PyTuple_New(labels.size()); - for (size_t i = 0; i < labels.size(); i++) - PyTuple_SetItem(labelstuple, i, PyUnicode_FromString(labels[i].c_str())); - - // construct positional args - args = PyTuple_New(2); - PyTuple_SetItem(args, 0, ticksarray); - PyTuple_SetItem(args, 1, labelstuple); - } - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_xticks, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if(!res) throw std::runtime_error("Call to xticks() failed"); - - Py_DECREF(res); -} - -template -inline void xticks(const std::vector &ticks, const std::map& keywords) -{ - xticks(ticks, {}, keywords); -} - -template -inline void yticks(const std::vector &ticks, const std::vector &labels = {}, const std::map& keywords = {}) -{ - assert(labels.size() == 0 || ticks.size() == labels.size()); - - detail::_interpreter::get(); - - // using numpy array - PyObject* ticksarray = detail::get_array(ticks); - - PyObject* args; - if(labels.size() == 0) { - // construct positional args - args = PyTuple_New(1); - PyTuple_SetItem(args, 0, ticksarray); - } else { - // make tuple of tick labels - PyObject* labelstuple = PyTuple_New(labels.size()); - for (size_t i = 0; i < labels.size(); i++) - PyTuple_SetItem(labelstuple, i, PyUnicode_FromString(labels[i].c_str())); - - // construct positional args - args = PyTuple_New(2); - PyTuple_SetItem(args, 0, ticksarray); - PyTuple_SetItem(args, 1, labelstuple); - } - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_yticks, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if(!res) throw std::runtime_error("Call to yticks() failed"); - - Py_DECREF(res); -} - -template -inline void yticks(const std::vector &ticks, const std::map& keywords) -{ - yticks(ticks, {}, keywords); -} - -template inline void margins(Numeric margin) -{ - // construct positional args - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(margin)); - - PyObject* res = - PyObject_CallObject(detail::_interpreter::get().s_python_function_margins, args); - if (!res) - throw std::runtime_error("Call to margins() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -template inline void margins(Numeric margin_x, Numeric margin_y) -{ - // construct positional args - PyObject* args = PyTuple_New(2); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(margin_x)); - PyTuple_SetItem(args, 1, PyFloat_FromDouble(margin_y)); - - PyObject* res = - PyObject_CallObject(detail::_interpreter::get().s_python_function_margins, args); - if (!res) - throw std::runtime_error("Call to margins() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - - -inline void tick_params(const std::map& keywords, const std::string axis = "both") -{ - detail::_interpreter::get(); - - // construct positional args - PyObject* args; - args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyString_FromString(axis.c_str())); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for (std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_tick_params, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - if (!res) throw std::runtime_error("Call to tick_params() failed"); - - Py_DECREF(res); -} - inline void subplot(long nrows, long ncols, long plot_number) -{ - detail::_interpreter::get(); - - // construct positional args - PyObject* args = PyTuple_New(3); - PyTuple_SetItem(args, 0, PyLong_FromLong(nrows)); - PyTuple_SetItem(args, 1, PyLong_FromLong(ncols)); - PyTuple_SetItem(args, 2, PyLong_FromLong(plot_number)); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_subplot, args); - if(!res) throw std::runtime_error("Call to subplot() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - - - - -inline void subplot2grid(long nrows, long ncols, long rowid=0, long colid=0, long rowspan=1, long colspan=1) -{ - detail::_interpreter::get(); - - PyObject* shape = PyTuple_New(2); - PyTuple_SetItem(shape, 0, PyLong_FromLong(nrows)); - PyTuple_SetItem(shape, 1, PyLong_FromLong(ncols)); - - PyObject* loc = PyTuple_New(2); - PyTuple_SetItem(loc, 0, PyLong_FromLong(rowid)); - PyTuple_SetItem(loc, 1, PyLong_FromLong(colid)); - - PyObject* args = PyTuple_New(4); - PyTuple_SetItem(args, 0, shape); - PyTuple_SetItem(args, 1, loc); - PyTuple_SetItem(args, 2, PyLong_FromLong(rowspan)); - PyTuple_SetItem(args, 3, PyLong_FromLong(colspan)); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_subplot2grid, args); - if(!res) throw std::runtime_error("Call to subplot2grid() failed."); - - Py_DECREF(shape); - Py_DECREF(loc); - Py_DECREF(args); - Py_DECREF(res); -} - -inline void title(const std::string &titlestr, const std::map &keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* pytitlestr = PyString_FromString(titlestr.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pytitlestr); - - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_title, args, kwargs); - if(!res) throw std::runtime_error("Call to title() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - -inline void suptitle(const std::string &suptitlestr, const std::map &keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* pysuptitlestr = PyString_FromString(suptitlestr.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pysuptitlestr); - - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_suptitle, args, kwargs); - if(!res) throw std::runtime_error("Call to suptitle() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - -inline void axis(const std::string &axisstr) -{ - detail::_interpreter::get(); - - PyObject* str = PyString_FromString(axisstr.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, str); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_axis, args); - if(!res) throw std::runtime_error("Call to title() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -inline void axhline(double y, double xmin = 0., double xmax = 1., const std::map& keywords = std::map()) -{ - detail::_interpreter::get(); - - // construct positional args - PyObject* args = PyTuple_New(3); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(y)); - PyTuple_SetItem(args, 1, PyFloat_FromDouble(xmin)); - PyTuple_SetItem(args, 2, PyFloat_FromDouble(xmax)); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_axhline, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); -} - -inline void axvline(double x, double ymin = 0., double ymax = 1., const std::map& keywords = std::map()) -{ - detail::_interpreter::get(); - - // construct positional args - PyObject* args = PyTuple_New(3); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(x)); - PyTuple_SetItem(args, 1, PyFloat_FromDouble(ymin)); - PyTuple_SetItem(args, 2, PyFloat_FromDouble(ymax)); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_axvline, args, kwargs); - - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); -} - -inline void axvspan(double xmin, double xmax, double ymin = 0., double ymax = 1., const std::map& keywords = std::map()) -{ - // construct positional args - PyObject* args = PyTuple_New(4); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(xmin)); - PyTuple_SetItem(args, 1, PyFloat_FromDouble(xmax)); - PyTuple_SetItem(args, 2, PyFloat_FromDouble(ymin)); - PyTuple_SetItem(args, 3, PyFloat_FromDouble(ymax)); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - if (it->first == "linewidth" || it->first == "alpha") { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyFloat_FromDouble(std::stod(it->second))); - } else { - PyDict_SetItemString(kwargs, it->first.c_str(), - PyString_FromString(it->second.c_str())); - } - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_axvspan, args, kwargs); - Py_DECREF(args); - Py_DECREF(kwargs); - - if(res) Py_DECREF(res); -} - -inline void xlabel(const std::string &str, const std::map &keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* pystr = PyString_FromString(str.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pystr); - - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_xlabel, args, kwargs); - if(!res) throw std::runtime_error("Call to xlabel() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - -inline void ylabel(const std::string &str, const std::map& keywords = {}) -{ - detail::_interpreter::get(); - - PyObject* pystr = PyString_FromString(str.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pystr); - - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_ylabel, args, kwargs); - if(!res) throw std::runtime_error("Call to ylabel() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - -inline void set_zlabel(const std::string &str, const std::map& keywords = {}) -{ - detail::_interpreter::get(); - - // Same as with plot_surface: We lazily load the modules here the first time - // this function is called because I'm not sure that we can assume "matplotlib - // installed" implies "mpl_toolkits installed" on all platforms, and we don't - // want to require it for people who don't need 3d plots. - static PyObject *mpl_toolkitsmod = nullptr, *axis3dmod = nullptr; - if (!mpl_toolkitsmod) { - PyObject* mpl_toolkits = PyString_FromString("mpl_toolkits"); - PyObject* axis3d = PyString_FromString("mpl_toolkits.mplot3d"); - if (!mpl_toolkits || !axis3d) { throw std::runtime_error("couldnt create string"); } - - mpl_toolkitsmod = PyImport_Import(mpl_toolkits); - Py_DECREF(mpl_toolkits); - if (!mpl_toolkitsmod) { throw std::runtime_error("Error loading module mpl_toolkits!"); } - - axis3dmod = PyImport_Import(axis3d); - Py_DECREF(axis3d); - if (!axis3dmod) { throw std::runtime_error("Error loading module mpl_toolkits.mplot3d!"); } - } - - PyObject* pystr = PyString_FromString(str.c_str()); - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pystr); - - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject *ax = - PyObject_CallObject(detail::_interpreter::get().s_python_function_gca, - detail::_interpreter::get().s_python_empty_tuple); - if (!ax) throw std::runtime_error("Call to gca() failed."); - Py_INCREF(ax); - - PyObject *zlabel = PyObject_GetAttrString(ax, "set_zlabel"); - if (!zlabel) throw std::runtime_error("Attribute set_zlabel not found."); - Py_INCREF(zlabel); - - PyObject *res = PyObject_Call(zlabel, args, kwargs); - if (!res) throw std::runtime_error("Call to set_zlabel() failed."); - Py_DECREF(zlabel); - - Py_DECREF(ax); - Py_DECREF(args); - Py_DECREF(kwargs); - if (res) Py_DECREF(res); -} - -inline void grid(bool flag) -{ - detail::_interpreter::get(); - - PyObject* pyflag = flag ? Py_True : Py_False; - Py_INCREF(pyflag); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pyflag); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_grid, args); - if(!res) throw std::runtime_error("Call to grid() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -inline void show(const bool block = true) -{ - detail::_interpreter::get(); - - PyObject* res; - if(block) - { - res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_show, - detail::_interpreter::get().s_python_empty_tuple); - } - else - { - PyObject *kwargs = PyDict_New(); - PyDict_SetItemString(kwargs, "block", Py_False); - res = PyObject_Call( detail::_interpreter::get().s_python_function_show, detail::_interpreter::get().s_python_empty_tuple, kwargs); - Py_DECREF(kwargs); - } - - - if (!res) throw std::runtime_error("Call to show() failed."); - - Py_DECREF(res); -} - -inline void close() -{ - detail::_interpreter::get(); - - PyObject* res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_close, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) throw std::runtime_error("Call to close() failed."); - - Py_DECREF(res); -} - -inline void xkcd() { - detail::_interpreter::get(); - - PyObject* res; - PyObject *kwargs = PyDict_New(); - - res = PyObject_Call(detail::_interpreter::get().s_python_function_xkcd, - detail::_interpreter::get().s_python_empty_tuple, kwargs); - - Py_DECREF(kwargs); - - if (!res) - throw std::runtime_error("Call to show() failed."); - - Py_DECREF(res); -} - -inline void draw() -{ - detail::_interpreter::get(); - - PyObject* res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_draw, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) throw std::runtime_error("Call to draw() failed."); - - Py_DECREF(res); -} - -template -inline void pause(Numeric interval) -{ - detail::_interpreter::get(); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyFloat_FromDouble(interval)); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_pause, args); - if(!res) throw std::runtime_error("Call to pause() failed."); - - Py_DECREF(args); - Py_DECREF(res); -} - -inline void save(const std::string& filename, const int dpi=0) -{ - detail::_interpreter::get(); - - PyObject* pyfilename = PyString_FromString(filename.c_str()); - - PyObject* args = PyTuple_New(1); - PyTuple_SetItem(args, 0, pyfilename); - - PyObject* kwargs = PyDict_New(); - - if(dpi > 0) - { - PyDict_SetItemString(kwargs, "dpi", PyLong_FromLong(dpi)); - } - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_save, args, kwargs); - if (!res) throw std::runtime_error("Call to save() failed."); - - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(res); -} - -inline void rcparams(const std::map& keywords = {}) { - detail::_interpreter::get(); - PyObject* args = PyTuple_New(0); - PyObject* kwargs = PyDict_New(); - for (auto it = keywords.begin(); it != keywords.end(); ++it) { - if ("text.usetex" == it->first) - PyDict_SetItemString(kwargs, it->first.c_str(), PyLong_FromLong(std::stoi(it->second.c_str()))); - else PyDict_SetItemString(kwargs, it->first.c_str(), PyString_FromString(it->second.c_str())); - } - - PyObject * update = PyObject_GetAttrString(detail::_interpreter::get().s_python_function_rcparams, "update"); - PyObject * res = PyObject_Call(update, args, kwargs); - if(!res) throw std::runtime_error("Call to rcParams.update() failed."); - Py_DECREF(args); - Py_DECREF(kwargs); - Py_DECREF(update); - Py_DECREF(res); -} - -inline void clf() { - detail::_interpreter::get(); - - PyObject *res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_clf, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) throw std::runtime_error("Call to clf() failed."); - - Py_DECREF(res); -} - -inline void cla() { - detail::_interpreter::get(); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_cla, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) - throw std::runtime_error("Call to cla() failed."); - - Py_DECREF(res); -} - -inline void ion() { - detail::_interpreter::get(); - - PyObject *res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_ion, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) throw std::runtime_error("Call to ion() failed."); - - Py_DECREF(res); -} - -inline std::vector> ginput(const int numClicks = 1, const std::map& keywords = {}) -{ - detail::_interpreter::get(); - - PyObject *args = PyTuple_New(1); - PyTuple_SetItem(args, 0, PyLong_FromLong(numClicks)); - - // construct keyword args - PyObject* kwargs = PyDict_New(); - for(std::map::const_iterator it = keywords.begin(); it != keywords.end(); ++it) - { - PyDict_SetItemString(kwargs, it->first.c_str(), PyUnicode_FromString(it->second.c_str())); - } - - PyObject* res = PyObject_Call( - detail::_interpreter::get().s_python_function_ginput, args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(args); - if (!res) throw std::runtime_error("Call to ginput() failed."); - - const size_t len = PyList_Size(res); - std::vector> out; - out.reserve(len); - for (size_t i = 0; i < len; i++) { - PyObject *current = PyList_GetItem(res, i); - std::array position; - position[0] = PyFloat_AsDouble(PyTuple_GetItem(current, 0)); - position[1] = PyFloat_AsDouble(PyTuple_GetItem(current, 1)); - out.push_back(position); - } - Py_DECREF(res); - - return out; -} - -// Actually, is there any reason not to call this automatically for every plot? -inline void tight_layout() { - detail::_interpreter::get(); - - PyObject *res = PyObject_CallObject( - detail::_interpreter::get().s_python_function_tight_layout, - detail::_interpreter::get().s_python_empty_tuple); - - if (!res) throw std::runtime_error("Call to tight_layout() failed."); - - Py_DECREF(res); -} - -// Support for variadic plot() and initializer lists: - -namespace detail { - -template -using is_function = typename std::is_function>>::type; - -template -struct is_callable_impl; - -template -struct is_callable_impl -{ - typedef is_function type; -}; // a non-object is callable iff it is a function - -template -struct is_callable_impl -{ - struct Fallback { void operator()(); }; - struct Derived : T, Fallback { }; - - template struct Check; - - template - static std::true_type test( ... ); // use a variadic function to make sure (1) it accepts everything and (2) its always the worst match - - template - static std::false_type test( Check* ); - -public: - typedef decltype(test(nullptr)) type; - typedef decltype(&Fallback::operator()) dtype; - static constexpr bool value = type::value; -}; // an object is callable iff it defines operator() - -template -struct is_callable -{ - // dispatch to is_callable_impl or is_callable_impl depending on whether T is of class type or not - typedef typename is_callable_impl::value, T>::type type; -}; - -template -struct plot_impl { }; - -template<> -struct plot_impl -{ - template - bool operator()(const IterableX& x, const IterableY& y, const std::string& format) - { - detail::_interpreter::get(); - - // 2-phase lookup for distance, begin, end - using std::distance; - using std::begin; - using std::end; - - auto xs = distance(begin(x), end(x)); - auto ys = distance(begin(y), end(y)); - assert(xs == ys && "x and y data must have the same number of elements!"); - - PyObject* xlist = PyList_New(xs); - PyObject* ylist = PyList_New(ys); - PyObject* pystring = PyString_FromString(format.c_str()); - - auto itx = begin(x), ity = begin(y); - for(size_t i = 0; i < xs; ++i) { - PyList_SetItem(xlist, i, PyFloat_FromDouble(*itx++)); - PyList_SetItem(ylist, i, PyFloat_FromDouble(*ity++)); - } - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xlist); - PyTuple_SetItem(plot_args, 1, ylist); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_CallObject(detail::_interpreter::get().s_python_function_plot, plot_args); - - Py_DECREF(plot_args); - if(res) Py_DECREF(res); - - return res; - } -}; - -template<> -struct plot_impl -{ - template - bool operator()(const Iterable& ticks, const Callable& f, const std::string& format) - { - if(begin(ticks) == end(ticks)) return true; - - // We could use additional meta-programming to deduce the correct element type of y, - // but all values have to be convertible to double anyways - std::vector y; - for(auto x : ticks) y.push_back(f(x)); - return plot_impl()(ticks,y,format); - } -}; - -} // end namespace detail - -// recursion stop for the above -template -bool plot() { return true; } - -template -bool plot(const A& a, const B& b, const std::string& format, Args... args) -{ - return detail::plot_impl::type>()(a,b,format) && plot(args...); -} - -/* - * This group of plot() functions is needed to support initializer lists, i.e. calling - * plot( {1,2,3,4} ) - */ -inline bool plot(const std::vector& x, const std::vector& y, const std::string& format = "") { - return plot(x,y,format); -} - -inline bool plot(const std::vector& y, const std::string& format = "") { - return plot(y,format); -} - -inline bool plot(const std::vector& x, const std::vector& y, const std::map& keywords) { - return plot(x,y,keywords); -} - -/* - * This class allows dynamic plots, ie changing the plotted data without clearing and re-plotting - */ -class Plot -{ -public: - // default initialization with plot label, some data and format - template - Plot(const std::string& name, const std::vector& x, const std::vector& y, const std::string& format = "") { - detail::_interpreter::get(); - - assert(x.size() == y.size()); - - PyObject* kwargs = PyDict_New(); - if(name != "") - PyDict_SetItemString(kwargs, "label", PyString_FromString(name.c_str())); - - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* pystring = PyString_FromString(format.c_str()); - - PyObject* plot_args = PyTuple_New(3); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - PyTuple_SetItem(plot_args, 2, pystring); - - PyObject* res = PyObject_Call(detail::_interpreter::get().s_python_function_plot, plot_args, kwargs); - - Py_DECREF(kwargs); - Py_DECREF(plot_args); - - if(res) - { - line= PyList_GetItem(res, 0); - - if(line) - set_data_fct = PyObject_GetAttrString(line,"set_data"); - else - Py_DECREF(line); - Py_DECREF(res); - } - } - - // shorter initialization with name or format only - // basically calls line, = plot([], []) - Plot(const std::string& name = "", const std::string& format = "") - : Plot(name, std::vector(), std::vector(), format) {} - - template - bool update(const std::vector& x, const std::vector& y) { - assert(x.size() == y.size()); - if(set_data_fct) - { - PyObject* xarray = detail::get_array(x); - PyObject* yarray = detail::get_array(y); - - PyObject* plot_args = PyTuple_New(2); - PyTuple_SetItem(plot_args, 0, xarray); - PyTuple_SetItem(plot_args, 1, yarray); - - PyObject* res = PyObject_CallObject(set_data_fct, plot_args); - if (res) Py_DECREF(res); - return res; - } - return false; - } - - // clears the plot but keep it available - bool clear() { - return update(std::vector(), std::vector()); - } - - // definitely remove this line - void remove() { - if(line) - { - auto remove_fct = PyObject_GetAttrString(line,"remove"); - PyObject* args = PyTuple_New(0); - PyObject* res = PyObject_CallObject(remove_fct, args); - if (res) Py_DECREF(res); - } - decref(); - } - - ~Plot() { - decref(); - } -private: - - void decref() { - if(line) - Py_DECREF(line); - if(set_data_fct) - Py_DECREF(set_data_fct); - } - - - PyObject* line = nullptr; - PyObject* set_data_fct = nullptr; -}; - -} // end namespace matplotlibcpp \ No newline at end of file diff --git a/cmvr-es/devices/README.md b/cmvr-es/devices/README.md index f7175729..3668f6b9 100644 --- a/cmvr-es/devices/README.md +++ b/cmvr-es/devices/README.md @@ -334,19 +334,17 @@ MediaSourceManager Subscription 同样是单消费者对象,不同协议或客 无硬件参考测试: - [`camera/hikvision_camera/tests/hikvision_camera_callback_test.cpp`](camera/hikvision_camera/tests/hikvision_camera_callback_test.cpp) -- [`../manager/media_source_manager/tests/media_source_manager_test.cpp`](../manager/media_source_manager/tests/media_source_manager_test.cpp) ```bash cmake -S . -B build \ -DCMVR_ARCH=x86 \ - -DBUILD_TESTING=ON \ - -DCMVR_MEDIA_SOURCE_MANAGER_BUILD_TESTS=ON + -DBUILD_TESTING=ON cmake --build build -j"$(nproc)" ctest \ --test-dir build \ - -R 'hikvision_camera_callback_test|media_source_manager_test' \ + -R '^hikvision_camera_callback_test$' \ --output-on-failure ``` diff --git a/cmvr-es/devices/agv/seer_robokit/CMakeLists.txt b/cmvr-es/devices/agv/seer_robokit/CMakeLists.txt index 35ce8bad..2dd0307f 100644 --- a/cmvr-es/devices/agv/seer_robokit/CMakeLists.txt +++ b/cmvr-es/devices/agv/seer_robokit/CMakeLists.txt @@ -27,31 +27,3 @@ target_link_libraries(seer_robokit_agv add_library(cmvr_es::device::seer_robokit_agv ALIAS seer_robokit_agv) install(TARGETS seer_robokit_agv LIBRARY DESTINATION lib) - -if(BUILD_TESTING) - add_executable(seer_robokit_control_authority_test - tests/seer_robokit_control_authority_test.cpp - ) - target_link_libraries(seer_robokit_control_authority_test - PRIVATE - cmvr_es::device::seer_robokit_agv - gtest - gtest_main - pthread - ) - add_test( - NAME seer_robokit_control_authority_test - COMMAND seer_robokit_control_authority_test - ) - set(_seer_robokit_control_authority_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _seer_robokit_control_authority_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(seer_robokit_control_authority_test PROPERTIES - TIMEOUT 180 - ENVIRONMENT "${_seer_robokit_control_authority_test_environment}" - ) -endif() diff --git a/cmvr-es/devices/agv/seer_robokit/README.md b/cmvr-es/devices/agv/seer_robokit/README.md index 3cb6d77d..dc20dfd1 100644 --- a/cmvr-es/devices/agv/seer_robokit/README.md +++ b/cmvr-es/devices/agv/seer_robokit/README.md @@ -35,8 +35,6 @@ - 阻塞等待与停车确认: [`src/seer_robokit_navigation_wait.cpp`](src/seer_robokit_navigation_wait.cpp) - 地图和建图:[`src/seer_robokit_map.cpp`](src/seer_robokit_map.cpp) -- 假控制器测试: - [`tests/seer_robokit_control_authority_test.cpp`](tests/seer_robokit_control_authority_test.cpp) - 设备配置: [`../../../config/devices/agv/seer_robokit.pb.txt`](../../../config/devices/agv/seer_robokit.pb.txt) - DeviceManager 配置: @@ -375,21 +373,3 @@ unknown,调用方不能自动重发运动命令,应先查询状态并取消 验证后才能据此联动机械臂。异步成功更不代表 PGV 调整完成。 - 地图切换、地图上传和开始建图会改变控制器状态,也会先抢占控制权;不要和 现场调度系统并行操作。 -- 本目录的假控制器测试验证软件协议、错误路径和并发逻辑,不代表真实 SEER Robokit、 - 底盘、PGV、地图或安全链已经验收。 - -## 测试 - -```bash -cmake --build build \ - --target seer_robokit_control_authority_test grpc_agv_service_test \ - -j2 - -ctest --test-dir build \ - -R '^(seer_robokit_control_authority_test|grpc_agv_service_test)$' \ - --output-on-failure -``` - -`seer_robokit_control_authority_test` 使用本机回环 TCP 假控制器,需要允许本地 -bind/listen。受限沙箱若禁止创建 socket,只能证明编译通过,不能把未执行的 -fake-controller 场景报告为测试通过。测试过程不会连接真实 AGV。 diff --git a/cmvr-es/devices/agv/seer_robokit/tests/seer_robokit_control_authority_test.cpp b/cmvr-es/devices/agv/seer_robokit/tests/seer_robokit_control_authority_test.cpp deleted file mode 100644 index 9198d90f..00000000 --- a/cmvr-es/devices/agv/seer_robokit/tests/seer_robokit_control_authority_test.cpp +++ /dev/null @@ -1,5567 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include "seer_robokit_agv.h" - -namespace cmvr::device { - -class SeerRobokitAgvTestPeer { -public: - static void installSockets( - SeerRobokitAgv& agv, - const int status, - const int control, - const int navigation, - const int config, - const int other) - { - agv.sock_status_ = status; - agv.sock_control_ = control; - agv.sock_navigation_ = navigation; - agv.sock_config_ = config; - agv.sock_other_ = other; - } - - static void cacheRuntimeState(SeerRobokitAgv& agv, const Json::Value& payload) - { - agv.updateCachedRuntimeState_(payload); - } - - static void setAdapterError(SeerRobokitAgv& agv, std::string error) - { - std::lock_guard lock(agv.mutex_); - agv.last_error_ = std::move(error); - } - - static void setFaultStateUnknown(SeerRobokitAgv& agv) - { - agv.invalidateControllerFaultState_(); - } - - static void setFaultStateAge( - SeerRobokitAgv& agv, - const std::chrono::milliseconds age) - { - std::lock_guard lock(agv.runtime_state_mutex_); - agv.controller_fault_state_observed_ = true; - agv.controller_fault_state_observed_at_ = - std::chrono::steady_clock::now() - age; - agv.active_controller_fault_detail_.clear(); - } - - static bool hasTrackedPoseTask(const SeerRobokitAgv& agv) - { - SeerRobokitAgv::PoseTaskContext context; - return agv.currentPoseTask_(context); - } - - static bool hasTrackedNavigation( - const SeerRobokitAgv& agv, - const AgvTaskType expected_type) - { - SeerRobokitAgv::TrackedNavigationContext context; - return agv.currentTrackedNavigation_(context) - && context.type == expected_type; - } - - static AgvResult disconnect(SeerRobokitAgv& agv) - { - return agv.disconnect_(); - } - - static void setNavigationReceiveTimeout( - SeerRobokitAgv& agv, - const std::chrono::milliseconds timeout) - { - timeval value{}; - value.tv_sec = static_cast(timeout.count() / 1000); - value.tv_usec = static_cast( - (timeout.count() % 1000) * 1000); - ASSERT_EQ( - ::setsockopt( - agv.sock_navigation_, - SOL_SOCKET, - SO_RCVTIMEO, - &value, - sizeof(value)), - 0); - } - - static void setStatusReceiveTimeout( - SeerRobokitAgv& agv, - const std::chrono::milliseconds timeout) - { - timeval value{}; - value.tv_sec = static_cast(timeout.count() / 1000); - value.tv_usec = static_cast( - (timeout.count() % 1000) * 1000); - ASSERT_EQ( - ::setsockopt( - agv.sock_status_, - SOL_SOCKET, - SO_RCVTIMEO, - &value, - sizeof(value)), - 0); - } - - static void closeNavigationSocket(SeerRobokitAgv& agv) - { - std::lock_guard lock(agv.mutex_); - agv.closeSocket_(agv.sock_navigation_); - } -}; - -namespace { - -constexpr std::uint16_t kRobotStatusTask = 1020; -constexpr std::uint16_t kRobotStatusLoc = 1004; -constexpr std::uint16_t kRobotStatusAll2 = 1101; -constexpr std::uint16_t kRobotStatusTaskPackage = 1110; -constexpr std::uint16_t kRobotControlStop = 2000; -constexpr std::uint16_t kRobotControlMotion = 2010; -constexpr std::uint16_t kRobotControlLoadMap = 2022; -constexpr std::uint16_t kRobotTaskPause = 3001; -constexpr std::uint16_t kRobotTaskResume = 3002; -constexpr std::uint16_t kRobotTaskCancel = 3003; -constexpr std::uint16_t kRobotTaskGoTarget = 3051; -constexpr std::uint16_t kRobotTaskGoTargetList = 3066; -constexpr std::uint16_t kRobotTaskClearTargetList = 3067; -constexpr std::uint16_t kRobotConfigLock = 4005; -constexpr std::uint16_t kRobotConfigClearFault = 4009; -constexpr std::uint16_t kRobotConfigUploadMap = 4010; -constexpr std::uint16_t kRobotConfigDownloadMap = 4011; -constexpr std::uint16_t kRobotOtherStartMapping = 6100; -constexpr std::uint16_t kRobotOtherStopMapping = 6101; - -enum class Channel : std::size_t { - Status = 0, - Control, - Navigation, - Config, - Other, - Count -}; - -struct CommandRecord { - std::uint16_t command{0}; - std::string payload; -}; - -Json::Value parsePayload(const CommandRecord& record) -{ - Json::Value payload; - Json::CharReaderBuilder builder; - std::string error; - std::unique_ptr reader(builder.newCharReader()); - if (!reader->parse( - record.payload.data(), - record.payload.data() + record.payload.size(), - &payload, - &error)) { - ADD_FAILURE() << "Failed to parse command " << record.command - << " payload: " << error; - } - return payload; -} - -const Json::Value& payloadValue(const Json::Value& payload, const char* key) -{ - const auto* value = payload.find(key, key + std::strlen(key)); - if (!value) { - ADD_FAILURE() << "Missing JSON field: " << key; - static const Json::Value null_value; - return null_value; - } - return *value; -} - -bool payloadHas(const Json::Value& payload, const char* key) -{ - return payload.find(key, key + std::strlen(key)) != nullptr; -} - -AgvMotionOptions asynchronousMotionOptions() -{ - AgvMotionOptions options; - options.asynchronous = true; - return options; -} - -bool receiveExact(const int fd, void* output, const std::size_t size) -{ - auto* bytes = static_cast(output); - std::size_t offset = 0; - while (offset < size) { - const auto count = ::recv(fd, bytes + offset, size - offset, 0); - if (count > 0) { - offset += static_cast(count); - continue; - } - if (count < 0 && errno == EINTR) { - continue; - } - return false; - } - return true; -} - -bool sendAll(const int fd, const std::vector& data) -{ - std::size_t offset = 0; - while (offset < data.size()) { - const auto count = ::send( - fd, - data.data() + offset, - data.size() - offset, - MSG_NOSIGNAL); - if (count > 0) { - offset += static_cast(count); - continue; - } - if (count < 0 && errno == EINTR) { - continue; - } - return false; - } - return true; -} - -std::vector responseFrame( - const std::uint16_t response_command, - const std::string& payload) -{ - std::vector frame(16 + payload.size(), 0); - frame[0] = 0x5A; - frame[1] = 0x01; - frame[3] = 0x01; - const auto length = static_cast(payload.size()); - frame[4] = static_cast((length >> 24U) & 0xFFU); - frame[5] = static_cast((length >> 16U) & 0xFFU); - frame[6] = static_cast((length >> 8U) & 0xFFU); - frame[7] = static_cast(length & 0xFFU); - frame[8] = static_cast((response_command >> 8U) & 0xFFU); - frame[9] = static_cast(response_command & 0xFFU); - std::copy(payload.begin(), payload.end(), frame.begin() + 16); - return frame; -} - -std::string injectRequestedTaskId( - std::string response_payload, - const std::string& request_payload) -{ - constexpr char kTaskIdToken[] = "${TASK_ID}"; - Json::Value request; - Json::CharReaderBuilder builder; - std::string error; - std::unique_ptr reader(builder.newCharReader()); - if (!reader->parse( - request_payload.data(), - request_payload.data() + request_payload.size(), - &request, - &error)) { - return response_payload; - } - const auto* task_ids = request.find("task_ids", "task_ids" + std::strlen("task_ids")); - if (!task_ids || !task_ids->isArray() || task_ids->empty()) { - return response_payload; - } - - const auto replace_all = [&response_payload]( - const std::string& token, - const std::string& value) { - std::size_t position = 0; - while ((position = response_payload.find(token, position)) - != std::string::npos) { - response_payload.replace(position, token.size(), value); - position += value.size(); - } - }; - for (Json::ArrayIndex index = 0; index < task_ids->size(); ++index) { - replace_all( - "${TASK_ID_" + std::to_string(index) + "}", - (*task_ids)[index].asString()); - } - replace_all(kTaskIdToken, (*task_ids)[0].asString()); - return response_payload; -} - -class FakeSeerRobokitController { -public: - FakeSeerRobokitController() - { - for (auto& endpoint : endpoints_) { - int pair[2]{-1, -1}; - if (::socketpair(AF_UNIX, SOCK_STREAM, 0, pair) != 0) { - throw std::runtime_error("socketpair failed"); - } - endpoint.client = pair[0]; - endpoint.server = pair[1]; - } - for (std::size_t index = 0; index < endpoints_.size(); ++index) { - endpoints_[index].worker = std::thread( - &FakeSeerRobokitController::serve, - this, - index); - } - } - - ~FakeSeerRobokitController() - { - for (auto& endpoint : endpoints_) { - if (endpoint.client >= 0) { - ::shutdown(endpoint.client, SHUT_RDWR); - ::close(endpoint.client); - endpoint.client = -1; - } - if (endpoint.server >= 0) { - ::shutdown(endpoint.server, SHUT_RDWR); - } - } - for (auto& endpoint : endpoints_) { - if (endpoint.worker.joinable()) { - endpoint.worker.join(); - } - if (endpoint.server >= 0) { - ::close(endpoint.server); - endpoint.server = -1; - } - } - } - - int takeClient(const Channel channel) - { - auto& endpoint = endpoints_[static_cast(channel)]; - const int client = endpoint.client; - endpoint.client = -1; - return client; - } - - void setResponseCode(const std::uint16_t command, const int ret_code) - { - std::lock_guard lock(response_codes_mutex_); - response_codes_[command] = ret_code; - response_payloads_.erase(command); - } - - void setResponsePayload(const std::uint16_t command, std::string payload) - { - std::lock_guard lock(response_codes_mutex_); - response_codes_.erase(command); - response_payloads_[command] = {std::move(payload)}; - } - - void queueResponsePayload(const std::uint16_t command, std::string payload) - { - std::lock_guard lock(response_codes_mutex_); - response_codes_.erase(command); - response_payloads_[command].push_back(std::move(payload)); - } - - void setResponseDelay( - const std::uint16_t command, - const std::chrono::milliseconds delay) - { - std::lock_guard lock(response_codes_mutex_); - response_delays_[command] = delay; - } - - void setResponseCommand( - const std::uint16_t request_command, - const std::uint16_t response_command) - { - std::lock_guard lock(response_codes_mutex_); - response_commands_[request_command] = response_command; - } - - void clearRecords() - { - std::lock_guard lock(records_mutex_); - records_.clear(); - } - - std::vector records() const - { - std::lock_guard lock(records_mutex_); - return records_; - } - -private: - struct Endpoint { - int client{-1}; - int server{-1}; - std::thread worker; - }; - - void serve(const std::size_t index) - { - const int fd = endpoints_[index].server; - while (true) { - std::array header{}; - if (!receiveExact(fd, header.data(), header.size())) { - return; - } - const auto length = (static_cast(header[4]) << 24U) - | (static_cast(header[5]) << 16U) - | (static_cast(header[6]) << 8U) - | static_cast(header[7]); - const auto command = static_cast( - (static_cast(header[8]) << 8U) | header[9]); - std::string payload(length, '\0'); - if (length > 0 && !receiveExact(fd, payload.data(), payload.size())) { - return; - } - { - std::lock_guard lock(records_mutex_); - records_.push_back({command, payload}); - } - int ret_code = 0; - std::string response_payload; - std::chrono::milliseconds response_delay{0}; - std::uint16_t response_command = static_cast( - command + 10000U); - { - std::lock_guard lock(response_codes_mutex_); - const auto payloads = response_payloads_.find(command); - if (payloads != response_payloads_.end() && !payloads->second.empty()) { - response_payload = payloads->second.front(); - if (payloads->second.size() > 1U) { - payloads->second.pop_front(); - } - } - const auto response_code = response_codes_.find(command); - if (response_code != response_codes_.end()) { - ret_code = response_code->second; - } - const auto delay = response_delays_.find(command); - if (delay != response_delays_.end()) { - response_delay = delay->second; - } - const auto response_command_override = response_commands_.find(command); - if (response_command_override != response_commands_.end()) { - response_command = response_command_override->second; - } - } - if (response_delay.count() > 0) { - std::this_thread::sleep_for(response_delay); - } - if (response_payload.empty()) { - response_payload = ret_code == 0 - ? R"({"ret_code":0,"err_msg":""})" - : "{\"ret_code\":" + std::to_string(ret_code) - + R"(,"err_msg":"simulated command failure"})"; - } - response_payload = injectRequestedTaskId( - std::move(response_payload), - payload); - if (!sendAll(fd, responseFrame(response_command, response_payload))) { - return; - } - } - } - - std::array(Channel::Count)> endpoints_; - mutable std::mutex records_mutex_; - std::vector records_; - std::mutex response_codes_mutex_; - std::unordered_map response_codes_; - std::unordered_map> response_payloads_; - std::unordered_map response_delays_; - std::unordered_map response_commands_; -}; - -class SeerRobokitControlAuthorityTest : public ::testing::Test { -protected: - void SetUp() override - { - config::SeerRobokitAgvConfig cfg; - cfg.set_id("src1100"); - cfg.set_ip("invalid-ip"); - cfg.set_recv_timeout_ms(100); - cfg.set_control_nick_name("cmvr-test"); - cfg.set_enable_state_push(true); - cfg.set_state_push_interval_ms(200); - controller_.setResponsePayload( - kRobotStatusTask, - R"({"ret_code":0,"err_msg":"","task_status":2,"task_type":1,"target_point":[1.0,2.0,0.5]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"err_msg":"","task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"err_msg":"","task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[],"warnings":[]})"); - agv_ = std::make_unique(cfg); - const int status_socket = controller_.takeClient(Channel::Status); - const int control_socket = controller_.takeClient(Channel::Control); - const int navigation_socket = controller_.takeClient(Channel::Navigation); - const int config_socket = controller_.takeClient(Channel::Config); - const int other_socket = controller_.takeClient(Channel::Other); - SeerRobokitAgvTestPeer::installSockets( - *agv_, - status_socket, - control_socket, - navigation_socket, - config_socket, - other_socket); - Json::Value fault_state_push(Json::objectValue); - *fault_state_push.demand( - "errors", - "errors" + std::strlen("errors")) = - Json::Value(Json::arrayValue); - *fault_state_push.demand( - "fatals", - "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_state_push); - } - - void TearDown() override - { - agv_.reset(); - } - - void expectControlledSequence( - const std::vector& commands, - const std::function& invoke) - { - controller_.clearRecords(); - const auto result = invoke(); - ASSERT_TRUE(result.ok()) << result.message; - - const auto records = controller_.records(); - ASSERT_EQ(records.size(), commands.size() + 1U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - for (std::size_t index = 0; index < commands.size(); ++index) { - EXPECT_EQ(records[index + 1U].command, commands[index]); - } - - Json::Value lock_payload; - Json::CharReaderBuilder builder; - std::string error; - std::unique_ptr reader(builder.newCharReader()); - ASSERT_TRUE(reader->parse( - records[0].payload.data(), - records[0].payload.data() + records[0].payload.size(), - &lock_payload, - &error)) << error; - constexpr char kNickName[] = "nick_name"; - const auto* nick_name = lock_payload.find( - kNickName, - kNickName + std::strlen(kNickName)); - ASSERT_NE(nick_name, nullptr); - EXPECT_EQ(nick_name->asString(), "cmvr-test"); - } - - void expectControlled( - const std::uint16_t command, - const std::function& invoke) - { - expectControlledSequence({command}, invoke); - } - - bool waitForCommandCount( - const std::uint16_t command, - const std::size_t expected_count, - const int max_attempts = 3000) const - { - for (int attempt = 0; attempt < max_attempts; ++attempt) { - const auto records = controller_.records(); - const auto count = static_cast(std::count_if( - records.begin(), - records.end(), - [command](const CommandRecord& record) { - return record.command == command; - })); - if (count >= expected_count) { - return true; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - return false; - } - - FakeSeerRobokitController controller_; - std::unique_ptr agv_; -}; - -TEST_F(SeerRobokitControlAuthorityTest, DeclaresSynchronousActionSupport) -{ - EXPECT_TRUE(agv_->supportsSynchronousAction( - AgvActionKind::NavigateToPose)); - EXPECT_TRUE(agv_->supportsSynchronousAction( - AgvActionKind::NavigateToStation)); - EXPECT_TRUE(agv_->supportsSynchronousAction( - AgvActionKind::FollowPath)); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - ConfirmMotionStoppedWithoutTrackedTaskUsesGlobalStatusOnly) -{ - controller_.clearRecords(); - - const auto result = agv_->confirmMotionStopped(); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusAll2; - }), - 2); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - ConfirmMotionStoppedForTrackedStationChecksExactTaskAndGlobalVelocity) -{ - const auto navigate_result = agv_->navigateToStation( - "station-confirm-stop", - asynchronousMotionOptions()); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":2}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":2,"target_id":"station-confirm-stop","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.clearRecords(); - - const auto result = agv_->confirmMotionStopped(); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - EXPECT_GE( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }), - 2); - EXPECT_GE( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusAll2; - }), - 2); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - ConfirmMotionStoppedTimesOutWhenTrackedTaskIsTerminalButVelocityIsNonzero) -{ - const auto navigate_result = agv_->navigateToStation( - "station-still-moving", - asynchronousMotionOptions()); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":2}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":2,"target_id":"station-still-moving","blocked":false,"vx":0.1,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.clearRecords(); - - const auto result = agv_->confirmMotionStopped(); - - EXPECT_EQ(result.code, AgvErrorCode::Timeout); - EXPECT_NE( - result.message.find("stopped velocity were not confirmed"), - std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - ConfirmMotionStoppedWaitsForGlobalTaskToBecomeTerminal) -{ - const auto navigate_result = agv_->navigateToStation( - "station-global-active", - asynchronousMotionOptions()); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":2}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":2,"target_id":"station-global-active","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.clearRecords(); - std::atomic finished{false}; - AgvResult result; - - std::thread confirmation([this, &finished, &result]() { - result = agv_->confirmMotionStopped(); - finished.store(true, std::memory_order_release); - }); - const bool zero_samples_observed = waitForCommandCount( - kRobotStatusAll2, 2, 1000); - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - const bool returned_while_global_active = - finished.load(std::memory_order_acquire); - - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":2,"target_id":"station-global-active","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - confirmation.join(); - - EXPECT_TRUE(zero_samples_observed); - EXPECT_FALSE(returned_while_global_active); - EXPECT_TRUE(result.ok()) << result.message; -} - -TEST_F(SeerRobokitControlAuthorityTest, EveryImplementedMutatingOperationAcquiresAuthorityFirst) -{ - controller_.clearRecords(); - const auto pose_result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(pose_result.ok()) << pose_result.message; - const auto pose_records = controller_.records(); - ASSERT_GE(pose_records.size(), 4U); - EXPECT_EQ(pose_records[0].command, kRobotConfigLock); - EXPECT_EQ(pose_records[1].command, kRobotTaskGoTarget); - for (std::size_t index = 2; index < pose_records.size(); ++index) { - EXPECT_EQ(pose_records[index].command, kRobotStatusTaskPackage); - } - expectControlled(kRobotTaskGoTarget, [this]() { - return agv_->navigateToStation("station-1", asynchronousMotionOptions()); - }); - expectControlled(kRobotTaskGoTargetList, [this]() { - return agv_->followPath( - {AgvPathSegment{"station-1", "station-2"}}, - asynchronousMotionOptions()); - }); - expectControlled(kRobotTaskPause, [this]() { - return agv_->pauseNavigation(); - }); - expectControlled(kRobotTaskResume, [this]() { - return agv_->resumeNavigation(); - }); - controller_.clearRecords(); - const auto cancel_result = agv_->cancelNavigation(); - ASSERT_TRUE(cancel_result.ok()) << cancel_result.message; - const auto cancel_records = controller_.records(); - ASSERT_EQ(cancel_records.size(), 4U); - EXPECT_EQ(cancel_records[0].command, kRobotStatusTaskPackage); - EXPECT_EQ(cancel_records[1].command, kRobotStatusAll2); - EXPECT_EQ(cancel_records[2].command, kRobotConfigLock); - EXPECT_EQ(cancel_records[3].command, kRobotTaskClearTargetList); - expectControlledSequence( - {kRobotControlStop, kRobotTaskClearTargetList}, - [this]() { - return agv_->emergencyStop(); - }); - expectControlled(kRobotConfigClearFault, [this]() { - return agv_->clearFault(); - }); - expectControlled(kRobotControlMotion, [this]() { - return agv_->setVelocity(AgvVelocity{0.1, 0.0, 0.2}); - }); - expectControlled(kRobotControlMotion, [this]() { - return agv_->stopVelocityControl(); - }); - expectControlled(kRobotControlLoadMap, [this]() { - return agv_->switchMap("map-1"); - }); - expectControlled(kRobotConfigUploadMap, [this]() { - return agv_->uploadMap("map-1", "{}"); - }); - expectControlled(kRobotOtherStartMapping, [this]() { - return agv_->startMapping(); - }); - expectControlled(kRobotOtherStopMapping, [this]() { - return agv_->stopMapping(); - }); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousPoseNavigationWaitsForVerifiedCompletionAndStoppedVelocity) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":1,"blocked":false,"vx":0.1,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5,"confidence":1.0})"); - AgvMotionOptions options; - options.asynchronous = false; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - finished.store(true, std::memory_order_release); - }); - - const bool terminal_wait_observed = waitForCommandCount( - kRobotStatusAll2, - 2); - EXPECT_TRUE(terminal_wait_observed); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; - EXPECT_TRUE(finished.load(std::memory_order_acquire)); - const auto records = controller_.records(); - EXPECT_GE( - static_cast(std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusAll2; - })), - 3U); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousPoseRechecksTargetAfterCompletedTaskStops) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":1,"blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.2,"y":2.0,"angle":0.5})"); - AgvMotionOptions options; - options.wait_timeout_ms = 2000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - finished.store(true, std::memory_order_release); - }); - - const bool moving_completion_observed = - waitForCommandCount(kRobotStatusAll2, 2); - EXPECT_TRUE(moving_completion_observed); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - const auto moving_records = controller_.records(); - EXPECT_EQ( - std::count_if( - moving_records.begin(), - moving_records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusLoc; - }), - 0); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskRejected); - EXPECT_NE( - result.message.find("final pose was outside"), - std::string::npos); - EXPECT_NE( - result.message.find("distance_error=0.2"), - std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousPoseReconcilesIndeterminateCommandAcknowledgment) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":1,"blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.setResponsePayload( - kRobotTaskGoTarget, - R"({"err_msg":"pose acknowledgment lost"})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5})"); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - finished.store(true, std::memory_order_release); - }); - - const bool pose_status_observed = waitForCommandCount( - kRobotStatusTaskPackage, - 3, - 1000); - EXPECT_TRUE(pose_status_observed); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; - EXPECT_NE( - result.message.find("indeterminate command acknowledgment"), - std::string::npos); - EXPECT_NE( - result.message.find("missing a numeric ret_code"), - std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - PoseWaitDoesNotLetGlobalTerminalOverrideExactRunningAfterGrace) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":5,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5})"); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - finished.store(true, std::memory_order_release); - }); - - const bool grace_elapsed_while_polling = waitForCommandCount( - kRobotStatusTaskPackage, - 90, - 2500); - EXPECT_TRUE(grace_elapsed_while_polling); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - const auto records_before_completion = controller_.records(); - EXPECT_EQ( - std::count_if( - records_before_completion.begin(), - records_before_completion.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousStationNavigationWaitsForExactTaskCompletion) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":2,"target_id":"station-2","blocked":false,"vx":0.1,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":2}]}})"); - AgvMotionOptions options; - options.asynchronous = false; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToStation("station-2", options); - finished.store(true, std::memory_order_release); - }); - - const bool terminal_wait_observed = waitForCommandCount( - kRobotStatusAll2, - 2); - EXPECT_TRUE(terminal_wait_observed); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":2}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":2,"target_id":"station-2","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - const auto command = std::find_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskGoTarget; - }); - ASSERT_NE(command, records.end()); - const auto payload = parsePayload(*command); - EXPECT_FALSE(payloadValue(payload, "task_id").asString().empty()); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousStationAcceptsExactCompletionAfterGlobalStateClears) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":2}]}})"); - AgvMotionOptions options; - options.wait_timeout_ms = 2500; - options.poll_interval_ms = 20; - - const auto result = agv_->navigateToStation( - "station-cleared", - options); - - ASSERT_TRUE(result.ok()) << result.message; -} - -TEST_F( - SeerRobokitControlAuthorityTest, - StationWaitIgnoresStaleGlobalTaskUntilExactTaskIdAppears) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":1,"blocked":false,"vx":0.1,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":5,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":2,"target_id":"station-delayed","blocked":false,"vx":0.1,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[]}})"); - controller_.queueResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":2}]}})"); - AgvMotionOptions options; - options.wait_timeout_ms = 2000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToStation("station-delayed", options); - finished.store(true, std::memory_order_release); - }); - - const bool exact_task_appeared = waitForCommandCount( - kRobotStatusTaskPackage, - 3, - 1000); - EXPECT_TRUE(exact_task_appeared); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - const auto records_before_completion = controller_.records(); - EXPECT_EQ( - std::count_if( - records_before_completion.begin(), - records_before_completion.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":2}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":2,"target_id":"station-delayed","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousStationReconcilesIndeterminateCommandAcknowledgment) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":2,"target_id":"station-ack","blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":2}]}})"); - controller_.setResponsePayload( - kRobotTaskGoTarget, - R"({"err_msg":"station acknowledgment lost"})"); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToStation("station-ack", options); - finished.store(true, std::memory_order_release); - }); - - const bool station_status_observed = waitForCommandCount( - kRobotStatusTaskPackage, - 3, - 1000); - EXPECT_TRUE(station_status_observed); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":2}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":2,"target_id":"station-ack","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; - EXPECT_NE( - result.message.find("indeterminate command acknowledgment"), - std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - StationWaitDoesNotLetGlobalTerminalOverrideExactRunningAfterGrace) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":5,"task_type":2,"target_id":"station-current","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":2}]}})"); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToStation("station-current", options); - finished.store(true, std::memory_order_release); - }); - - const bool grace_elapsed_while_polling = waitForCommandCount( - kRobotStatusTaskPackage, - 90, - 2500); - EXPECT_TRUE(grace_elapsed_while_polling); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - const auto records_before_completion = controller_.records(); - EXPECT_EQ( - std::count_if( - records_before_completion.begin(), - records_before_completion.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":2}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":2,"target_id":"station-current","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousStationMapsTaskStatusSevenToFailedAfterStop) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":7,"task_type":2,"target_id":"station-timeout","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":7,"type":2}]}})"); - AgvMotionOptions options; - options.wait_timeout_ms = 1000; - options.poll_interval_ms = 20; - controller_.clearRecords(); - - const auto result = agv_->navigateToStation( - "station-timeout", - options); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - EXPECT_NE(result.message.find("task_status=7"), std::string::npos); - EXPECT_NE( - result.message.find("stopped velocity confirmed"), - std::string::npos); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousFollowPathWaitsForFinalExactTaskAndStoppedVelocity) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.1,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":2},{"task_id":"${TASK_ID_1}","status":1}]}})"); - AgvMotionOptions options; - options.asynchronous = false; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->followPath( - { - AgvPathSegment{"station-1", "station-2"}, - AgvPathSegment{"station-2", "station-3"}, - }, - options); - finished.store(true, std::memory_order_release); - }); - - const bool terminal_wait_observed = waitForCommandCount( - kRobotStatusAll2, - 2); - EXPECT_TRUE(terminal_wait_observed); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - - const auto records_before_completion = controller_.records(); - const auto all2_count_before_completion = static_cast( - std::count_if( - records_before_completion.begin(), - records_before_completion.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusAll2; - })); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":4},{"task_id":"${TASK_ID_1}","status":4}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - const bool completed_moving_sample_observed = waitForCommandCount( - kRobotStatusAll2, - all2_count_before_completion + 2U); - EXPECT_TRUE(completed_moving_sample_observed); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - const auto command = std::find_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskGoTargetList; - }); - ASSERT_NE(command, records.end()); - const auto payload = parsePayload(*command); - const auto& tasks = payloadValue(payload, "move_task_list"); - ASSERT_TRUE(tasks.isArray()); - ASSERT_EQ(tasks.size(), 2U); - const std::string first_task_id = - payloadValue(tasks[0], "task_id").asString(); - const std::string final_task_id = - payloadValue(tasks[1], "task_id").asString(); - EXPECT_FALSE(first_task_id.empty()); - EXPECT_FALSE(final_task_id.empty()); - EXPECT_NE(first_task_id, final_task_id); - - const auto status_query = std::find_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - ASSERT_NE(status_query, records.end()); - const auto status_payload = parsePayload(*status_query); - const auto& requested_ids = payloadValue(status_payload, "task_ids"); - ASSERT_TRUE(requested_ids.isArray()); - ASSERT_EQ(requested_ids.size(), 2U); - EXPECT_EQ(requested_ids[0].asString(), first_task_id); - EXPECT_EQ(requested_ids[1].asString(), final_task_id); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - FollowPathDoesNotFinishWhileEarlierExactSegmentIsStillActive) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":2},{"task_id":"${TASK_ID_1}","status":4}]}})"); - AgvMotionOptions options; - options.wait_timeout_ms = 2000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->followPath( - { - AgvPathSegment{"station-1", "station-2"}, - AgvPathSegment{"station-2", "station-3"}, - }, - options); - finished.store(true, std::memory_order_release); - }); - - const bool continued_polling = waitForCommandCount( - kRobotStatusTaskPackage, - 5, - 1000); - EXPECT_TRUE(continued_polling); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":4},{"task_id":"${TASK_ID_1}","status":4}]}})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousFollowPathReconcilesIndeterminateCommandAcknowledgment) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":2},{"task_id":"${TASK_ID_1}","status":1}]}})"); - controller_.setResponsePayload( - kRobotTaskGoTargetList, - R"({"err_msg":"path acknowledgment lost"})"); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->followPath( - { - AgvPathSegment{"station-1", "station-2"}, - AgvPathSegment{"station-2", "station-3"}, - }, - options); - finished.store(true, std::memory_order_release); - }); - - const bool path_status_observed = waitForCommandCount( - kRobotStatusTaskPackage, - 3, - 1000); - EXPECT_TRUE(path_status_observed); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":4},{"task_id":"${TASK_ID_1}","status":4}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; - EXPECT_NE( - result.message.find("indeterminate command acknowledgment"), - std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - TerminalPathTimeoutRetainsTrackingUntilStoppedVelocityIsConfirmed) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":4},{"task_id":"${TASK_ID_1}","status":4}]}})"); - AgvMotionOptions options; - options.wait_timeout_ms = 100; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->followPath( - { - AgvPathSegment{"station-1", "station-2"}, - AgvPathSegment{"station-2", "station-3"}, - }, - options); - finished.store(true, std::memory_order_release); - }); - - const bool timeout_cleanup_started = waitForCommandCount( - kRobotStatusAll2, - 2, - 1000); - EXPECT_TRUE(timeout_cleanup_started); - std::this_thread::sleep_for(std::chrono::milliseconds(150)); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - EXPECT_TRUE(SeerRobokitAgvTestPeer::hasTrackedNavigation( - *agv_, - AgvTaskType::FollowPath)); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_EQ(result.code, AgvErrorCode::Timeout); - EXPECT_NE( - result.message.find("stopped state was confirmed"), - std::string::npos); - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedNavigation( - *agv_, - AgvTaskType::FollowPath)); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskClearTargetList; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - TerminalPoseTimeoutRetainsTrackingUntilStoppedVelocityIsConfirmed) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":1,"blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5})"); - AgvMotionOptions options; - options.wait_timeout_ms = 100; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - finished.store(true, std::memory_order_release); - }); - - const bool timeout_cleanup_started = waitForCommandCount( - kRobotStatusAll2, - 2, - 1000); - EXPECT_TRUE(timeout_cleanup_started); - std::this_thread::sleep_for(std::chrono::milliseconds(150)); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - EXPECT_TRUE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - EXPECT_TRUE(SeerRobokitAgvTestPeer::hasTrackedNavigation( - *agv_, - AgvTaskType::NavigateToPose)); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_EQ(result.code, AgvErrorCode::Timeout); - EXPECT_NE( - result.message.find("stopped state was confirmed"), - std::string::npos); - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedNavigation( - *agv_, - AgvTaskType::NavigateToPose)); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - PersistentBlockedNavigationConditionallyCancelsAndConfirmsStoppedTask) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":2,"target_id":"station-blocked","blocked":true,"block_reason":3,"block_x":1.2,"block_y":0.1,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":2}]}})"); - controller_.setResponseDelay( - kRobotTaskCancel, - std::chrono::milliseconds(50)); - AgvMotionOptions options; - options.asynchronous = false; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToStation("station-blocked", options); - finished.store(true, std::memory_order_release); - }); - - const bool cancel_observed = waitForCommandCount(kRobotTaskCancel, 1); - EXPECT_TRUE(cancel_observed); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":6,"type":2}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":6,"task_type":2,"target_id":"station-blocked","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - EXPECT_NE(result.message.find("block_reason=3(collision)"), std::string::npos); - EXPECT_NE(result.message.find("canceled"), std::string::npos); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 1); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotConfigLock; - }), - 2); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - FollowPathUsesUniqueTaskIdsAcrossCalls) -{ - controller_.clearRecords(); - const auto first_result = agv_->followPath( - {AgvPathSegment{"station-1", "station-2"}}, - asynchronousMotionOptions()); - ASSERT_TRUE(first_result.ok()) << first_result.message; - const auto first_records = controller_.records(); - const auto first_command = std::find_if( - first_records.begin(), - first_records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskGoTargetList; - }); - ASSERT_NE(first_command, first_records.end()); - const auto first_payload = parsePayload(*first_command); - const std::string first_task_id = payloadValue( - payloadValue(first_payload, "move_task_list")[0], - "task_id").asString(); - - controller_.clearRecords(); - const auto second_result = agv_->followPath( - {AgvPathSegment{"station-1", "station-2"}}, - asynchronousMotionOptions()); - ASSERT_TRUE(second_result.ok()) << second_result.message; - const auto second_records = controller_.records(); - const auto second_command = std::find_if( - second_records.begin(), - second_records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskGoTargetList; - }); - ASSERT_NE(second_command, second_records.end()); - const auto second_payload = parsePayload(*second_command); - const std::string second_task_id = payloadValue( - payloadValue(second_payload, "move_task_list")[0], - "task_id").asString(); - - EXPECT_FALSE(first_task_id.empty()); - EXPECT_FALSE(second_task_id.empty()); - EXPECT_NE(first_task_id, second_task_id); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - ExactTaskStatusWithoutTypeStillConfirmsAsynchronousPoseStart) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2}]}})"); - - const auto result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - asynchronousMotionOptions()); - - ASSERT_TRUE(result.ok()) << result.message; -} - -TEST_F( - SeerRobokitControlAuthorityTest, - PoseStartTreatsTaskStatus404AsNotYetPresent) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":404,"type":1}]}})"); - controller_.queueResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - asynchronousMotionOptions()); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - EXPECT_GE( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }), - 3); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - PoseStartMapsControllerTaskStatusSevenToTaskFailed) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"controller terminated free navigation","task_status_list":[{"task_id":"${TASK_ID}","status":7,"type":1}]}})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - EXPECT_NE(result.message.find("controller terminated free navigation"), std::string::npos); - EXPECT_NE(result.message.find("task_status=7"), std::string::npos); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - CancelNavigationClearsTrackedAsynchronousPathWithCommand3067) -{ - const auto path_result = agv_->followPath( - {AgvPathSegment{"station-1", "station-2"}}, - asynchronousMotionOptions()); - ASSERT_TRUE(path_result.ok()) << path_result.message; - ASSERT_TRUE(SeerRobokitAgvTestPeer::hasTrackedNavigation( - *agv_, - AgvTaskType::FollowPath)); - controller_.clearRecords(); - - const auto cancel_result = agv_->cancelNavigation(); - - ASSERT_TRUE(cancel_result.ok()) << cancel_result.message; - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskClearTargetList; - }), - 1); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigationDefaultsToSynchronousAndRejectsUnboundedPolling) -{ - EXPECT_FALSE(AgvMotionOptions{}.asynchronous); - - AgvMotionOptions options; - options.poll_interval_ms = 5001; - controller_.clearRecords(); - const auto result = agv_->navigateToStation("station-1", options); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE(result.message.find("must not exceed 5000"), std::string::npos); - EXPECT_TRUE(controller_.records().empty()); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - PreCanceledNavigationDoesNotAcquireAuthorityOrSendMotion) -{ - AgvMotionOptions options; - options.cancellation_requested = []() { return true; }; - - controller_.clearRecords(); - const auto pose_result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - EXPECT_EQ(pose_result.code, AgvErrorCode::TaskCanceled); - EXPECT_TRUE(controller_.records().empty()); - - const auto station_result = - agv_->navigateToStation("station-1", options); - EXPECT_EQ(station_result.code, AgvErrorCode::TaskCanceled); - EXPECT_TRUE(controller_.records().empty()); - - const auto path_result = agv_->followPath( - {AgvPathSegment{"station-1", "station-2"}}, - options); - EXPECT_EQ(path_result.code, AgvErrorCode::TaskCanceled); - EXPECT_TRUE(controller_.records().empty()); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - CancellationDuringAuthorityAcquisitionPreventsNavigationWrite) -{ - std::atomic canceled{false}; - AgvMotionOptions options = asynchronousMotionOptions(); - options.cancellation_requested = [&canceled]() { - return canceled.load(std::memory_order_acquire); - }; - controller_.setResponseDelay( - kRobotConfigLock, - std::chrono::milliseconds(100)); - controller_.clearRecords(); - AgvResult result; - - std::thread navigation_thread([this, &options, &result]() { - result = agv_->navigateToStation("station-1", options); - }); - ASSERT_TRUE(waitForCommandCount(kRobotConfigLock, 1)); - canceled.store(true, std::memory_order_release); - navigation_thread.join(); - - EXPECT_EQ(result.code, AgvErrorCode::TaskCanceled); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskGoTarget; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousStationPublicCancelStillWaitsForTerminalZeroVelocity) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":2,"target_id":"station-public-cancel","blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":2}]}})"); - std::atomic caller_canceled{false}; - AgvMotionOptions options; - options.wait_timeout_ms = 2500; - options.poll_interval_ms = 20; - options.cancellation_requested = [&caller_canceled]() { - return caller_canceled.load(std::memory_order_acquire); - }; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread( - [this, &options, &finished, &result]() { - result = agv_->navigateToStation( - "station-public-cancel", - options); - finished.store(true, std::memory_order_release); - }); - - const bool terminal_wait_started = waitForCommandCount( - kRobotStatusAll2, - 2, - 1500); - const auto public_cancel_result = agv_->cancelNavigation(); - caller_canceled.store(true, std::memory_order_release); - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - const bool returned_while_exact_task_was_active = - finished.load(std::memory_order_acquire); - - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":6,"type":2}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":6,"task_type":2,"target_id":"station-public-cancel","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_TRUE(terminal_wait_started); - ASSERT_TRUE(public_cancel_result.ok()) - << public_cancel_result.message; - EXPECT_FALSE(returned_while_exact_task_was_active); - EXPECT_EQ(result.code, AgvErrorCode::TaskCanceled); - EXPECT_NE( - result.message.find("stopped state was confirmed"), - std::string::npos); - const auto records = controller_.records(); - EXPECT_GE( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 1); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - TerminalTaskWithoutVelocityStatusEscalatesToTrackedFailSafeStop) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":41101,"err_msg":"1101 unavailable after terminal task"})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":2}]}})"); - AgvMotionOptions options; - options.wait_timeout_ms = 100; - options.poll_interval_ms = 20; - controller_.clearRecords(); - - const auto result = agv_->navigateToStation( - "station-terminal-no-velocity", - options); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::Timeout); - EXPECT_NE( - result.message.find("tracked fail-safe software stop"), - std::string::npos); - EXPECT_NE( - result.message.find("stopped state remains unconfirmed"), - std::string::npos); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotControlStop; - }), - 1); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 1); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousPosePublicCancelStillWaitsForTerminalZeroVelocity) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":1,"blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - std::atomic caller_canceled{false}; - AgvMotionOptions options; - options.wait_timeout_ms = 2500; - options.poll_interval_ms = 20; - options.cancellation_requested = [&caller_canceled]() { - return caller_canceled.load(std::memory_order_acquire); - }; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread( - [this, &options, &finished, &result]() { - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - finished.store(true, std::memory_order_release); - }); - - const bool terminal_wait_started = waitForCommandCount( - kRobotStatusAll2, - 2, - 1500); - const auto public_cancel_result = agv_->cancelNavigation(); - caller_canceled.store(true, std::memory_order_release); - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - const bool returned_while_exact_task_was_active = - finished.load(std::memory_order_acquire); - - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":6,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":6,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_TRUE(terminal_wait_started); - ASSERT_TRUE(public_cancel_result.ok()) - << public_cancel_result.message; - EXPECT_FALSE(returned_while_exact_task_was_active); - EXPECT_EQ(result.code, AgvErrorCode::TaskCanceled); - EXPECT_NE( - result.message.find("stopped state was confirmed"), - std::string::npos); - const auto records = controller_.records(); - EXPECT_GE( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 1); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousStationEmergencyStopStillWaitsForTerminalZeroVelocity) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":2,"target_id":"station-emergency-stop","blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":2}]}})"); - AgvMotionOptions options; - options.wait_timeout_ms = 2500; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - - std::thread navigation_thread( - [this, &options, &finished, &result]() { - result = agv_->navigateToStation( - "station-emergency-stop", - options); - finished.store(true, std::memory_order_release); - }); - - const bool terminal_wait_started = waitForCommandCount( - kRobotStatusAll2, - 2, - 1500); - const auto emergency_stop_result = agv_->emergencyStop(); - const auto records_before_terminal = controller_.records(); - const auto exact_queries_before_terminal = - static_cast(std::count_if( - records_before_terminal.begin(), - records_before_terminal.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - })); - - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":6,"type":2}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":6,"task_type":2,"target_id":"station-emergency-stop","blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - const bool moving_terminal_observed = waitForCommandCount( - kRobotStatusTaskPackage, - exact_queries_before_terminal + 1U, - 1000); - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - const bool returned_while_velocity_was_nonzero = - finished.load(std::memory_order_acquire); - - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":6,"task_type":2,"target_id":"station-emergency-stop","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_TRUE(terminal_wait_started); - ASSERT_TRUE(emergency_stop_result.ok()) - << emergency_stop_result.message; - EXPECT_TRUE(moving_terminal_observed); - EXPECT_FALSE(returned_while_velocity_was_nonzero); - EXPECT_EQ(result.code, AgvErrorCode::TaskCanceled); - EXPECT_NE( - result.message.find("stopped velocity confirmed"), - std::string::npos); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotControlStop; - }), - 1); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 1); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SynchronousStationStatusTimeoutStillCancelsAndReportsUnconfirmedStop) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":2,"target_id":"station-status-timeout","blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":2}]}})"); - SeerRobokitAgvTestPeer::setStatusReceiveTimeout( - *agv_, - std::chrono::milliseconds(50)); - AgvMotionOptions options; - options.wait_timeout_ms = 2000; - options.poll_interval_ms = 100; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &result]() { - result = agv_->navigateToStation( - "station-status-timeout", - options); - }); - - const bool running_status_observed = waitForCommandCount( - kRobotStatusAll2, - 2, - 1000); - controller_.setResponseDelay( - kRobotStatusTaskPackage, - std::chrono::milliseconds(200)); - navigation_thread.join(); - - EXPECT_TRUE(running_status_observed); - EXPECT_EQ(result.code, AgvErrorCode::Timeout); - EXPECT_NE( - result.message.find("navigation cancel was sent"), - std::string::npos); - EXPECT_NE( - result.message.find("termination could not be queried"), - std::string::npos); - EXPECT_EQ( - result.message.find("stopped state was confirmed"), - std::string::npos); - const auto records = controller_.records(); - EXPECT_GE( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 1); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotControlStop; - }), - 1); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - FollowPathAcceptsCurrentSegmentOnlyTaskStatusProgression) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":3,"target_id":"station-2","blocked":false,"vx":0.1,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":2}]}})"); - controller_.queueResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[]}})"); - controller_.queueResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_1}","status":2}]}})"); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->followPath( - { - AgvPathSegment{"station-1", "station-2"}, - AgvPathSegment{"station-2", "station-3"}, - }, - options); - finished.store(true, std::memory_order_release); - }); - - ASSERT_TRUE(waitForCommandCount(kRobotStatusTaskPackage, 3)); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_1}","status":4}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); - const auto command = std::find_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskGoTargetList; - }); - ASSERT_NE(command, records.end()); - const auto command_payload = parsePayload(*command); - const auto& tasks = payloadValue(command_payload, "move_task_list"); - ASSERT_EQ(tasks.size(), 2U); - const std::string first_id = - payloadValue(tasks[0], "task_id").asString(); - const std::string second_id = - payloadValue(tasks[1], "task_id").asString(); - for (const auto& record : records) { - if (record.command != kRobotStatusTaskPackage) { - continue; - } - const auto payload = parsePayload(record); - const auto& requested = payloadValue(payload, "task_ids"); - ASSERT_EQ(requested.size(), 2U); - EXPECT_EQ(requested[0].asString(), first_id); - EXPECT_EQ(requested[1].asString(), second_id); - } -} - -TEST_F( - SeerRobokitControlAuthorityTest, - FailedStationTaskDoesNotReturnUntilStoppedVelocityIsConfirmed) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":5,"task_type":2,"target_id":"station-failed","blocked":false,"vx":0.1,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":5}]}})"); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToStation("station-failed", options); - finished.store(true, std::memory_order_release); - }); - - ASSERT_TRUE(waitForCommandCount(kRobotStatusAll2, 2)); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":5,"task_type":2,"target_id":"station-failed","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - EXPECT_NE(result.message.find("stopped velocity confirmed"), std::string::npos); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - FailedPathSegmentCancelsRemainingActiveSegmentsBeforeReturning) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":3,"target_id":"station-2","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":5},{"task_id":"${TASK_ID_1}","status":1}]}})"); - controller_.setResponseDelay( - kRobotTaskClearTargetList, - std::chrono::milliseconds(50)); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->followPath( - { - AgvPathSegment{"station-1", "station-2"}, - AgvPathSegment{"station-2", "station-3"}, - }, - options); - finished.store(true, std::memory_order_release); - }); - - ASSERT_TRUE(waitForCommandCount(kRobotTaskClearTargetList, 1)); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":5},{"task_id":"${TASK_ID_1}","status":6}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":6,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - EXPECT_NE(result.message.find("still active"), std::string::npos); - EXPECT_NE(result.message.find("conditionally canceled"), std::string::npos); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskClearTargetList; - }), - 1); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - CurrentSegmentOnlyFailureCancelsHiddenPathAndWaitsForGlobalTerminalStop) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":3,"target_id":"station-2","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - // This firmware shape reports only the current segment. The failed first - // segment is visible, while the later queued segment is temporarily absent. - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":5}]}})"); - controller_.setResponseDelay( - kRobotTaskClearTargetList, - std::chrono::milliseconds(100)); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->followPath( - { - AgvPathSegment{"station-1", "station-2"}, - AgvPathSegment{"station-2", "station-3"}, - }, - options); - finished.store(true, std::memory_order_release); - }); - - const bool cancel_observed = waitForCommandCount( - kRobotTaskClearTargetList, - 1, - 750); - std::size_t all2_count_at_cancel = 0; - if (cancel_observed) { - const auto records = controller_.records(); - all2_count_at_cancel = static_cast(std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusAll2; - })); - - // The cancel ACK is delayed above, so these become the first - // post-cancel observations: one exact task is canceled, the other is - // still absent, and 1101 still says navigation is active but stationary. - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":6}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - } - - const bool active_zero_samples_observed = cancel_observed - && waitForCommandCount( - kRobotStatusAll2, - all2_count_at_cancel + 2U, - 1500); - const bool returned_before_global_terminal = - finished.load(std::memory_order_acquire); - - // Allow both the correct and the intentionally failing implementation to - // terminate cleanly before joining the test thread. - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":6}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":6,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_TRUE(cancel_observed); - EXPECT_TRUE(active_zero_samples_observed); - EXPECT_FALSE(returned_before_global_terminal); - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskClearTargetList; - }), - 1); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - ExactActivePathEscalatesToFailSafeWhenGlobalOwnershipIsUnavailable) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - // If the waiter asks for 1101 after seeing exact states 5 + 1, this queued - // controller error is returned. A bare global 3067 is unsafe without the - // global ownership snapshot, so the adapter must use its explicit - // software-stop escalation sequence. - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":41101,"err_msg":"simulated 1101 failure after exact segment failure"})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":5},{"task_id":"${TASK_ID_1}","status":1}]}})"); - controller_.setResponseDelay( - kRobotTaskClearTargetList, - std::chrono::milliseconds(100)); - AgvMotionOptions options; - options.wait_timeout_ms = 2000; - options.poll_interval_ms = 20; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &result]() { - result = agv_->followPath( - { - AgvPathSegment{"station-1", "station-2"}, - AgvPathSegment{"station-2", "station-3"}, - }, - options); - }); - - const bool cancel_observed = waitForCommandCount( - kRobotTaskClearTargetList, - 1, - 750); - // Replace the queued failing 1101 response while the cancel ACK is delayed, - // so a correct implementation can confirm the post-cancel terminal stop. - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":5},{"task_id":"${TASK_ID_1}","status":6}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":6,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_TRUE(cancel_observed); - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskClearTargetList; - }), - 1); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotControlStop; - }), - 1); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - AsynchronousPoseCancellationAfterAckCancelsAndConfirmsStoppedTask) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.setResponseDelay( - kRobotTaskCancel, - std::chrono::milliseconds(100)); - std::atomic canceled{false}; - AgvMotionOptions options = asynchronousMotionOptions(); - options.cancellation_requested = [&canceled]() { - return canceled.load(std::memory_order_acquire); - }; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &result]() { - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - }); - - // The first 1110 request proves that 3051 already returned its ACK and the - // asynchronous pose start-confirmation phase is in progress. - const bool post_ack_status_observed = waitForCommandCount( - kRobotStatusTaskPackage, - 1, - 750); - canceled.store(true, std::memory_order_release); - const bool cancel_observed = waitForCommandCount( - kRobotTaskCancel, - 1, - 750); - - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":6,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":6,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - EXPECT_TRUE(post_ack_status_observed); - EXPECT_TRUE(cancel_observed); - EXPECT_EQ(result.code, AgvErrorCode::TaskCanceled); - EXPECT_NE(result.message.find("conditionally canceled"), std::string::npos); - EXPECT_NE(result.message.find("stopped state was confirmed"), std::string::npos); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 1); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - GlobalTaskStatusSevenDoesNotOverrideExactRunningSynchronousPose) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":7,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5})"); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &finished, &result]() { - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - finished.store(true, std::memory_order_release); - }); - - const bool grace_elapsed_while_exact_running = waitForCommandCount( - kRobotStatusTaskPackage, - 90, - 2500); - EXPECT_TRUE(grace_elapsed_while_exact_running); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - const auto records_before_completion = controller_.records(); - EXPECT_EQ( - std::count_if( - records_before_completion.begin(), - records_before_completion.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskClearTargetList; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - CompletedPoseDoesNotFinishAfterExactTaskReturnsToRunning) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.queueResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5})"); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread( - [this, &options, &finished, &result]() { - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - finished.store(true, std::memory_order_release); - }); - - const bool running_after_completed_observed = waitForCommandCount( - kRobotStatusTaskPackage, - 10, - 1500); - EXPECT_TRUE(running_after_completed_observed); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigationStatusDoesNotSupersedeSynchronousPoseWaiter) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":1,"blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5})"); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - std::atomic finished{false}; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread( - [this, &options, &finished, &result]() { - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - finished.store(true, std::memory_order_release); - }); - - const bool terminal_wait_started = waitForCommandCount( - kRobotStatusAll2, - 2, - 2000); - const auto observed_status = agv_->navigationStatus(); - EXPECT_TRUE(terminal_wait_started); - EXPECT_EQ(observed_status.state, AgvTaskState::Running); - EXPECT_FALSE(finished.load(std::memory_order_acquire)); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":4,"task_type":1,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - navigation_thread.join(); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - ConditionalCancelRefusesDifferentActiveControllerTask) -{ - const auto navigation_result = agv_->navigateToStation( - "station-owned", - asynchronousMotionOptions()); - ASSERT_TRUE(navigation_result.ok()) << navigation_result.message; - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":2}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":3,"target_id":"station-external","blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.clearRecords(); - - const auto cancel_result = agv_->cancelNavigation(); - - EXPECT_FALSE(cancel_result.ok()); - EXPECT_EQ(cancel_result.code, AgvErrorCode::TaskCanceled); - EXPECT_NE( - cancel_result.message.find("another active task"), - std::string::npos); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotConfigLock - || record.command == kRobotTaskCancel - || record.command == kRobotTaskClearTargetList; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - CanceledOldPathWithExactTerminalTasksIgnoresReplacementGlobalSnapshot) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":5},{"task_id":"${TASK_ID_1}","status":1}]}})"); - controller_.setResponseDelay( - kRobotTaskClearTargetList, - std::chrono::milliseconds(100)); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - AgvResult old_result; - controller_.clearRecords(); - - std::thread old_navigation_thread([this, &options, &old_result]() { - old_result = agv_->followPath( - { - AgvPathSegment{"station-1", "station-2"}, - AgvPathSegment{"station-2", "station-3"}, - }, - options); - }); - - const bool cancel_observed = waitForCommandCount( - kRobotTaskClearTargetList, - 1, - 1000); - const auto records_at_cancel = controller_.records(); - const auto all2_count_at_cancel = static_cast(std::count_if( - records_at_cancel.begin(), - records_at_cancel.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusAll2; - })); - const auto exact_count_at_cancel = static_cast(std::count_if( - records_at_cancel.begin(), - records_at_cancel.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - })); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":6},{"task_id":"${TASK_ID_1}","status":6}]}})"); - controller_.setResponseDelay( - kRobotStatusTaskPackage, - std::chrono::milliseconds(300)); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":41101,"err_msg":"replacement task owns global 1101"})"); - const bool post_cancel_exact_query_observed = cancel_observed - && waitForCommandCount( - kRobotStatusTaskPackage, - exact_count_at_cancel + 1U, - 1000); - - const auto replacement_result = agv_->navigateToStation( - "replacement-station", - asynchronousMotionOptions()); - old_navigation_thread.join(); - - EXPECT_TRUE(cancel_observed); - EXPECT_TRUE(post_cancel_exact_query_observed); - ASSERT_TRUE(replacement_result.ok()) << replacement_result.message; - EXPECT_EQ(old_result.code, AgvErrorCode::TaskFailed); - EXPECT_NE( - old_result.message.find("old exact task ids are terminal"), - std::string::npos); - EXPECT_NE( - old_result.message.find("global stopped state was not inspected"), - std::string::npos); - EXPECT_EQ( - old_result.message.find("stopped state was confirmed"), - std::string::npos); - EXPECT_TRUE(SeerRobokitAgvTestPeer::hasTrackedNavigation( - *agv_, - AgvTaskType::NavigateToStation)); - const auto records = controller_.records(); - EXPECT_EQ( - static_cast(std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusAll2; - })), - all2_count_at_cancel); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskClearTargetList; - }), - 1); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - CurrentSegmentFailureClearsPathQueueDuringGlobalIdleTransitionWindow) -{ - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.queueResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":3,"target_id":"station-3","blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID_0}","status":5}]}})"); - controller_.setResponseDelay( - kRobotConfigLock, - std::chrono::milliseconds(100)); - controller_.setResponseDelay( - kRobotTaskClearTargetList, - std::chrono::milliseconds(100)); - AgvMotionOptions options; - options.wait_timeout_ms = 3000; - options.poll_interval_ms = 20; - AgvResult result; - controller_.clearRecords(); - - std::thread navigation_thread([this, &options, &result]() { - result = agv_->followPath( - { - AgvPathSegment{"station-1", "station-2"}, - AgvPathSegment{"station-2", "station-3"}, - }, - options); - }); - - const bool cancel_authority_observed = waitForCommandCount( - kRobotConfigLock, - 2, - 1500); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":0,"task_type":0,"blocked":false,"vx":0.0,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - const bool clear_path_observed = waitForCommandCount( - kRobotTaskClearTargetList, - 1, - 1000); - navigation_thread.join(); - - EXPECT_TRUE(cancel_authority_observed); - EXPECT_TRUE(clear_path_observed); - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - EXPECT_NE(result.message.find("conditionally canceled"), std::string::npos); - EXPECT_NE(result.message.find("stopped state was confirmed"), std::string::npos); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskClearTargetList; - }), - 1); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F(SeerRobokitControlAuthorityTest, AcquisitionFailureDoesNotSendControlCommand) -{ - controller_.setResponseCode(kRobotConfigLock, 40020); - controller_.clearRecords(); - - const auto result = agv_->setVelocity(AgvVelocity{0.1, 0.0, 0.0}); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(result.message.find("acquire control authority failed"), std::string::npos); - EXPECT_NE(result.message.find("ret_code=40020"), std::string::npos); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotConfigLock); -} - -TEST_F(SeerRobokitControlAuthorityTest, EmergencyStopAcquisitionFailureDoesNotSendStopCommands) -{ - controller_.setResponseCode(kRobotConfigLock, 40020); - controller_.clearRecords(); - - const auto result = agv_->emergencyStop(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(result.message.find("acquire control authority failed"), std::string::npos); - EXPECT_NE(result.message.find("ret_code=40020"), std::string::npos); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotConfigLock); -} - -TEST_F(SeerRobokitControlAuthorityTest, EmergencyStopAttemptsBothStopsAndAggregatesFailures) -{ - controller_.setResponseCode(kRobotControlStop, 50001); - controller_.setResponseCode(kRobotTaskCancel, 50002); - controller_.clearRecords(); - - const auto result = agv_->emergencyStop(); - - EXPECT_FALSE(result.ok()); - EXPECT_NE(result.message.find("control stop"), std::string::npos); - EXPECT_NE(result.message.find("cancel navigation"), std::string::npos); - EXPECT_NE(result.message.find("ret_code=50001"), std::string::npos); - EXPECT_NE(result.message.find("ret_code=50002"), std::string::npos); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 3U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - EXPECT_EQ(records[1].command, kRobotControlStop); - EXPECT_EQ(records[2].command, kRobotTaskCancel); -} - -TEST_F(SeerRobokitControlAuthorityTest, ClearFaultSends4009WithoutPayloadAfterAcquiringAuthority) -{ - controller_.clearRecords(); - - const auto result = agv_->clearFault(); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 2U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - EXPECT_EQ(records[1].command, kRobotConfigClearFault); - EXPECT_TRUE(records[1].payload.empty()); -} - -TEST_F(SeerRobokitControlAuthorityTest, ClearFaultPreservesControllerFailure) -{ - controller_.setResponseCode(kRobotConfigClearFault, 44009); - controller_.clearRecords(); - - const auto result = agv_->clearFault(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(result.message.find("ret_code=44009"), std::string::npos); - EXPECT_NE( - result.message.find("simulated command failure"), - std::string::npos); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 2U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - EXPECT_EQ(records[1].command, kRobotConfigClearFault); -} - -TEST_F(SeerRobokitControlAuthorityTest, ReadOnlyMapDownloadDoesNotAcquireAuthority) -{ - controller_.clearRecords(); - std::string content; - - const auto result = agv_->downloadMap("map-1", content); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotConfigDownloadMap); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseUsesLegacyCompatibleFreeGoPayloadWithTypedMotionLimits) -{ - AgvMotionOptions options; - options.asynchronous = true; - options.max_speed = 0.6; - options.max_angular_speed = 0.7; - options.max_acceleration = 0.8; - options.max_angular_acceleration = 0.9; - options.reach_distance = 0.1; - options.reach_angle = 0.2; - controller_.clearRecords(); - - const auto result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - options); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - ASSERT_GE(records.size(), 4U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - EXPECT_EQ(records[1].command, kRobotTaskGoTarget); - for (std::size_t index = 2; index < records.size(); ++index) { - EXPECT_EQ(records[index].command, kRobotStatusTaskPackage); - } - - const auto payload = parsePayload(records[1]); - EXPECT_EQ(payloadValue(payload, "source_id").asString(), "SELF_POSITION"); - EXPECT_EQ(payloadValue(payload, "id").asString(), ""); - EXPECT_FALSE(payloadValue(payload, "task_id").asString().empty()); - const auto& free_go = payloadValue(payload, "freeGo"); - EXPECT_TRUE(payloadValue(free_go, "x").isNumeric()); - EXPECT_TRUE(payloadValue(free_go, "y").isNumeric()); - EXPECT_TRUE(payloadValue(free_go, "theta").isNumeric()); - EXPECT_DOUBLE_EQ(payloadValue(free_go, "x").asDouble(), 1.0); - EXPECT_DOUBLE_EQ(payloadValue(free_go, "y").asDouble(), 2.0); - EXPECT_DOUBLE_EQ(payloadValue(free_go, "theta").asDouble(), 0.5); - EXPECT_DOUBLE_EQ(payloadValue(payload, "max_speed").asDouble(), 0.6); - EXPECT_DOUBLE_EQ(payloadValue(payload, "max_wspeed").asDouble(), 0.7); - EXPECT_DOUBLE_EQ(payloadValue(payload, "max_acc").asDouble(), 0.8); - EXPECT_DOUBLE_EQ(payloadValue(payload, "max_wacc").asDouble(), 0.9); - EXPECT_DOUBLE_EQ(payloadValue(payload, "reach_dist").asDouble(), 0.1); - EXPECT_DOUBLE_EQ(payloadValue(payload, "reach_angle").asDouble(), 0.2); - EXPECT_EQ( - payloadValue(payload, "skill_name").asString(), - "GotoSpecifiedPose"); - EXPECT_FALSE(payloadHas(payload, "x")); - EXPECT_FALSE(payloadHas(payload, "y")); - EXPECT_FALSE(payloadHas(payload, "angle")); - EXPECT_FALSE(payloadHas(payload, "jack_height")); - - const auto status_payload = parsePayload(records[2]); - const auto& requested_task_ids = payloadValue(status_payload, "task_ids"); - ASSERT_TRUE(requested_task_ids.isArray()); - ASSERT_EQ(requested_task_ids.size(), 1U); - ASSERT_TRUE(requested_task_ids[0].isString()); - EXPECT_EQ( - requested_task_ids[0].asString(), - payloadValue(payload, "task_id").asString()); - const auto second_status_payload = parsePayload(records.back()); - const auto& second_requested_task_ids = - payloadValue(second_status_payload, "task_ids"); - ASSERT_TRUE(second_requested_task_ids.isArray()); - ASSERT_EQ(second_requested_task_ids.size(), 1U); - EXPECT_EQ( - second_requested_task_ids[0].asString(), - payloadValue(payload, "task_id").asString()); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseUsesExplicitTaskIdAsUniquePrefixAndWhitelistsAdapterFields) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - AgvAdapterParams adapter_params; - adapter_params.values.emplace("source_id", "SELF_POSITION"); - adapter_params.values.emplace("target_id", "SELF_POSITION"); - adapter_params.values.emplace("task_id", "pose-task"); - adapter_params.values.emplace("skill_name", "GotoSpecifiedPose"); - adapter_params.values.emplace("operation", "JackHeight"); - adapter_params.values.emplace("jack_height", "0.5"); - adapter_params.values.emplace("script_name", "unsafe-script"); - adapter_params.values.emplace("unknown_field", "unsafe-value"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose( - math::Pose2d{0.0, 0.0, 0.5}, - asynchronousMotionOptions(), - adapter_params); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - ASSERT_GE(records.size(), 4U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - EXPECT_EQ(records[1].command, kRobotTaskGoTarget); - for (std::size_t index = 2; index < records.size(); ++index) { - EXPECT_EQ(records[index].command, kRobotStatusTaskPackage); - } - - const auto payload = parsePayload(records[1]); - const std::string first_task_id = - payloadValue(payload, "task_id").asString(); - EXPECT_EQ(payloadValue(payload, "source_id").asString(), "SELF_POSITION"); - EXPECT_EQ(payloadValue(payload, "id").asString(), ""); - EXPECT_EQ( - first_task_id.find("pose-task_pose_"), - 0U); - EXPECT_EQ(payloadValue(payload, "skill_name").asString(), "GotoSpecifiedPose"); - const auto& free_go = payloadValue(payload, "freeGo"); - EXPECT_DOUBLE_EQ(payloadValue(free_go, "x").asDouble(), 0.0); - EXPECT_DOUBLE_EQ(payloadValue(free_go, "y").asDouble(), 0.0); - EXPECT_DOUBLE_EQ(payloadValue(free_go, "theta").asDouble(), 0.5); - EXPECT_FALSE(payloadHas(payload, "operation")); - EXPECT_FALSE(payloadHas(payload, "jack_height")); - EXPECT_FALSE(payloadHas(payload, "script_name")); - EXPECT_FALSE(payloadHas(payload, "unknown_field")); - - controller_.clearRecords(); - const auto second_result = agv_->navigateToPose( - math::Pose2d{0.0, 0.0, 0.5}, - asynchronousMotionOptions(), - adapter_params); - ASSERT_TRUE(second_result.ok()) << second_result.message; - const auto second_records = controller_.records(); - ASSERT_GE(second_records.size(), 2U); - const auto second_payload = parsePayload(second_records[1]); - const std::string second_task_id = - payloadValue(second_payload, "task_id").asString(); - EXPECT_EQ(second_task_id.find("pose-task_pose_"), 0U); - EXPECT_NE(first_task_id, second_task_id); -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigateToPoseRejectsUnsafeFallbackStationAndSkill) -{ - AgvAdapterParams adapter_params; - adapter_params.values.emplace("source_id", "station-0"); - controller_.clearRecords(); - - auto result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - {}, - adapter_params); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE(result.message.find("source_id must be SELF_POSITION"), std::string::npos); - EXPECT_TRUE(controller_.records().empty()); - - adapter_params.values.clear(); - adapter_params.values.emplace("target_id", "station-1"); - controller_.clearRecords(); - - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - {}, - adapter_params); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE(result.message.find("target_id must be empty"), std::string::npos); - EXPECT_TRUE(controller_.records().empty()); - - adapter_params.values.clear(); - adapter_params.values.emplace("skill_name", "unsafe-custom-skill"); - controller_.clearRecords(); - - result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - {}, - adapter_params); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE(result.message.find("skill_name must be GotoSpecifiedPose"), std::string::npos); - EXPECT_TRUE(controller_.records().empty()); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - MotionCommandsRejectNonFiniteNumericInputsBeforeAcquiringAuthority) -{ - const double nan = std::numeric_limits::quiet_NaN(); - const double infinity = std::numeric_limits::infinity(); - - controller_.clearRecords(); - auto result = agv_->navigateToPose(math::Pose2d{nan, 0.0, 0.0}, asynchronousMotionOptions()); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE(result.message.find("pose"), std::string::npos); - EXPECT_TRUE(controller_.records().empty()); - - AgvMotionOptions pose_options; - pose_options.reach_distance = infinity; - controller_.clearRecords(); - result = agv_->navigateToPose( - math::Pose2d{0.0, 0.0, 0.0}, - pose_options); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE(result.message.find("reach_distance"), std::string::npos); - EXPECT_TRUE(controller_.records().empty()); - - AgvMotionOptions station_options; - station_options.max_acceleration = nan; - controller_.clearRecords(); - result = agv_->navigateToStation("station-1", station_options); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE(result.message.find("max_acceleration"), std::string::npos); - EXPECT_TRUE(controller_.records().empty()); - - AgvMotionOptions negative_options; - negative_options.max_speed = -0.1; - controller_.clearRecords(); - result = agv_->navigateToPose( - math::Pose2d{0.0, 0.0, 0.0}, - negative_options); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE(result.message.find("non-negative"), std::string::npos); - EXPECT_TRUE(controller_.records().empty()); - - AgvAdapterParams invalid_adapter; - invalid_adapter.values.emplace("jack_height", "inf"); - controller_.clearRecords(); - result = agv_->navigateToStation( - "station-1", - {}, - invalid_adapter); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE(result.message.find("jack_height"), std::string::npos); - EXPECT_TRUE(controller_.records().empty()); - - controller_.clearRecords(); - result = agv_->setVelocity(AgvVelocity{0.0, infinity, 0.0}); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE(result.message.find("velocity"), std::string::npos); - EXPECT_TRUE(controller_.records().empty()); -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigateToPoseIgnoresUncorrelatedStatusUntilPoseTaskAppears) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"old-pose-task","status":2,"type":1}]}})"); - controller_.queueResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - ASSERT_GE(records.size(), 5U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - EXPECT_EQ(records[1].command, kRobotTaskGoTarget); - for (std::size_t index = 2; index < records.size(); ++index) { - EXPECT_EQ(records[index].command, kRobotStatusTaskPackage); - } -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigateToPoseWaitsForStableRunningAfterWaiting) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":1,"type":1}]}})"); - controller_.queueResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - ASSERT_GE(records.size(), 5U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - EXPECT_EQ(records[1].command, kRobotTaskGoTarget); - for (std::size_t index = 2; index < records.size(); ++index) { - EXPECT_EQ(records[index].command, kRobotStatusTaskPackage); - } -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseDoesNotReturnSuccessBeforeLateRunningFaultPush) -{ - controller_.clearRecords(); - AgvResult result = AgvResult::success(); - - std::thread pose_thread([this, &result]() { - result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("E_RUNNING_31: safety controller rejected free navigation"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - pose_thread.join(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::Fault); - EXPECT_NE(result.message.find("E_RUNNING_31"), std::string::npos); - EXPECT_NE(result.message.find("Running state"), std::string::npos); - EXPECT_NE( - result.message.find("do not retry automatically"), - std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseFailsIfFaultPushChannelInvalidatesDuringStartConfirmation) -{ - controller_.clearRecords(); - AgvResult result = AgvResult::success(); - - std::thread pose_thread([this, &result]() { - result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - SeerRobokitAgvTestPeer::setFaultStateUnknown(*agv_); - pose_thread.join(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::Fault); - EXPECT_NE( - result.message.find("fault monitoring became unavailable"), - std::string::npos); - EXPECT_NE( - result.message.find("push channel changed or was invalidated"), - std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseRejectsCompletedTargetWhenLateControllerFaultArrives) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5})"); - controller_.clearRecords(); - AgvResult result = AgvResult::success(); - - std::thread pose_thread([this, &result]() { - result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("E_COMPLETED_45: controller rejected completed pose"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - *fault_push.demand("fatals", "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - pose_thread.join(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::Fault); - EXPECT_NE(result.message.find("reported Completed"), std::string::npos); - EXPECT_NE(result.message.find("E_COMPLETED_45"), std::string::npos); - const auto records = controller_.records(); - EXPECT_FALSE(std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusLoc; - })); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseRejectsFaultArrivingDuringCompletedPoseVerification) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5})"); - controller_.setResponseDelay( - kRobotStatusLoc, - std::chrono::milliseconds(300)); - controller_.clearRecords(); - AgvResult result = AgvResult::success(); - - std::thread pose_thread([this, &result]() { - result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool location_query_observed = false; - for (int attempt = 0; attempt < 700; ++attempt) { - const auto records = controller_.records(); - location_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusLoc; - }); - if (location_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(location_query_observed); - - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("E_POSE_VERIFY_46: fault during target verification"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - *fault_push.demand("fatals", "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - pose_thread.join(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::Fault); - EXPECT_NE(result.message.find("target verification"), std::string::npos); - EXPECT_NE(result.message.find("E_POSE_VERIFY_46"), std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseDoesNotMisattributeFaultFromCommandAwaitingAck) -{ - controller_.clearRecords(); - AgvResult pose_result = AgvResult::success(); - AgvResult station_result = AgvResult::success(); - - std::thread pose_thread([this, &pose_result]() { - pose_result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - controller_.setResponseDelay( - kRobotTaskGoTarget, - std::chrono::milliseconds(300)); - std::thread station_thread([this, &station_result]() { - station_result = agv_->navigateToStation("station-1", asynchronousMotionOptions()); - }); - - bool station_command_observed = false; - for (int attempt = 0; attempt < 500; ++attempt) { - const auto records = controller_.records(); - const auto go_target_count = std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskGoTarget; - }); - station_command_observed = go_target_count >= 2; - if (station_command_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(station_command_observed); - - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("E_STATION_ACK_18: fault from concurrent station command"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - - pose_thread.join(); - station_thread.join(); - - EXPECT_FALSE(pose_result.ok()); - EXPECT_EQ(pose_result.code, AgvErrorCode::Fault) - << pose_result.message; - EXPECT_NE( - pose_result.message.find("another control command attempt"), - std::string::npos); - EXPECT_NE( - pose_result.message.find("cannot be attributed"), - std::string::npos); - EXPECT_NE( - pose_result.message.find("E_STATION_ACK_18"), - std::string::npos); - ASSERT_TRUE(station_result.ok()) << station_result.message; -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseDoesNotMisattributeFaultObservedAfterAnotherCommandAck) -{ - controller_.clearRecords(); - AgvResult pose_result = AgvResult::success(); - - std::thread pose_thread([this, &pose_result]() { - pose_result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - controller_.setResponseCode(kRobotTaskGoTarget, 4188); - const auto station_result = agv_->navigateToStation("station-1", asynchronousMotionOptions()); - EXPECT_FALSE(station_result.ok()); - EXPECT_NE(station_result.message.find("ret_code=4188"), std::string::npos); - - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("E_AFTER_ACK_19: delayed station command alarm"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - *fault_push.demand("fatals", "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - pose_thread.join(); - - EXPECT_FALSE(pose_result.ok()); - EXPECT_EQ(pose_result.code, AgvErrorCode::Fault); - EXPECT_NE( - pose_result.message.find("another control command attempt"), - std::string::npos); - EXPECT_NE( - pose_result.message.find("cannot be attributed"), - std::string::npos); - EXPECT_NE(pose_result.message.find("E_AFTER_ACK_19"), std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - PauseDuringPoseCommandAckPreservesPublishedTaskContext) -{ - controller_.setResponseDelay( - kRobotTaskGoTarget, - std::chrono::milliseconds(300)); - controller_.clearRecords(); - AgvResult pose_result = AgvResult::success(); - AgvResult pause_result = AgvResult::failure( - AgvErrorCode::CommandFailed, - "pause not called"); - - std::thread pose_thread([this, &pose_result]() { - pose_result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool pose_command_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - pose_command_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskGoTarget; - }); - if (pose_command_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(pose_command_observed); - - std::thread pause_thread([this, &pause_result]() { - pause_result = agv_->pauseNavigation(); - }); - pause_thread.join(); - pose_thread.join(); - - ASSERT_TRUE(pause_result.ok()) << pause_result.message; - EXPECT_FALSE(pose_result.ok()); - EXPECT_NE(pose_result.message.find("superseded"), std::string::npos); - EXPECT_TRUE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseReturnsAcceptedWhenMatchingTaskRemainsQueued) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"queued","task_status_list":[{"task_id":"${TASK_ID}","status":1,"type":1}]}})"); - controller_.clearRecords(); - - const auto result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - const auto status_query_count = std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - EXPECT_GT(status_query_count, 2); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseReturnsControllerFaultWhenQueuedTaskRaisesAlarm) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"queued","task_status_list":[{"task_id":"${TASK_ID}","status":1,"type":1}]}})"); - controller_.clearRecords(); - AgvResult result = AgvResult::success(); - - std::thread pose_thread([this, &result]() { - result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("E_WAIT_19: safety interlock"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - pose_thread.join(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::Fault); - EXPECT_NE(result.message.find("remains active"), std::string::npos); - EXPECT_NE(result.message.find("E_WAIT_19"), std::string::npos); - EXPECT_NE(result.message.find("do not retry automatically"), std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseDoesNotReportAcceptedAfterMatchingTaskDisappears) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":1,"type":1}]}})"); - controller_.queueResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[]}})"); - controller_.clearRecords(); - - const auto result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskRejected); - EXPECT_NE( - result.message.find("not present in task_status_package"), - std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseDoesNotHangWhenRunningTaskDisappears) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":1}]}})"); - controller_.queueResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[]}})"); - controller_.clearRecords(); - - const auto started_at = std::chrono::steady_clock::now(); - const auto result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - const auto elapsed = std::chrono::duration_cast( - std::chrono::steady_clock::now() - started_at); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskRejected); - EXPECT_NE( - result.message.find("not present in task_status_package"), - std::string::npos); - EXPECT_LT(elapsed, std::chrono::seconds(3)); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseReturnsFailureAfterWaitingTransitionsToFailed) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":1,"type":1}]}})"); - controller_.queueResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"create_on":"2026-07-31T10:00:00Z","err_msg":"controller task failed","task_status_package":{"closest_target":"goal-7","source_name":"SELF_POSITION","target_name":"free-goal","percentage":0.0,"distance":1.4,"info":"planner rejected pose","task_status_list":[{"task_id":"${TASK_ID}","status":5,"type":1}]}})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - EXPECT_NE(result.message.find("planner rejected pose"), std::string::npos); - EXPECT_NE(result.message.find("task_status=5"), std::string::npos); - EXPECT_NE(result.message.find("status_query_ret_code=0"), std::string::npos); - EXPECT_NE(result.message.find("controller task failed"), std::string::npos); - EXPECT_NE(result.message.find("closest_target=goal-7"), std::string::npos); - EXPECT_NE(result.message.find("distance=1.400000"), std::string::npos); - const auto records = controller_.records(); - EXPECT_GE( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }), - 2); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseRejectsCompletedTaskWhenRequestedTargetWasNotReached) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":0.0,"y":0.0,"angle":0.0})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{1.0, 0.0, 0.0}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskRejected); - EXPECT_NE(result.message.find("target was not reached"), std::string::npos); - EXPECT_NE(result.message.find("distance_error=1"), std::string::npos); - const auto records = controller_.records(); - EXPECT_GE( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }), - 2); - EXPECT_GE( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusLoc; - }), - 1); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseAcceptsCompletedTaskOnlyWhenRequestedTargetWasReached) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 4U); - EXPECT_EQ(records[2].command, kRobotStatusTaskPackage); - EXPECT_EQ(records[3].command, kRobotStatusLoc); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseDoesNotUseFaultOnlyPushAsAValidCompletedPose) -{ - Json::Value push_payload(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("controller fault without pose fields"); - *push_payload.demand("errors", "errors" + std::strlen("errors")) = errors; - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, push_payload); - Json::Value cleared_push(Json::objectValue); - *cleared_push.demand("errors", "errors" + std::strlen("errors")) = - Json::Value(Json::arrayValue); - *cleared_push.demand("fatals", "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, cleared_push); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"err_msg":""})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{0.0, 0.0, 0.0}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskRejected); - EXPECT_NE( - result.message.find("target pose could not be verified"), - std::string::npos); - EXPECT_NE( - result.message.find("did not contain numeric x/y/angle"), - std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseRejectsCompletedTaskWithNonNumericControllerPose) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":null,"y":false,"angle":"0.0"})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{0.0, 0.0, 0.0}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskRejected); - EXPECT_NE( - result.message.find("did not contain numeric x/y/angle"), - std::string::npos); -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigateToPoseReturnsAsynchronousControllerFailure) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"planner rejected pose","task_status_list":[{"task_id":"${TASK_ID}","status":5,"type":1}]}})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - EXPECT_NE(result.message.find("planner rejected pose"), std::string::npos); - EXPECT_NE(result.message.find("task_status=5"), std::string::npos); - EXPECT_NE(result.message.find("task_type=1"), std::string::npos); -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigateToPosePreservesSynchronousControllerCode) -{ - controller_.setResponseCode(kRobotTaskGoTarget, 43051); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(result.message.find("ret_code=43051"), std::string::npos); - EXPECT_NE(result.message.find("err_msg=simulated command failure"), std::string::npos); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 2U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - EXPECT_EQ(records[1].command, kRobotTaskGoTarget); -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigateToPosePreservesStatusQueryControllerCode) -{ - controller_.setResponseCode(kRobotStatusTaskPackage, 41110); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(result.message.find("ret_code=41110"), std::string::npos); - EXPECT_NE(result.message.find("err_msg=simulated command failure"), std::string::npos); -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigateToPoseRejectsWrongResponseCommand) -{ - controller_.setResponseCommand(kRobotTaskGoTarget, 13052); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(result.message.find("expected=13051"), std::string::npos); - EXPECT_NE(result.message.find("actual=13052"), std::string::npos); - EXPECT_NE(result.message.find("channel closed"), std::string::npos); - EXPECT_NE(result.message.find("controller outcome is unknown"), std::string::npos); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 2U); - EXPECT_EQ(records[1].command, kRobotTaskGoTarget); -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigateToPoseRejectsMissingControllerCode) -{ - controller_.setResponsePayload( - kRobotTaskGoTarget, - R"({"err_msg":"missing acknowledgment code"})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(result.message.find("missing a numeric ret_code"), std::string::npos); - EXPECT_NE(result.message.find("controller outcome is unknown"), std::string::npos); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 2U); - EXPECT_EQ(records[1].command, kRobotTaskGoTarget); -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigateToPoseReportsPausedTaskExplicitly) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"safety pause","task_status_list":[{"task_id":"${TASK_ID}","status":3,"type":1}]}})"); - controller_.clearRecords(); - - const auto result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskRejected); - EXPECT_NE(result.message.find("established but is paused"), std::string::npos); - EXPECT_NE(result.message.find("safety pause"), std::string::npos); - EXPECT_NE(result.message.find("do not retry automatically"), std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPosePreservesControllerFaultWhenTaskImmediatelyPauses) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"safety pause","task_status_list":[{"task_id":"${TASK_ID}","status":3,"type":1}]}})"); - controller_.clearRecords(); - AgvResult result = AgvResult::success(); - - std::thread pose_thread([this, &result]() { - result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("E_PAUSED_55: safety controller paused failed task"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - *fault_push.demand("fatals", "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - pose_thread.join(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::Fault); - EXPECT_NE(result.message.find("paused"), std::string::npos); - EXPECT_NE(result.message.find("E_PAUSED_55"), std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseIncludesTaskCorrelatedRawControllerFaultDetail) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[]}})"); - controller_.clearRecords(); - AgvResult result = AgvResult::success(); - - std::thread pose_thread([this, &result]() { - result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("E_NAV_42: planner alarm"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - - Json::Value cleared_push(Json::objectValue); - *cleared_push.demand("errors", "errors" + std::strlen("errors")) = - Json::Value(Json::arrayValue); - *cleared_push.demand("fatals", "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, cleared_push); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"navigation failed","task_status_list":[{"task_id":"${TASK_ID}","status":5,"type":1}]}})"); - pose_thread.join(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - EXPECT_NE(result.message.find("E_NAV_42"), std::string::npos); - EXPECT_NE(result.message.find("planner alarm"), std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseRejectsPreexistingControllerFaultWithoutSendingTask) -{ - Json::Value push_payload(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("OLD_FAULT_FROM_PREVIOUS_TASK"); - *push_payload.demand("errors", "errors" + std::strlen("errors")) = errors; - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, push_payload); - controller_.clearRecords(); - const auto result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::Fault); - EXPECT_NE( - result.message.find("OLD_FAULT_FROM_PREVIOUS_TASK"), - std::string::npos); - EXPECT_NE(result.message.find("was not sent"), std::string::npos); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotConfigLock); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseRejectsUnknownOrStaleFaultStateWithoutSendingTask) -{ - SeerRobokitAgvTestPeer::setFaultStateUnknown(*agv_); - controller_.clearRecords(); - - auto result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::Fault); - EXPECT_NE( - result.message.find("no state push containing fatals/errors"), - std::string::npos); - auto records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - - SeerRobokitAgvTestPeer::setFaultStateAge( - *agv_, - std::chrono::seconds(3)); - controller_.clearRecords(); - - result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::Fault); - EXPECT_NE(result.message.find("state push is stale"), std::string::npos); - records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotConfigLock); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseRejectsMalformedFaultStateWithoutSendingTask) -{ - Json::Value malformed_push(Json::objectValue); - *malformed_push.demand("errors", "errors" + std::strlen("errors")) = - Json::Value(); - *malformed_push.demand("fatals", "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, malformed_push); - controller_.clearRecords(); - - const auto result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::Fault); - EXPECT_NE( - result.message.find("incomplete or malformed"), - std::string::npos); - EXPECT_NE(result.message.find("errors=null"), std::string::npos) - << result.message; - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotConfigLock); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToPoseDoesNotAttributeClearedFaultHistoryToNewTask) -{ - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("OLD_CLEARED_FAULT"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - - Json::Value cleared_push(Json::objectValue); - *cleared_push.demand("errors", "errors" + std::strlen("errors")) = - Json::Value(Json::arrayValue); - *cleared_push.demand("fatals", "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, cleared_push); - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"new task failed","task_status_list":[{"task_id":"${TASK_ID}","status":5,"type":1}]}})"); - controller_.clearRecords(); - - const auto result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::TaskFailed); - EXPECT_NE(result.message.find("new task failed"), std::string::npos); - EXPECT_EQ(result.message.find("OLD_CLEARED_FAULT"), std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - CancelDoesNotSupersedeAlreadyCompletedPoseDuringLocationVerification) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5})"); - controller_.setResponseDelay( - kRobotStatusLoc, - std::chrono::milliseconds(300)); - controller_.clearRecords(); - AgvResult pose_result = AgvResult::success(); - - std::thread pose_thread([this, &pose_result]() { - pose_result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool location_query_observed = false; - for (int attempt = 0; attempt < 500; ++attempt) { - const auto records = controller_.records(); - location_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusLoc; - }); - if (location_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(location_query_observed); - - const auto cancel_result = agv_->cancelNavigation(); - pose_thread.join(); - - ASSERT_TRUE(cancel_result.ok()) << cancel_result.message; - ASSERT_TRUE(pose_result.ok()) << pose_result.message; - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F(SeerRobokitControlAuthorityTest, CancelSupersedesPoseStartConfirmation) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[]}})"); - controller_.clearRecords(); - AgvResult pose_result = AgvResult::success(); - - std::thread pose_thread([this, &pose_result]() { - pose_result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - - const auto cancel_result = agv_->cancelNavigation(); - pose_thread.join(); - - EXPECT_TRUE(status_query_observed); - ASSERT_TRUE(cancel_result.ok()) << cancel_result.message; - EXPECT_FALSE(pose_result.ok()); - EXPECT_EQ(pose_result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(pose_result.message.find("superseded"), std::string::npos); - EXPECT_NE(pose_result.message.find("state is unknown"), std::string::npos); -} - -TEST_F(SeerRobokitControlAuthorityTest, FailedCancelDoesNotSupersedePoseStartConfirmation) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[]}})"); - controller_.clearRecords(); - AgvResult pose_result = AgvResult::success(); - std::atomic_bool pose_finished{false}; - - std::thread pose_thread([this, &pose_result, &pose_finished]() { - pose_result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - pose_finished.store(true, std::memory_order_release); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - controller_.setResponseCode(kRobotConfigLock, 17); - const auto authority_failure = agv_->cancelNavigation(); - EXPECT_FALSE(authority_failure.ok()); - std::this_thread::sleep_for(std::chrono::milliseconds(75)); - EXPECT_FALSE(pose_finished.load(std::memory_order_acquire)); - - controller_.setResponseCode(kRobotConfigLock, 0); - controller_.setResponseCode(kRobotTaskCancel, 23); - const auto command_failure = agv_->cancelNavigation(); - EXPECT_FALSE(command_failure.ok()); - std::this_thread::sleep_for(std::chrono::milliseconds(75)); - EXPECT_FALSE(pose_finished.load(std::memory_order_acquire)); - - controller_.setResponseCode(kRobotTaskCancel, 0); - const auto successful_cancel = agv_->cancelNavigation(); - pose_thread.join(); - - ASSERT_TRUE(successful_cancel.ok()) << successful_cancel.message; - EXPECT_TRUE(pose_finished.load(std::memory_order_acquire)); - EXPECT_FALSE(pose_result.ok()); - EXPECT_EQ(pose_result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(pose_result.message.find("superseded"), std::string::npos); - EXPECT_NE(pose_result.message.find("state is unknown"), std::string::npos); -} - -TEST_F(SeerRobokitControlAuthorityTest, IndeterminateCancelSupersedesPoseStartConfirmation) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[]}})"); - controller_.clearRecords(); - AgvResult pose_result = AgvResult::success(); - - std::thread pose_thread([this, &pose_result]() { - pose_result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - controller_.setResponsePayload( - kRobotTaskCancel, - R"({"err_msg":"acknowledgment lost"})"); - const auto cancel_result = agv_->cancelNavigation(); - pose_thread.join(); - - EXPECT_FALSE(cancel_result.ok()); - EXPECT_NE(cancel_result.message.find("missing a numeric ret_code"), std::string::npos); - EXPECT_NE(cancel_result.message.find("controller outcome is unknown"), std::string::npos); - EXPECT_NE( - cancel_result.message.find("do not issue another motion command automatically"), - std::string::npos); - EXPECT_FALSE(pose_result.ok()); - EXPECT_EQ(pose_result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(pose_result.message.find("state is unknown"), std::string::npos); -} - -TEST_F(SeerRobokitControlAuthorityTest, TimedOutChannelIsClosedBeforeSameCommandCanRetry) -{ - SeerRobokitAgvTestPeer::setNavigationReceiveTimeout( - *agv_, - std::chrono::milliseconds(50)); - controller_.setResponseDelay( - kRobotTaskCancel, - std::chrono::milliseconds(200)); - controller_.clearRecords(); - - const auto first_result = agv_->cancelNavigation(); - const auto second_result = agv_->cancelNavigation(); - - EXPECT_FALSE(first_result.ok()); - EXPECT_EQ(first_result.code, AgvErrorCode::Timeout); - EXPECT_NE(first_result.message.find("channel closed"), std::string::npos); - EXPECT_NE( - first_result.message.find("controller outcome is unknown"), - std::string::npos); - EXPECT_FALSE(second_result.ok()); - EXPECT_EQ(second_result.code, AgvErrorCode::NotConnected); - EXPECT_EQ( - second_result.message.find("controller outcome is unknown"), - std::string::npos); - - const auto records = controller_.records(); - const auto cancel_count = std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }); - EXPECT_EQ(cancel_count, 1); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigationWriteNotStartedDoesNotPublishFalseTracking) -{ - SeerRobokitAgvTestPeer::closeNavigationSocket(*agv_); - AgvMotionOptions options; - options.wait_timeout_ms = 500; - options.poll_interval_ms = 20; - controller_.clearRecords(); - - const auto result = agv_->navigateToStation( - "station-not-sent", - options); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::NotConnected); - EXPECT_EQ( - result.message.find("controller outcome is unknown"), - std::string::npos); - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedNavigation( - *agv_, - AgvTaskType::NavigateToStation)); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskGoTarget - || record.command == kRobotStatusTaskPackage - || record.command == kRobotTaskCancel; - }), - 0); -} - -TEST_F(SeerRobokitControlAuthorityTest, SlowTaskStatusDoesNotBlockEmergencyStop) -{ - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[]}})"); - controller_.setResponseDelay( - kRobotStatusTaskPackage, - std::chrono::milliseconds(300)); - controller_.clearRecords(); - AgvResult pose_result = AgvResult::success(); - - std::thread pose_thread([this, &pose_result]() { - pose_result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - ASSERT_TRUE(status_query_observed); - - const auto start = std::chrono::steady_clock::now(); - const auto stop_result = agv_->emergencyStop(); - const auto elapsed = std::chrono::duration_cast( - std::chrono::steady_clock::now() - start); - pose_thread.join(); - - ASSERT_TRUE(stop_result.ok()) << stop_result.message; - EXPECT_LT(elapsed.count(), 150); - EXPECT_FALSE(pose_result.ok()); - EXPECT_EQ(pose_result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(pose_result.message.find("state is unknown"), std::string::npos); - - const auto records = controller_.records(); - const auto control_stop = std::find_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotControlStop; - }); - const auto navigation_cancel = std::find_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskCancel; - }); - ASSERT_NE(control_stop, records.end()); - ASSERT_NE(navigation_cancel, records.end()); - EXPECT_LT(control_stop, navigation_cancel); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - SlowConditionalCancelPreflightDoesNotBlockOrFollowEmergencyStop) -{ - const auto path_result = agv_->followPath( - {AgvPathSegment{"station-1", "station-2"}}, - asynchronousMotionOptions()); - ASSERT_TRUE(path_result.ok()) << path_result.message; - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"task_status_list":[{"task_id":"${TASK_ID}","status":2,"type":3}]}})"); - controller_.setResponsePayload( - kRobotStatusAll2, - R"({"ret_code":0,"task_status":2,"task_type":3,"target_id":"station-2","blocked":false,"vx":0.05,"vy":0.0,"w":0.0,"fatals":[],"errors":[]})"); - controller_.setResponseDelay( - kRobotStatusTaskPackage, - std::chrono::milliseconds(300)); - controller_.clearRecords(); - AgvResult cancel_result; - - std::thread cancel_thread([this, &cancel_result]() { - cancel_result = agv_->cancelNavigation(); - }); - const bool cancel_preflight_started = waitForCommandCount( - kRobotStatusTaskPackage, - 1, - 1000); - const auto stop_started_at = std::chrono::steady_clock::now(); - const auto stop_result = agv_->emergencyStop(); - const auto stop_elapsed = std::chrono::duration_cast< - std::chrono::milliseconds>( - std::chrono::steady_clock::now() - stop_started_at); - cancel_thread.join(); - - EXPECT_TRUE(cancel_preflight_started); - ASSERT_TRUE(stop_result.ok()) << stop_result.message; - EXPECT_LT(stop_elapsed.count(), 200); - EXPECT_FALSE(cancel_result.ok()); - EXPECT_EQ(cancel_result.code, AgvErrorCode::TaskCanceled); - const auto records = controller_.records(); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotControlStop; - }), - 1); - EXPECT_EQ( - std::count_if( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotTaskClearTargetList; - }), - 1); -} - -TEST_F(SeerRobokitControlAuthorityTest, EmergencyStopInvalidatesPoseAfterFirstAcceptedStop) -{ - controller_.setResponseDelay( - kRobotStatusTaskPackage, - std::chrono::milliseconds(200)); - controller_.setResponseDelay( - kRobotTaskCancel, - std::chrono::milliseconds(400)); - controller_.clearRecords(); - AgvResult pose_result = AgvResult::success(); - AgvResult stop_result = AgvResult::success(); - std::atomic_bool pose_finished{false}; - std::atomic_bool stop_finished{false}; - - std::thread pose_thread([this, &pose_result, &pose_finished]() { - pose_result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - pose_finished.store(true, std::memory_order_release); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - std::thread stop_thread([this, &stop_result, &stop_finished]() { - stop_result = agv_->emergencyStop(); - stop_finished.store(true, std::memory_order_release); - }); - - bool control_stop_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - control_stop_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotControlStop; - }); - if (control_stop_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(control_stop_observed); - - for (int attempt = 0; attempt < 350; ++attempt) { - if (pose_finished.load(std::memory_order_acquire)) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - const bool pose_finished_before_navigation_cancel = - pose_finished.load(std::memory_order_acquire); - const bool stop_finished_before_pose_result = - stop_finished.load(std::memory_order_acquire); - stop_thread.join(); - pose_thread.join(); - EXPECT_TRUE(pose_finished_before_navigation_cancel); - EXPECT_FALSE(stop_finished_before_pose_result); - EXPECT_FALSE(pose_result.ok()); - EXPECT_EQ(pose_result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(pose_result.message.find("state is unknown"), std::string::npos); - ASSERT_TRUE(stop_result.ok()) << stop_result.message; -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigateToStationForwardsTypedMotionOptions) -{ - AgvMotionOptions options; - options.asynchronous = true; - options.max_speed = 0.4; - options.max_angular_speed = 0.5; - options.max_acceleration = 0.6; - options.max_angular_acceleration = 0.7; - AgvAdapterParams adapter_params; - adapter_params.values.emplace("id", "wrong-station"); - adapter_params.values.emplace("x", "99.0"); - adapter_params.values.emplace("freeGo", "invalid"); - adapter_params.values.emplace("max_speed", "not-a-number"); - adapter_params.values.emplace("reach_dist", "not-a-number"); - controller_.clearRecords(); - - const auto result = agv_->navigateToStation( - "station-1", - options, - adapter_params); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 2U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - EXPECT_EQ(records[1].command, kRobotTaskGoTarget); - - const auto payload = parsePayload(records[1]); - EXPECT_EQ(payloadValue(payload, "source_id").asString(), "SELF_POSITION"); - EXPECT_EQ(payloadValue(payload, "id").asString(), "station-1"); - EXPECT_TRUE(payloadValue(payload, "max_speed").isNumeric()); - EXPECT_TRUE(payloadValue(payload, "max_wspeed").isNumeric()); - EXPECT_TRUE(payloadValue(payload, "max_acc").isNumeric()); - EXPECT_TRUE(payloadValue(payload, "max_wacc").isNumeric()); - EXPECT_DOUBLE_EQ(payloadValue(payload, "max_speed").asDouble(), 0.4); - EXPECT_DOUBLE_EQ(payloadValue(payload, "max_wspeed").asDouble(), 0.5); - EXPECT_DOUBLE_EQ(payloadValue(payload, "max_acc").asDouble(), 0.6); - EXPECT_DOUBLE_EQ(payloadValue(payload, "max_wacc").asDouble(), 0.7); - EXPECT_FALSE(payloadHas(payload, "x")); - EXPECT_FALSE(payloadHas(payload, "freeGo")); - EXPECT_FALSE(payloadHas(payload, "reach_dist")); - EXPECT_FALSE(payloadHas(payload, "jack_height")); - EXPECT_FALSE(payloadHas(payload, "use_pgv")); - EXPECT_FALSE(payloadHas(payload, "use_down_pgv")); - EXPECT_FALSE(payloadHas(payload, "pgv_adjust_dist")); - EXPECT_FALSE(payloadHas(payload, "pgv_adjust_cx")); - EXPECT_FALSE(payloadHas(payload, "pgv_adjust_cy")); - EXPECT_FALSE(payloadHas(payload, "pgv_x_adjust")); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToStationForwardsPgvAdjustmentUsingNativeJsonTypes) -{ - AgvMotionOptions options; - options.asynchronous = true; - AgvAdapterParams adapter_params; - adapter_params.values.emplace("source_id", "LM2"); - adapter_params.values.emplace("use_pgv", "true"); - adapter_params.values.emplace("pgv_adjust_dist", "0.3"); - adapter_params.values.emplace("pgv_adjust_cx", "-0.3"); - adapter_params.values.emplace("pgv_adjust_cy", "0"); - adapter_params.values.emplace("pgv_x_adjust", "1"); - adapter_params.values.emplace("use_down_pgv", "false"); - controller_.clearRecords(); - - const auto result = agv_->navigateToStation( - "AP1", - options, - adapter_params); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 2U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - EXPECT_EQ(records[1].command, kRobotTaskGoTarget); - - const auto payload = parsePayload(records[1]); - EXPECT_EQ(payloadValue(payload, "source_id").asString(), "LM2"); - EXPECT_EQ(payloadValue(payload, "id").asString(), "AP1"); - EXPECT_TRUE(payloadValue(payload, "use_pgv").isBool()); - EXPECT_TRUE(payloadValue(payload, "use_pgv").asBool()); - EXPECT_TRUE(payloadValue(payload, "use_down_pgv").isBool()); - EXPECT_FALSE(payloadValue(payload, "use_down_pgv").asBool()); - EXPECT_TRUE(payloadValue(payload, "pgv_adjust_dist").isNumeric()); - EXPECT_TRUE(payloadValue(payload, "pgv_adjust_cx").isNumeric()); - EXPECT_TRUE(payloadValue(payload, "pgv_adjust_cy").isNumeric()); - EXPECT_TRUE(payloadValue(payload, "pgv_x_adjust").isNumeric()); - EXPECT_DOUBLE_EQ(payloadValue(payload, "pgv_adjust_dist").asDouble(), 0.3); - EXPECT_DOUBLE_EQ(payloadValue(payload, "pgv_adjust_cx").asDouble(), -0.3); - EXPECT_DOUBLE_EQ(payloadValue(payload, "pgv_adjust_cy").asDouble(), 0.0); - EXPECT_DOUBLE_EQ(payloadValue(payload, "pgv_x_adjust").asDouble(), 1.0); - EXPECT_FALSE(payloadHas(payload, "pgv_adjustuse_pgv_dist")); - EXPECT_FALSE(payloadHas(payload, "pgv_ajdust_cy")); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToStationNormalizesVendorDocumentPgvCyAlias) -{ - AgvMotionOptions options; - options.asynchronous = true; - AgvAdapterParams adapter_params; - adapter_params.values.emplace("use_pgv", "true"); - adapter_params.values.emplace("pgv_ajdust_cy", "-0.2"); - controller_.clearRecords(); - - const auto result = agv_->navigateToStation( - "AP1", - options, - adapter_params); - - ASSERT_TRUE(result.ok()) << result.message; - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 2U); - const auto payload = parsePayload(records[1]); - EXPECT_TRUE(payloadValue(payload, "pgv_adjust_cy").isNumeric()); - EXPECT_DOUBLE_EQ(payloadValue(payload, "pgv_adjust_cy").asDouble(), -0.2); - EXPECT_FALSE(payloadHas(payload, "pgv_ajdust_cy")); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigateToStationRejectsInvalidPgvAdjustmentBeforeAcquiringAuthority) -{ - struct InvalidPgvCase { - const char* key; - const char* value; - const char* expected_detail; - }; - const InvalidPgvCase cases[] = { - {"use_pgv", "enabled", "must be a boolean string"}, - {"pgv_adjust_dist", "-0.1", "must be non-negative"}, - {"pgv_adjust_cx", "nan", "must be a complete finite number"}, - {"pgv_x_adjust", "0.5m", "must be a complete finite number"}, - {"pgv_ajdust_cy", "inf", "must be a complete finite number"}, - {"pgv_adjustuse_pgv_dist", "0.3", "vendor-document typo"}, - }; - - AgvMotionOptions options; - options.asynchronous = true; - for (const auto& test_case : cases) { - SCOPED_TRACE(test_case.key); - AgvAdapterParams adapter_params; - adapter_params.values.emplace(test_case.key, test_case.value); - controller_.clearRecords(); - - const auto result = agv_->navigateToStation( - "AP1", - options, - adapter_params); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE( - result.message.find(test_case.expected_detail), - std::string::npos); - EXPECT_TRUE(controller_.records().empty()); - } - - AgvAdapterParams ambiguous_adapter_params; - ambiguous_adapter_params.values.emplace("pgv_adjust_cy", "0.1"); - ambiguous_adapter_params.values.emplace("pgv_ajdust_cy", "0.2"); - controller_.clearRecords(); - - const auto ambiguous_result = agv_->navigateToStation( - "AP1", - options, - ambiguous_adapter_params); - - EXPECT_FALSE(ambiguous_result.ok()); - EXPECT_EQ(ambiguous_result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE( - ambiguous_result.message.find("must not both be set"), - std::string::npos); - EXPECT_TRUE(controller_.records().empty()); - - AgvAdapterParams mixed_action_adapter_params; - mixed_action_adapter_params.values.emplace("use_pgv", "true"); - mixed_action_adapter_params.values.emplace("operation", "JackHeight"); - mixed_action_adapter_params.values.emplace("jack_height", "0.5"); - controller_.clearRecords(); - - const auto mixed_action_result = agv_->navigateToStation( - "AP1", - options, - mixed_action_adapter_params); - - EXPECT_FALSE(mixed_action_result.ok()); - EXPECT_EQ(mixed_action_result.code, AgvErrorCode::InvalidArgument); - EXPECT_NE( - mixed_action_result.message.find( - "PGV adjustment must not be combined with adapter field"), - std::string::npos); - EXPECT_TRUE(controller_.records().empty()); -} - -TEST_F(SeerRobokitControlAuthorityTest, SetVelocityUsesOnlyDocumentedNumericFields) -{ - controller_.clearRecords(); - - const auto result = agv_->setVelocity(AgvVelocity{0.1, -0.2, 0.3}); - - ASSERT_TRUE(result.ok()) << result.message; - auto records = controller_.records(); - ASSERT_EQ(records.size(), 2U); - EXPECT_EQ(records[0].command, kRobotConfigLock); - EXPECT_EQ(records[1].command, kRobotControlMotion); - - auto payload = parsePayload(records[1]); - EXPECT_TRUE(payloadValue(payload, "vx").isNumeric()); - EXPECT_TRUE(payloadValue(payload, "vy").isNumeric()); - EXPECT_TRUE(payloadValue(payload, "w").isNumeric()); - EXPECT_DOUBLE_EQ(payloadValue(payload, "vx").asDouble(), 0.1); - EXPECT_DOUBLE_EQ(payloadValue(payload, "vy").asDouble(), -0.2); - EXPECT_DOUBLE_EQ(payloadValue(payload, "w").asDouble(), 0.3); - EXPECT_FALSE(payloadHas(payload, "duration")); - - controller_.clearRecords(); - const auto stop_result = agv_->stopVelocityControl(); - - ASSERT_TRUE(stop_result.ok()) << stop_result.message; - records = controller_.records(); - ASSERT_EQ(records.size(), 2U); - EXPECT_EQ(records[1].command, kRobotControlMotion); - payload = parsePayload(records[1]); - EXPECT_TRUE(payloadValue(payload, "vx").isNumeric()); - EXPECT_TRUE(payloadValue(payload, "vy").isNumeric()); - EXPECT_TRUE(payloadValue(payload, "w").isNumeric()); - EXPECT_DOUBLE_EQ(payloadValue(payload, "vx").asDouble(), 0.0); - EXPECT_DOUBLE_EQ(payloadValue(payload, "vy").asDouble(), 0.0); - EXPECT_DOUBLE_EQ(payloadValue(payload, "w").asDouble(), 0.0); - EXPECT_FALSE(payloadHas(payload, "duration")); -} - -TEST_F(SeerRobokitControlAuthorityTest, ControllerErrorCodeIsPreservedInResultMessage) -{ - controller_.setResponseCode(kRobotControlMotion, 41200); - controller_.clearRecords(); - - const auto result = agv_->setVelocity(AgvVelocity{0.1, 0.0, 0.0}); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, AgvErrorCode::CommandFailed); - EXPECT_NE(result.message.find("ret_code=41200"), std::string::npos); - EXPECT_NE(result.message.find("err_msg=simulated command failure"), std::string::npos); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - MapModeCommandsSupersedeTrackedFreeNavigation) -{ - auto result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(result.ok()) << result.message; - ASSERT_TRUE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - - result = agv_->switchMap("map-1"); - ASSERT_TRUE(result.ok()) << result.message; - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - - result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(result.ok()) << result.message; - ASSERT_TRUE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - - result = agv_->startMapping(); - ASSERT_TRUE(result.ok()) << result.message; - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - - result = agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(result.ok()) << result.message; - ASSERT_TRUE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - - result = agv_->stopMapping(); - ASSERT_TRUE(result.ok()) << result.message; - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - PauseResumeAndStopVelocityPreserveTrackedFreeNavigation) -{ - auto result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(result.ok()) << result.message; - ASSERT_TRUE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - - result = agv_->pauseNavigation(); - ASSERT_TRUE(result.ok()) << result.message; - EXPECT_TRUE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - - result = agv_->resumeNavigation(); - ASSERT_TRUE(result.ok()) << result.message; - EXPECT_TRUE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - - result = agv_->stopVelocityControl(); - ASSERT_TRUE(result.ok()) << result.message; - EXPECT_TRUE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - - controller_.clearRecords(); - const auto status = agv_->navigationStatus(); - EXPECT_EQ(status.state, AgvTaskState::Running); - EXPECT_EQ(status.type, AgvTaskType::NavigateToPose); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotStatusTaskPackage); -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigationStatusQueriesTrackedPoseTaskPackage) -{ - AgvAdapterParams adapter_params; - adapter_params.values.emplace("task_id", "pose-task-current"); - const auto navigate_result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - asynchronousMotionOptions(), - adapter_params); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - const auto navigate_records = controller_.records(); - ASSERT_GE(navigate_records.size(), 2U); - const auto navigate_payload = parsePayload(navigate_records[1]); - const std::string generated_task_id = - payloadValue(navigate_payload, "task_id").asString(); - ASSERT_FALSE(generated_task_id.empty()); - - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"create_on":"2026-07-31T10:00:01Z","err_msg":"","task_status_package":{"percentage":42.5,"distance":0.7,"info":"operator pause","task_status_list":[{"task_id":"${TASK_ID}","status":3,"type":1}]}})"); - controller_.clearRecords(); - - const auto status = agv_->navigationStatus(); - - EXPECT_EQ(status.state, AgvTaskState::Paused); - EXPECT_EQ(status.type, AgvTaskType::NavigateToPose); - EXPECT_DOUBLE_EQ(status.progress, 42.5); - EXPECT_NE(status.message.find("task_id=" + generated_task_id), std::string::npos); - EXPECT_NE(status.message.find("operator pause"), std::string::npos); - EXPECT_NE(status.message.find("create_on=2026-07-31T10:00:01Z"), std::string::npos); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotStatusTaskPackage); - const auto payload = parsePayload(records[0]); - const auto& task_ids = payloadValue(payload, "task_ids"); - ASSERT_TRUE(task_ids.isArray()); - ASSERT_EQ(task_ids.size(), 1U); - EXPECT_EQ(task_ids[0].asString(), generated_task_id); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigationStatusMapsControllerTaskStatusSevenToFailed) -{ - const auto navigate_result = agv_->navigateToPose( - math::Pose2d{1.0, 2.0, 0.5}, - asynchronousMotionOptions()); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"controller terminated tracked pose","task_status_list":[{"task_id":"${TASK_ID}","status":7,"type":1}]}})"); - controller_.clearRecords(); - - const auto status = agv_->navigationStatus(); - - EXPECT_EQ(status.state, AgvTaskState::Failed); - EXPECT_EQ(status.type, AgvTaskType::NavigateToPose); - EXPECT_NE(status.message.find("controller terminated tracked pose"), std::string::npos); - EXPECT_NE(status.message.find("task_status=7"), std::string::npos); - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotStatusTaskPackage); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigationStatusReturnsControllerFaultWhileTaskStillReportsRunning) -{ - const auto navigate_result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("E_RUNNING_STATUS_52: collision input active"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - *fault_push.demand("fatals", "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - controller_.clearRecords(); - - const auto status = agv_->navigationStatus(); - - EXPECT_EQ(status.state, AgvTaskState::Failed); - EXPECT_EQ(status.type, AgvTaskType::NavigateToPose); - EXPECT_NE(status.message.find("controller_task_state=2"), std::string::npos); - EXPECT_NE(status.message.find("E_RUNNING_STATUS_52"), std::string::npos); - EXPECT_TRUE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotStatusTaskPackage); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigationStatusPreservesFaultWhenTrackedTaskDisappears) -{ - const auto navigate_result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"task vanished","task_status_list":[]}})"); - controller_.clearRecords(); - AgvNavigationStatus status; - - std::thread status_thread([this, &status]() { - status = agv_->navigationStatus(); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("E_TASK_GONE_54: controller removed failed task"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - *fault_push.demand("fatals", "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - status_thread.join(); - - EXPECT_EQ(status.state, AgvTaskState::Failed); - EXPECT_EQ(status.type, AgvTaskType::NavigateToPose); - EXPECT_NE(status.message.find("task disappeared"), std::string::npos); - EXPECT_NE(status.message.find("E_TASK_GONE_54"), std::string::npos); - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - const auto records = controller_.records(); - EXPECT_FALSE(std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTask; - })); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigationStatusRejectsFaultArrivingDuringCompletedPoseVerification) -{ - const auto navigate_result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"controller says complete","task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":1.0,"y":2.0,"angle":0.5})"); - controller_.setResponseDelay( - kRobotStatusLoc, - std::chrono::milliseconds(300)); - controller_.clearRecords(); - AgvNavigationStatus status; - - std::thread status_thread([this, &status]() { - status = agv_->navigationStatus(); - }); - - bool location_query_observed = false; - for (int attempt = 0; attempt < 700; ++attempt) { - const auto records = controller_.records(); - location_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusLoc; - }); - if (location_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(location_query_observed); - - Json::Value fault_push(Json::objectValue); - Json::Value errors(Json::arrayValue); - errors.append("E_STATUS_VERIFY_53: fault during completed pose check"); - *fault_push.demand("errors", "errors" + std::strlen("errors")) = errors; - *fault_push.demand("fatals", "fatals" + std::strlen("fatals")) = - Json::Value(Json::arrayValue); - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - status_thread.join(); - - EXPECT_EQ(status.state, AgvTaskState::Failed); - EXPECT_EQ(status.type, AgvTaskType::NavigateToPose); - EXPECT_NE(status.message.find("target verification"), std::string::npos); - EXPECT_NE(status.message.find("E_STATUS_VERIFY_53"), std::string::npos); - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigationStatusRejectsCompletedPoseWhenTargetWasNotReached) -{ - const auto navigate_result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"controller says complete","task_status_list":[{"task_id":"${TASK_ID}","status":4,"type":1}]}})"); - controller_.setResponsePayload( - kRobotStatusLoc, - R"({"ret_code":0,"x":0.0,"y":0.0,"angle":0.0})"); - controller_.clearRecords(); - - const auto status = agv_->navigationStatus(); - - EXPECT_EQ(status.state, AgvTaskState::Failed); - EXPECT_EQ(status.type, AgvTaskType::NavigateToPose); - EXPECT_NE( - status.message.find("requested target was not reached"), - std::string::npos); - EXPECT_NE(status.message.find("distance_error"), std::string::npos); - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 2U); - EXPECT_EQ(records[0].command, kRobotStatusTaskPackage); - EXPECT_EQ(records[1].command, kRobotStatusLoc); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigationStatusWaitsBrieflyForLateControllerFaultDetail) -{ - const auto navigate_result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"planner failed","task_status_list":[{"task_id":"${TASK_ID}","status":5,"type":1}]}})"); - controller_.clearRecords(); - AgvNavigationStatus status; - - std::thread status_thread([this, &status]() { - status = agv_->navigationStatus(); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 200; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - Json::Value fault_push(Json::objectValue); - Json::Value fatals(Json::arrayValue); - fatals.append("E_LATE_77: localization alarm"); - *fault_push.demand("fatals", "fatals" + std::strlen("fatals")) = fatals; - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, fault_push); - status_thread.join(); - - EXPECT_EQ(status.state, AgvTaskState::Failed); - EXPECT_EQ(status.type, AgvTaskType::NavigateToPose); - EXPECT_NE(status.message.find("planner failed"), std::string::npos); - EXPECT_NE(status.message.find("E_LATE_77"), std::string::npos); - EXPECT_NE(status.message.find("localization alarm"), std::string::npos); - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); -} - -TEST_F( - SeerRobokitControlAuthorityTest, - NavigationStatusDoesNotReturnOldPoseTaskAfterStationSupersedesIt) -{ - const auto navigate_result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - - controller_.setResponsePayload( - kRobotStatusTaskPackage, - R"({"ret_code":0,"task_status_package":{"info":"old pose paused","task_status_list":[{"task_id":"${TASK_ID}","status":3,"type":1}]}})"); - controller_.setResponseDelay( - kRobotStatusTaskPackage, - std::chrono::milliseconds(300)); - controller_.setResponsePayload( - kRobotStatusTask, - R"({"ret_code":0,"err_msg":"","task_status":2,"task_type":2,"move_status_info":"station task running"})"); - controller_.clearRecords(); - AgvNavigationStatus status; - - std::thread status_thread([this, &status]() { - status = agv_->navigationStatus(); - }); - - bool status_query_observed = false; - for (int attempt = 0; attempt < 500; ++attempt) { - const auto records = controller_.records(); - status_query_observed = std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTaskPackage; - }); - if (status_query_observed) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_TRUE(status_query_observed); - - const auto station_result = agv_->navigateToStation("station-1", asynchronousMotionOptions()); - status_thread.join(); - - ASSERT_TRUE(station_result.ok()) << station_result.message; - EXPECT_EQ(status.state, AgvTaskState::Running); - EXPECT_EQ(status.type, AgvTaskType::NavigateToStation); - EXPECT_EQ(status.message, "station task running"); - const auto records = controller_.records(); - EXPECT_TRUE(std::any_of( - records.begin(), - records.end(), - [](const CommandRecord& record) { - return record.command == kRobotStatusTask; - })); -} - -TEST_F(SeerRobokitControlAuthorityTest, DisconnectClearsTrackedPoseTask) -{ - const auto navigate_result = - agv_->navigateToPose(math::Pose2d{1.0, 2.0, 0.5}, asynchronousMotionOptions()); - ASSERT_TRUE(navigate_result.ok()) << navigate_result.message; - ASSERT_TRUE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); - - const auto disconnect_result = SeerRobokitAgvTestPeer::disconnect(*agv_); - - ASSERT_TRUE(disconnect_result.ok()) << disconnect_result.message; - EXPECT_FALSE(SeerRobokitAgvTestPeer::hasTrackedPoseTask(*agv_)); -} - -TEST_F(SeerRobokitControlAuthorityTest, RuntimeStatePreservesCachedControllerFaultDetail) -{ - Json::Value push_payload(Json::objectValue); - Json::Value errors(Json::arrayValue); - Json::Value error(Json::objectValue); - *error.demand("code", "code" + std::strlen("code")) = "E_NAV_42"; - *error.demand("message", "message" + std::strlen("message")) = "planner alarm"; - errors.append(error); - *push_payload.demand("errors", "errors" + std::strlen("errors")) = errors; - SeerRobokitAgvTestPeer::cacheRuntimeState(*agv_, push_payload); - SeerRobokitAgvTestPeer::setAdapterError( - *agv_, - "SEER Robokit map file is empty after stripping the transport header"); - controller_.clearRecords(); - - const auto state = agv_->runtimeState(); - - EXPECT_TRUE(state.connected); - EXPECT_TRUE(state.fault); - EXPECT_EQ(state.mode, AgvMode::Fault); - EXPECT_NE(state.last_error.find("E_NAV_42"), std::string::npos); - EXPECT_NE(state.last_error.find("planner alarm"), std::string::npos); - EXPECT_NE(state.last_error.find("adapter_error="), std::string::npos); - EXPECT_NE(state.last_error.find("map file is empty"), std::string::npos); - EXPECT_TRUE(controller_.records().empty()); -} - -TEST_F(SeerRobokitControlAuthorityTest, NavigationStatusPreservesControllerErrorCode) -{ - controller_.setResponseCode(kRobotStatusTask, 51020); - controller_.clearRecords(); - - const auto status = agv_->navigationStatus(); - - EXPECT_EQ(status.state, AgvTaskState::Failed); - EXPECT_NE(status.message.find("ret_code=51020"), std::string::npos); - EXPECT_NE(status.message.find("err_msg=simulated command failure"), std::string::npos); - const auto records = controller_.records(); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records[0].command, kRobotStatusTask); -} - -} // namespace -} // namespace cmvr::device diff --git a/cmvr-es/devices/arm/aubo_arm/CMakeLists.txt b/cmvr-es/devices/arm/aubo_arm/CMakeLists.txt index d52da874..2b3231c6 100644 --- a/cmvr-es/devices/arm/aubo_arm/CMakeLists.txt +++ b/cmvr-es/devices/arm/aubo_arm/CMakeLists.txt @@ -54,88 +54,3 @@ target_link_libraries(aubo_arm add_library(cmvr_es::device::aubo_arm ALIAS aubo_arm) install(TARGETS aubo_arm LIBRARY DESTINATION lib) - -if(BUILD_TESTING) - enable_testing() - add_executable(aubo_arm_motion_result_test - tests/aubo_arm_motion_result_test.cpp - ) - target_include_directories(aubo_arm_motion_result_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - add_test( - NAME aubo_arm_motion_result_test - COMMAND aubo_arm_motion_result_test - ) - set_tests_properties(aubo_arm_motion_result_test PROPERTIES TIMEOUT 10) - - add_executable(aubo_motion_state_test - tests/aubo_motion_state_test.cpp - ) - target_include_directories(aubo_motion_state_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - add_test( - NAME aubo_motion_state_test - COMMAND aubo_motion_state_test - ) - set_tests_properties(aubo_motion_state_test PROPERTIES TIMEOUT 10) - - add_executable(aubo_safety_state_test - tests/aubo_safety_state_test.cpp - ) - target_include_directories(aubo_safety_state_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - add_test( - NAME aubo_safety_state_test - COMMAND aubo_safety_state_test - ) - set_tests_properties(aubo_safety_state_test PROPERTIES TIMEOUT 10) - - add_executable(aubo_arm_json_command_test - tests/aubo_arm_json_command_test.cpp - ) - target_link_libraries(aubo_arm_json_command_test - PRIVATE - cmvr_es::device::aubo_arm - cmvr_es::proto - ) - add_test( - NAME aubo_arm_json_command_test - COMMAND aubo_arm_json_command_test - ) - set_tests_properties(aubo_arm_json_command_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - if(UNIX AND NOT APPLE) - # The imported AUBO target still contributes its vendor directory to - # direct consumers' build-tree RUNPATH. Put the system runtime first - # for this test; installed artifacts exclude the vendor libstdc++. - execute_process( - COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libstdc++.so.6 - OUTPUT_VARIABLE AUBO_TEST_SYSTEM_LIBSTDCXX - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if(EXISTS "${AUBO_TEST_SYSTEM_LIBSTDCXX}") - get_filename_component( - AUBO_TEST_SYSTEM_LIBSTDCXX_REAL - "${AUBO_TEST_SYSTEM_LIBSTDCXX}" - REALPATH - ) - get_filename_component( - AUBO_TEST_SYSTEM_LIBSTDCXX_DIR - "${AUBO_TEST_SYSTEM_LIBSTDCXX_REAL}" - DIRECTORY - ) - set_property( - TARGET aubo_arm_json_command_test - PROPERTY BUILD_RPATH "${AUBO_TEST_SYSTEM_LIBSTDCXX_DIR}" - ) - endif() - endif() -endif() diff --git a/cmvr-es/devices/arm/aubo_arm/README.md b/cmvr-es/devices/arm/aubo_arm/README.md index f895c6cd..0d8c752a 100644 --- a/cmvr-es/devices/arm/aubo_arm/README.md +++ b/cmvr-es/devices/arm/aubo_arm/README.md @@ -12,7 +12,6 @@ ## 代码与配置 - 实现:[`aubo_arm.h`](aubo_arm.h)、[`aubo_arm.cpp`](aubo_arm.cpp) -- 测试:[`tests/aubo_arm_json_command_test.cpp`](tests/aubo_arm_json_command_test.cpp) - 设备配置:[`../../../config/devices/arm/aubo_arm.pb.txt`](../../../config/devices/arm/aubo_arm.pb.txt) - DeviceManager 配置: [`../../../config/manager/device_manager.pb.txt`](../../../config/manager/device_manager.pb.txt) @@ -136,18 +135,3 @@ cmake --install build - 模拟量 IO 涉及 domain、单位和量程,当前 JSON 接口不开放; - gRPC/JSON 返回成功不代表目标 IO 具备功能安全等级; - 真实写测试前应确认通道用途、负载、电气隔离、默认电平和控制器程序所有权。 - -## 测试 - -```bash -cmake --build build --target \ - aubo_safety_state_test \ - aubo_motion_state_test \ - aubo_arm_json_command_test -j4 -ctest --test-dir build \ - -R 'aubo_(safety_state|motion_state|arm_json_command)_test' \ - --output-on-failure -``` - -该测试覆盖 JSON 校验和无硬件错误路径,不代表已在真实 AUBO 控制柜完成 DI/DO -读取、写入或 runstate 拒绝验证。 diff --git a/cmvr-es/devices/arm/aubo_arm/tests/aubo_arm_json_command_test.cpp b/cmvr-es/devices/arm/aubo_arm/tests/aubo_arm_json_command_test.cpp deleted file mode 100644 index d31683f6..00000000 --- a/cmvr-es/devices/arm/aubo_arm/tests/aubo_arm_json_command_test.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "devices/arm/aubo_arm/aubo_arm.h" - -#include -#include - -namespace { - -#define CHECK_TRUE(condition) \ - do { \ - if (!(condition)) { \ - std::cerr << "CHECK_TRUE failed at line " << __LINE__ << ": " \ - << #condition << std::endl; \ - return 1; \ - } \ - } while (false) - -bool contains(const std::string& value, const std::string& expected) -{ - return value.find(expected) != std::string::npos; -} - -cmvr::config::RobotArmConfig makeConfig() -{ - cmvr::config::RobotArmConfig config; - config.set_id("aubo_arm_json_test"); - auto* vendor = config.mutable_vendor(); - vendor->set_brand(cmvr::config::VENDOR_ROBOT_ARM_BRAND_AUBO_ARM); - vendor->set_model("AuboTest"); - vendor->set_dof(6); - return config; -} - -} // namespace - -int main() -{ - cmvr::device::AuboArm arm(makeConfig()); - cmvr::device::AbstractDevice* device = &arm; - std::string response; - - CHECK_TRUE(!device->executeJsonCommand("{", response)); - CHECK_TRUE(contains(response, R"("error_code":"invalid_json")")); - - CHECK_TRUE(!device->executeJsonCommand("[]", response)); - CHECK_TRUE(contains(response, R"("error_code":"invalid_json")")); - - CHECK_TRUE(!device->executeJsonCommand( - R"({"command":"ptz","operation":"get_di","index":0})", response)); - CHECK_TRUE(contains(response, R"("error_code":"unsupported_command")")); - - CHECK_TRUE(!device->executeJsonCommand( - R"({"command":"cabinet_io","operation":"get_ai","index":0})", response)); - CHECK_TRUE(contains(response, R"("error_code":"invalid_operation")")); - - CHECK_TRUE(!device->executeJsonCommand( - R"({"command":"cabinet_io","operation":"get_di","index":-1})", response)); - CHECK_TRUE(contains(response, R"("error_code":"invalid_argument")")); - - CHECK_TRUE(!device->executeJsonCommand( - R"({"command":"cabinet_io","operation":"set_do","index":0,"value":1})", - response)); - CHECK_TRUE(contains(response, R"("error_code":"invalid_argument")")); - - CHECK_TRUE(!device->executeJsonCommand( - R"({"command":"cabinet_io","operation":"set_do","index":0})", response)); - CHECK_TRUE(contains(response, R"("error_code":"invalid_argument")")); - - CHECK_TRUE(!device->executeJsonCommand( - R"({"command":"cabinet_io","operation":"get_di","index":0})", response)); - CHECK_TRUE(contains(response, R"("error_code":"not_connected")")); - - CHECK_TRUE(!device->executeJsonCommand( - R"({"command":"cabinet_io","operation":"get_do","index":0})", response)); - CHECK_TRUE(contains(response, R"("operation":"get_do")")); - CHECK_TRUE(contains(response, R"("error_code":"not_connected")")); - - CHECK_TRUE(!device->executeJsonCommand( - R"({"command":"cabinet_io","operation":"set_do","index":0,"value":true})", - response)); - CHECK_TRUE(contains(response, R"("operation":"set_do")")); - CHECK_TRUE(contains(response, R"("error_code":"not_connected")")); - - return 0; -} diff --git a/cmvr-es/devices/arm/aubo_arm/tests/aubo_arm_motion_result_test.cpp b/cmvr-es/devices/arm/aubo_arm/tests/aubo_arm_motion_result_test.cpp deleted file mode 100644 index 57bca235..00000000 --- a/cmvr-es/devices/arm/aubo_arm/tests/aubo_arm_motion_result_test.cpp +++ /dev/null @@ -1,158 +0,0 @@ -#include "devices/arm/aubo_arm/aubo_motion_result.h" -#include "devices/arm/aubo_arm/aubo_torque_on_result.h" - -#include -#include -#include -#include - -namespace { - -#define CHECK_TRUE(condition) \ - do { \ - if (!(condition)) { \ - std::cerr << "CHECK_TRUE failed at line " << __LINE__ << ": " \ - << #condition << std::endl; \ - return 1; \ - } \ - } while (false) - -} // namespace - -int main() -{ - using cmvr::device::aubo_internal::MotionCommandOutcome; - using cmvr::device::aubo_internal::MotionWaitResult; - using cmvr::device::aubo_internal::preservePrimaryTorqueOnFailure; - using cmvr::device::aubo_internal::resolveMotionCommand; - using cmvr::device::aubo_internal::runTorqueOnControllerMutation; - - constexpr int success_code = 0; - constexpr int request_ignore_code = 13; - - int wait_calls = 0; - const auto wait_succeeded = [&wait_calls]() { - ++wait_calls; - return MotionWaitResult::Completed; - }; - CHECK_TRUE(resolveMotionCommand( - success_code, - success_code, - request_ignore_code, - wait_succeeded) == MotionCommandOutcome::CompletedAfterMotion); - CHECK_TRUE(wait_calls == 1); - - wait_calls = 0; - CHECK_TRUE(resolveMotionCommand( - request_ignore_code, - success_code, - request_ignore_code, - wait_succeeded) == MotionCommandOutcome::CompletedWithoutMotion); - CHECK_TRUE(wait_calls == 0); - - const int submit_failures[] = {1, 2, 3, -request_ignore_code}; - for (const int return_code : submit_failures) { - wait_calls = 0; - CHECK_TRUE(resolveMotionCommand( - return_code, - success_code, - request_ignore_code, - wait_succeeded) == MotionCommandOutcome::SubmitFailed); - CHECK_TRUE(wait_calls == 0); - } - - wait_calls = 0; - const auto wait_failed = [&wait_calls]() { - ++wait_calls; - return MotionWaitResult::Failed; - }; - CHECK_TRUE(resolveMotionCommand( - success_code, - success_code, - request_ignore_code, - wait_failed) == MotionCommandOutcome::CompletionFailed); - CHECK_TRUE(wait_calls == 1); - - wait_calls = 0; - const auto wait_cancelled = [&wait_calls]() { - ++wait_calls; - return MotionWaitResult::Cancelled; - }; - CHECK_TRUE(resolveMotionCommand( - success_code, - success_code, - request_ignore_code, - wait_cancelled) == MotionCommandOutcome::Cancelled); - CHECK_TRUE(wait_calls == 1); - - using cmvr::device::ArmErrorCode; - using cmvr::device::Result; - std::vector mutation_trace; - const auto failed_mutation = runTorqueOnControllerMutation( - success_code, - [&mutation_trace] { - mutation_trace.push_back("mutation"); - return 42; - }, - [&mutation_trace](const int return_code) { - mutation_trace.push_back("primary-failure"); - return Result::failure( - ArmErrorCode::CommandFailed, - "vendor failure ret=" + std::to_string(return_code)); - }, - [&mutation_trace]() -> std::optional { - mutation_trace.push_back("cancellation-cleanup"); - return Result::failure( - ArmErrorCode::CommandRejected, - "controller safety termination confirmed"); - }); - CHECK_TRUE(failed_mutation.has_value()); - CHECK_TRUE(failed_mutation->code == ArmErrorCode::CommandFailed); - CHECK_TRUE( - failed_mutation->message.find("vendor failure ret=42") != - std::string::npos); - CHECK_TRUE( - failed_mutation->message.find( - "controller safety termination confirmed") != - std::string::npos); - CHECK_TRUE(mutation_trace.size() == 3); - CHECK_TRUE(mutation_trace[0] == "mutation"); - CHECK_TRUE(mutation_trace[1] == "primary-failure"); - CHECK_TRUE(mutation_trace[2] == "cancellation-cleanup"); - - const auto cleanup_failed = preservePrimaryTorqueOnFailure( - Result::failure( - ArmErrorCode::CommandFailed, - "vendor exception"), - std::optional{Result::failure( - ArmErrorCode::CommandFailed, - "safety termination failed")}); - CHECK_TRUE(cleanup_failed.code == ArmErrorCode::CommandFailed); - CHECK_TRUE( - cleanup_failed.message.find("vendor exception") != - std::string::npos); - CHECK_TRUE( - cleanup_failed.message.find("safety termination failed") != - std::string::npos); - - int successful_cancellation_checks = 0; - const auto cancelled_after_success = runTorqueOnControllerMutation( - success_code, - [] { return 0; }, - [](const int) { - return Result::failure( - ArmErrorCode::CommandFailed, "must not be used"); - }, - [&successful_cancellation_checks]() -> std::optional { - ++successful_cancellation_checks; - return Result::failure( - ArmErrorCode::CommandRejected, - "cancelled after successful mutation"); - }); - CHECK_TRUE(cancelled_after_success.has_value()); - CHECK_TRUE( - cancelled_after_success->code == ArmErrorCode::CommandRejected); - CHECK_TRUE(successful_cancellation_checks == 1); - - return 0; -} diff --git a/cmvr-es/devices/arm/aubo_arm/tests/aubo_motion_state_test.cpp b/cmvr-es/devices/arm/aubo_arm/tests/aubo_motion_state_test.cpp deleted file mode 100644 index 6f68937d..00000000 --- a/cmvr-es/devices/arm/aubo_arm/tests/aubo_motion_state_test.cpp +++ /dev/null @@ -1,213 +0,0 @@ -#include "devices/arm/aubo_arm/aubo_motion_state.h" - -#include -#include -#include -#include - -namespace { - -#define CHECK_TRUE(condition) \ - do { \ - if (!(condition)) { \ - std::cerr << "CHECK_TRUE failed at line " << __LINE__ << ": " \ - << #condition << std::endl; \ - return 1; \ - } \ - } while (false) - -} // namespace - -int main() -{ - using namespace cmvr::device::aubo_internal; - - MotionState state; - CHECK_TRUE(state.begin(MotionKind::None).status == - MotionStartStatus::Invalid); - const auto joint = state.begin(MotionKind::Joint); - CHECK_TRUE(joint.started()); - CHECK_TRUE(state.busy()); - CHECK_TRUE(state.begin(MotionKind::Linear).status == - MotionStartStatus::Busy); - - const auto stop_joint = state.beginStop(); - CHECK_TRUE(stop_joint.started()); - CHECK_TRUE(stop_joint.kind == MotionKind::Joint); - CHECK_TRUE(stop_joint.active_token.generation == - joint.token.generation); - CHECK_TRUE(stop_joint.tracked_motion); - CHECK_TRUE(state.cancelled(joint.token)); - const auto joined_stop_joint = state.beginStop(); - CHECK_TRUE(joined_stop_joint.status == - StopStartStatus::AlreadyStopping); - CHECK_TRUE( - state.waitForStopCompletion( - joined_stop_joint, std::chrono::milliseconds(1)) == - StopWaitStatus::Timeout); - CHECK_TRUE(state.begin(MotionKind::Linear).status == - MotionStartStatus::Stopping); - CHECK_TRUE(!state.waitForOwnerExit( - joint.token, std::chrono::milliseconds(1))); - CHECK_TRUE(!state.completeStop()); - - state.finish(joint.token); - CHECK_TRUE(state.waitForOwnerExit( - joint.token, std::chrono::milliseconds(1))); - CHECK_TRUE(state.completeStop()); - CHECK_TRUE( - state.waitForStopCompletion( - joined_stop_joint, std::chrono::milliseconds(1)) == - StopWaitStatus::Completed); - CHECK_TRUE(!state.busy()); - - const auto linear = state.begin(MotionKind::Linear); - CHECK_TRUE(linear.started()); - CHECK_TRUE(!state.cancelled(linear.token)); - // A delayed guard from the cancelled command must not release a newer one. - state.finish(joint.token); - CHECK_TRUE(state.busy()); - state.finish(linear.token, MotionFinishMode::Clear); - CHECK_TRUE(!state.busy()); - - const auto speed_joint = state.begin(MotionKind::Joint); - CHECK_TRUE(speed_joint.started()); - state.finish(speed_joint.token, MotionFinishMode::Retain); - CHECK_TRUE(state.busy()); - CHECK_TRUE(state.begin(MotionKind::Linear).status == - MotionStartStatus::Busy); - const auto rejected_speed_update = - state.begin(MotionKind::Joint, true); - CHECK_TRUE(rejected_speed_update.started()); - state.finish( - rejected_speed_update.token, - MotionFinishMode::RestorePrevious); - const auto stop_speed = state.beginStop(); - CHECK_TRUE(stop_speed.started()); - CHECK_TRUE(stop_speed.kind == MotionKind::Joint); - CHECK_TRUE(stop_speed.tracked_motion); - CHECK_TRUE(state.completeStop()); - CHECK_TRUE(!state.busy()); - - const auto idle_stop = state.beginStop(); - CHECK_TRUE(idle_stop.kind == MotionKind::None); - CHECK_TRUE(!idle_stop.tracked_motion); - const auto joined_idle_stop = state.beginStop(); - CHECK_TRUE(joined_idle_stop.status == - StopStartStatus::AlreadyStopping); - state.failStop(); - CHECK_TRUE( - state.waitForStopCompletion( - joined_idle_stop, std::chrono::milliseconds(1)) == - StopWaitStatus::Failed); - const auto retry_idle_stop = state.beginStop(); - CHECK_TRUE(retry_idle_stop.kind == MotionKind::None); - CHECK_TRUE(!retry_idle_stop.tracked_motion); - CHECK_TRUE(state.completeStop()); - - const auto mismatched_stop_motion = state.begin(MotionKind::Linear); - CHECK_TRUE(mismatched_stop_motion.started()); - const auto mismatched_stop = state.beginStop(MotionKind::Joint); - CHECK_TRUE(mismatched_stop.kind == MotionKind::Linear); - state.finish(mismatched_stop_motion.token); - CHECK_TRUE(state.completeStop()); - - const auto uncertain_motion = state.begin(MotionKind::Joint); - CHECK_TRUE(uncertain_motion.started()); - state.failMotion(uncertain_motion.token); - CHECK_TRUE(state.busy()); - CHECK_TRUE(state.begin(MotionKind::Linear).status == - MotionStartStatus::Blocked); - const auto stop_uncertain = state.beginStop(); - CHECK_TRUE(stop_uncertain.kind == MotionKind::Joint); - CHECK_TRUE(stop_uncertain.tracked_motion); - CHECK_TRUE(state.completeStop()); - - const auto failed_stop_motion = state.begin(MotionKind::Linear); - CHECK_TRUE(failed_stop_motion.started()); - const auto failed_stop = state.beginStop(); - CHECK_TRUE(failed_stop.kind == MotionKind::Linear); - state.failStop(); - CHECK_TRUE(state.busy()); - CHECK_TRUE(state.begin(MotionKind::Joint).status == - MotionStartStatus::Blocked); - state.finish(failed_stop_motion.token); - - const auto retry = state.beginStop(); - CHECK_TRUE(retry.started()); - CHECK_TRUE(retry.kind == MotionKind::Linear); - CHECK_TRUE(state.completeStop()); - const auto recovered = state.begin(MotionKind::Joint); - CHECK_TRUE(recovered.started()); - state.finish(recovered.token, MotionFinishMode::Clear); - - const auto safety_motion = state.begin(MotionKind::Linear); - CHECK_TRUE(safety_motion.started()); - const auto safety_cancel = state.cancelActiveForSafety(); - CHECK_TRUE(safety_cancel.kind == MotionKind::Linear); - CHECK_TRUE(safety_cancel.tracked_motion); - CHECK_TRUE(state.cancelled(safety_motion.token)); - CHECK_TRUE(state.begin(MotionKind::Joint).status == - MotionStartStatus::Blocked); - state.finish(safety_motion.token); - const auto safety_stop = state.beginStop(); - CHECK_TRUE(safety_stop.started()); - CHECK_TRUE(safety_stop.kind == MotionKind::Linear); - CHECK_TRUE(state.completeStop()); - - const auto retained_speed = state.begin(MotionKind::Joint); - CHECK_TRUE(retained_speed.started()); - state.finish(retained_speed.token, MotionFinishMode::Retain); - const auto retained_cancel = state.cancelActiveForSafety(); - CHECK_TRUE(retained_cancel.kind == MotionKind::Joint); - CHECK_TRUE(retained_cancel.tracked_motion); - CHECK_TRUE(!retained_cancel.active_token.valid()); - CHECK_TRUE(state.begin(MotionKind::Linear).status == - MotionStartStatus::Blocked); - const auto retained_stop = state.beginStop(); - CHECK_TRUE(retained_stop.started()); - CHECK_TRUE(retained_stop.kind == MotionKind::Joint); - CHECK_TRUE(retained_stop.tracked_motion); - CHECK_TRUE(state.completeStop()); - - // A waiter keeps the completion for the stop it joined even when another - // stop starts and finishes before the waiter is scheduled again. - const auto concurrent_first_stop = state.beginStop(); - CHECK_TRUE(concurrent_first_stop.started()); - const auto concurrent_first_join = state.beginStop(); - CHECK_TRUE(concurrent_first_join.status == - StopStartStatus::AlreadyStopping); - std::atomic waiter_entered{false}; - std::atomic first_wait_result{ - StopWaitStatus::Timeout}; - std::thread first_waiter([&]() { - waiter_entered.store(true, std::memory_order_release); - first_wait_result.store( - state.waitForStopCompletion( - concurrent_first_join, - std::chrono::milliseconds(500)), - std::memory_order_release); - }); - while (!waiter_entered.load(std::memory_order_acquire)) { - std::this_thread::yield(); - } - - const bool concurrent_first_completed = state.completeStop(); - const auto concurrent_second_stop = state.beginStop(); - const auto concurrent_second_join = state.beginStop(); - state.failStop(); - first_waiter.join(); - - CHECK_TRUE(concurrent_first_completed); - CHECK_TRUE(concurrent_second_stop.started()); - CHECK_TRUE(concurrent_second_join.status == - StopStartStatus::AlreadyStopping); - CHECK_TRUE(first_wait_result.load(std::memory_order_acquire) == - StopWaitStatus::Completed); - CHECK_TRUE( - state.waitForStopCompletion( - concurrent_second_join, std::chrono::milliseconds(1)) == - StopWaitStatus::Failed); - - return 0; -} diff --git a/cmvr-es/devices/arm/aubo_arm/tests/aubo_safety_state_test.cpp b/cmvr-es/devices/arm/aubo_arm/tests/aubo_safety_state_test.cpp deleted file mode 100644 index 1d350990..00000000 --- a/cmvr-es/devices/arm/aubo_arm/tests/aubo_safety_state_test.cpp +++ /dev/null @@ -1,156 +0,0 @@ -#include "devices/arm/aubo_arm/aubo_safety_state.h" - -#include - -namespace { - -#define CHECK_TRUE(condition) \ - do { \ - if (!(condition)) { \ - std::cerr << "CHECK_TRUE failed at line " << __LINE__ << ": " \ - << #condition << std::endl; \ - return 1; \ - } \ - } while (false) - -} // namespace - -int main() -{ - using namespace cmvr::device::aubo_internal; - - SafetyState state; - CHECK_TRUE(!state.tryPermit().has_value()); - - state.observe(SafetyCondition::Normal); - const auto initial_permit = state.tryPermit(); - CHECK_TRUE(initial_permit.has_value()); - CHECK_TRUE(state.validate(*initial_permit)); - - CHECK_TRUE(effectiveSafetyCondition(SafetyCondition::Normal, 1) == - SafetyCondition::RobotEmergencyStop); - CHECK_TRUE(effectiveSafetyCondition(SafetyCondition::Normal, -1) == - SafetyCondition::Unknown); - CHECK_TRUE(effectiveSafetyCondition(SafetyCondition::Reduced, 0) == - SafetyCondition::Reduced); - CHECK_TRUE(needsProtectiveUnlock(SafetyCondition::ProtectiveStop)); - CHECK_TRUE(needsProtectiveUnlock(SafetyCondition::Violation)); - CHECK_TRUE(!needsProtectiveUnlock(SafetyCondition::SafeguardStop)); - CHECK_TRUE(needsInterfaceBoardRestart( - SafetyCondition::RobotEmergencyStop)); - CHECK_TRUE(needsInterfaceBoardRestart( - SafetyCondition::SystemEmergencyStop)); - CHECK_TRUE(needsInterfaceBoardRestart(SafetyCondition::Fault)); - CHECK_TRUE(!needsInterfaceBoardRestart(SafetyCondition::Recovery)); - - state.observe(SafetyCondition::RobotEmergencyStop); - CHECK_TRUE(!state.validate(*initial_permit)); - CHECK_TRUE(state.snapshot().latched); - CHECK_TRUE(!state.beginRecovery(state.snapshot().epoch).has_value()); - - // The observed level alone does not unlock motion. The monitor must first - // prove the old controller operation is fully quiescent. - state.observe(SafetyCondition::Normal); - CHECK_TRUE(state.snapshot().latched); - CHECK_TRUE(!state.tryPermit().has_value()); - CHECK_TRUE(!shouldAutoRecoverHardwareEmergencyStop( - state.snapshot(), false, 0, true, false)); - CHECK_TRUE(shouldAutoRecoverHardwareEmergencyStop( - state.snapshot(), true, 0, true, false)); - CHECK_TRUE(!shouldAutoRecoverHardwareEmergencyStop( - state.snapshot(), true, 0, false, false)); - CHECK_TRUE(!shouldAutoRecoverHardwareEmergencyStop( - state.snapshot(), true, 0, true, true)); - - const auto recovery = state.beginRecovery(state.snapshot().epoch); - CHECK_TRUE(recovery.has_value()); - CHECK_TRUE(!state.completeRecovery(*recovery, true, true, false)); - state.failRecovery(*recovery); - - const auto retry = state.beginRecovery(state.snapshot().epoch); - CHECK_TRUE(retry.has_value()); - // Automatic release is not committed at Idle/PowerOn. The controller - // must have completed startup and reached Running first. - CHECK_TRUE(!state.completeHardwareEmergencyStopRecovery( - *retry, false, true, true)); - CHECK_TRUE(!state.completeHardwareEmergencyStopRecovery( - *retry, true, false, true)); - CHECK_TRUE(state.completeHardwareEmergencyStopRecovery( - *retry, true, true, true)); - const auto recovered_permit = state.tryPermit(); - CHECK_TRUE(recovered_permit.has_value()); - CHECK_TRUE(state.validate(*recovered_permit)); - - // Some AUBO cabinets drop the SDK connection while the physical E-stop is - // pressed. Losing the monitor sample must not erase the hardware E-stop - // latch; otherwise releasing the switch back to Normal would never trigger - // automatic power-on. - state.observe(SafetyCondition::RobotEmergencyStop); - const auto estop_epoch = state.snapshot().epoch; - state.observe(SafetyCondition::Unknown); - CHECK_TRUE(state.snapshot().latched); - CHECK_TRUE(state.snapshot().latched_reason == - SafetyCondition::RobotEmergencyStop); - CHECK_TRUE(state.snapshot().epoch == estop_epoch); - state.observe(SafetyCondition::Normal); - CHECK_TRUE(shouldAutoRecoverHardwareEmergencyStop( - state.snapshot(), true, 0, true, false)); - const auto disconnected_recovery = state.beginRecovery( - state.snapshot().epoch); - CHECK_TRUE(disconnected_recovery.has_value()); - CHECK_TRUE(state.completeHardwareEmergencyStopRecovery( - *disconnected_recovery, true, true, true)); - - // Releasing a real E-stop must never clear a software-triggered stop that - // was latched while the hardware input was active. - state.observe(SafetyCondition::RobotEmergencyStop); - state.observe(SafetyCondition::SoftwareEmergencyStop); - // The hardware monitor continues publishing the physical E-stop level - // until the switch is released. It must not overwrite the software latch. - state.observe(SafetyCondition::RobotEmergencyStop); - state.observe(SafetyCondition::Normal); - CHECK_TRUE(!shouldAutoRecoverHardwareEmergencyStop( - state.snapshot(), true, 0, true, false)); - CHECK_TRUE(state.snapshot().software_emergency_stop_latched); - CHECK_TRUE(state.snapshot().latched_reason == - SafetyCondition::SoftwareEmergencyStop); - const auto software_recovery = state.beginRecovery( - state.snapshot().epoch); - CHECK_TRUE(software_recovery.has_value()); - CHECK_TRUE(!state.completeHardwareEmergencyStopRecovery( - *software_recovery, true, true, true)); - state.failRecovery(*software_recovery); - const auto explicit_software_recovery = state.beginRecovery( - state.snapshot().epoch); - CHECK_TRUE(explicit_software_recovery.has_value()); - CHECK_TRUE(state.completeRecovery( - *explicit_software_recovery, true, true, true)); - CHECK_TRUE(!state.snapshot().software_emergency_stop_latched); - - // A new safety event invalidates an in-flight recovery token. - state.observe(SafetyCondition::ProtectiveStop); - state.observe(SafetyCondition::Reduced); - const auto stale_recovery = state.beginRecovery( - state.snapshot().epoch); - CHECK_TRUE(stale_recovery.has_value()); - CHECK_TRUE(!state.completeHardwareEmergencyStopRecovery( - *stale_recovery, true, true, true)); - state.failRecovery(*stale_recovery); - const auto explicit_recovery = state.beginRecovery( - state.snapshot().epoch); - CHECK_TRUE(explicit_recovery.has_value()); - state.observe(SafetyCondition::SafeguardStop); - state.observe(SafetyCondition::Normal); - CHECK_TRUE(!state.completeRecovery( - *explicit_recovery, true, true, true)); - CHECK_TRUE(state.snapshot().latched); - - // An old API call must not begin recovery for a newer safety event. - const auto stale_epoch = state.snapshot().epoch; - state.observe(SafetyCondition::RobotEmergencyStop); - state.observe(SafetyCondition::Normal); - CHECK_TRUE(!state.beginRecovery(stale_epoch).has_value()); - CHECK_TRUE(!state.snapshot().recovery_in_progress); - - return 0; -} diff --git a/cmvr-es/devices/arm/huayan_arm/CMakeLists.txt b/cmvr-es/devices/arm/huayan_arm/CMakeLists.txt index 6001a5d7..ca88f4fc 100644 --- a/cmvr-es/devices/arm/huayan_arm/CMakeLists.txt +++ b/cmvr-es/devices/arm/huayan_arm/CMakeLists.txt @@ -29,49 +29,3 @@ add_library(cmvr_es::device::huayan_arm ALIAS huayan_arm) install(TARGETS huayan_arm LIBRARY DESTINATION lib) install(FILES ${HUAYAN_ARM_SDK_DIR}/lib/libHR_Pro.so DESTINATION lib) - -if(BUILD_TESTING) - add_executable(huayan_lifecycle_state_test - tests/huayan_lifecycle_state_test.cpp - ) - target_include_directories(huayan_lifecycle_state_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(huayan_lifecycle_state_test - PRIVATE - Threads::Threads - ) - add_test( - NAME huayan_lifecycle_state_test - COMMAND huayan_lifecycle_state_test - ) - set_tests_properties(huayan_lifecycle_state_test PROPERTIES TIMEOUT 10) - - if(UNIX AND NOT APPLE) - add_executable(huayan_arm_sdk_test - tests/huayan_arm_sdk_test.cpp - ) - target_include_directories(huayan_arm_sdk_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ${HUAYAN_ARM_SDK_DIR}/include - ) - target_link_libraries(huayan_arm_sdk_test - PRIVATE - cmvr_es::device::huayan_arm - Threads::Threads - ) - # Export the fake HRIF_* definitions so libhuayan_arm resolves its SDK - # calls to the deterministic test controller instead of real hardware. - target_link_options(huayan_arm_sdk_test PRIVATE -Wl,--export-dynamic) - add_test( - NAME huayan_arm_sdk_test - COMMAND huayan_arm_sdk_test - ) - set_tests_properties(huayan_arm_sdk_test PROPERTIES - TIMEOUT 20 - ENVIRONMENT "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - endif() -endif() diff --git a/cmvr-es/devices/arm/huayan_arm/tests/huayan_arm_sdk_test.cpp b/cmvr-es/devices/arm/huayan_arm/tests/huayan_arm_sdk_test.cpp deleted file mode 100644 index 00cb8e27..00000000 --- a/cmvr-es/devices/arm/huayan_arm/tests/huayan_arm_sdk_test.cpp +++ /dev/null @@ -1,874 +0,0 @@ -#include "devices/arm/huayan_arm/huayan_arm.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "HR_Pro.h" - -namespace { - -using Clock = std::chrono::steady_clock; -using namespace std::chrono_literals; - -constexpr double kPi = 3.14159265358979323846; - -double radToDeg(const double value) -{ - return value * 180.0 / kPi; -} - -struct FakeSdkState final { - std::mutex mutex; - bool connected{false}; - bool enabled{true}; - bool electrified{true}; - bool robot_error{false}; - bool paused{false}; - bool emergency_input{false}; - bool emergency_signal_fault{false}; - bool safeguard_input{false}; - bool safeguard_signal_fault{false}; - bool software_safeguard{false}; - - bool motion_active{false}; - bool motion_is_joint{true}; - bool stop_pending{false}; - bool hold_next_motion{false}; - bool stale_done_once{false}; - Clock::time_point completion_at{}; - Clock::time_point stop_complete_at{}; - std::array joint_position_deg{}; - std::array joint_target_deg{}; - std::array tcp_position_hr{}; - std::array tcp_target_hr{}; - std::string waypoint_id; - - bool servo_started{false}; - bool program_running{false}; - std::string selected_program; - - int move_j_calls{0}; - int move_l_calls{0}; - int speed_j_calls{0}; - int speed_l_calls{0}; - int group_stop_calls{0}; - int group_reset_calls{0}; - int start_servo_calls{0}; - int stop_script_calls{0}; - int idle_velocity_reads_after_stop{0}; - bool count_idle_reads{false}; - - void refreshLocked() - { - const auto now = Clock::now(); - const bool safety_active = emergency_input || safeguard_input || - software_safeguard; - - if (stop_pending && now >= stop_complete_at) { - stop_pending = false; - motion_active = false; - stale_done_once = false; - count_idle_reads = true; - } - - if (motion_active && !stop_pending && !safety_active && - completion_at != Clock::time_point{} && now >= completion_at) { - motion_active = false; - stale_done_once = false; - if (motion_is_joint) { - joint_position_deg = joint_target_deg; - } else { - tcp_position_hr = tcp_target_hr; - } - } - } - - bool movingLocked() - { - refreshLocked(); - return motion_active && !emergency_input && !safeguard_input && - !software_safeguard; - } - - bool doneLocked() - { - refreshLocked(); - return !motion_active; - } - - void startMotionLocked(const bool joint) - { - motion_active = true; - motion_is_joint = joint; - stop_pending = false; - count_idle_reads = false; - stale_done_once = true; - if (hold_next_motion) { - // The fallback deadline keeps a failed test from leaving a worker - // blocked for the production 60 second timeout. - completion_at = Clock::now() + 3s; - hold_next_motion = false; - } else { - completion_at = Clock::now() + 120ms; - } - } -}; - -FakeSdkState g_sdk; - -void resetFakeSdk() -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.connected = false; - g_sdk.enabled = true; - g_sdk.electrified = true; - g_sdk.robot_error = false; - g_sdk.paused = false; - g_sdk.emergency_input = false; - g_sdk.emergency_signal_fault = false; - g_sdk.safeguard_input = false; - g_sdk.safeguard_signal_fault = false; - g_sdk.software_safeguard = false; - g_sdk.motion_active = false; - g_sdk.motion_is_joint = true; - g_sdk.stop_pending = false; - g_sdk.hold_next_motion = false; - g_sdk.stale_done_once = false; - g_sdk.completion_at = {}; - g_sdk.stop_complete_at = {}; - g_sdk.joint_position_deg = {}; - g_sdk.joint_target_deg = {}; - g_sdk.tcp_position_hr = {}; - g_sdk.tcp_target_hr = {}; - g_sdk.waypoint_id.clear(); - g_sdk.servo_started = false; - g_sdk.program_running = false; - g_sdk.selected_program.clear(); - g_sdk.move_j_calls = 0; - g_sdk.move_l_calls = 0; - g_sdk.speed_j_calls = 0; - g_sdk.speed_l_calls = 0; - g_sdk.group_stop_calls = 0; - g_sdk.group_reset_calls = 0; - g_sdk.start_servo_calls = 0; - g_sdk.stop_script_calls = 0; - g_sdk.idle_velocity_reads_after_stop = 0; - g_sdk.count_idle_reads = false; -} - -void holdNextMotion() -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.hold_next_motion = true; -} - -void setHardwareEmergencyStop(const bool active) -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.emergency_input = active; - // If the wrapper never sends a real group Stop, releasing the switch makes - // the pending fake waypoint move again. This models the field failure. -} - -void setEmergencySignalFault(const bool active) -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.emergency_signal_fault = active; -} - -void dropFakeTransport() -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.connected = false; -} - -template -bool waitUntil(Predicate&& predicate, - const std::chrono::milliseconds timeout = 2s) -{ - const auto deadline = Clock::now() + timeout; - while (Clock::now() < deadline) { - if (predicate()) { - return true; - } - std::this_thread::sleep_for(10ms); - } - return predicate(); -} - -cmvr::config::RobotArmConfig makeConfig() -{ - cmvr::config::RobotArmConfig cfg; - cfg.set_id("huayan_fake_sdk"); - auto* vendor = cfg.mutable_vendor(); - vendor->set_brand(cmvr::config::VENDOR_ROBOT_ARM_BRAND_HUAYAN_ARM); - vendor->set_ip("127.0.0.1"); - vendor->set_port(10003); - vendor->set_model("HuayanFake"); - vendor->set_dof(6); - vendor->set_base_frame("Base"); - vendor->set_tool_frame("TCP"); - for (int i = 1; i <= 6; ++i) { - vendor->add_joint_names("joint_" + std::to_string(i)); - } - return cfg; -} - -int failures = 0; - -#define CHECK_TRUE(condition) \ - do { \ - if (!(condition)) { \ - std::cerr << "CHECK_TRUE failed at line " << __LINE__ << ": " \ - << #condition << std::endl; \ - ++failures; \ - } \ - } while (false) - -} // namespace - -// The test executable exports these strong symbols. On ELF platforms they -// interpose the real SDK definitions used by libhuayan_arm, giving the test a -// deterministic controller without opening a network connection. -extern "C" { - -int HRIF_Connect(unsigned int, const char*, unsigned short) -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.connected = true; - return 0; -} - -int HRIF_DisConnect(unsigned int) -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.connected = false; - g_sdk.motion_active = false; - return 0; -} - -bool HRIF_IsConnected(unsigned int) -{ - std::lock_guard lock(g_sdk.mutex); - return g_sdk.connected; -} - -int HRIF_GetErrorCodeStr(unsigned int, int error_code, std::string& message) -{ - message = "fake SDK error " + std::to_string(error_code); - return 0; -} - -int HRIF_GrpEnable(unsigned int, unsigned int) -{ - std::lock_guard lock(g_sdk.mutex); - if (g_sdk.emergency_input || g_sdk.safeguard_input || - g_sdk.software_safeguard) { - return 101; - } - g_sdk.enabled = true; - g_sdk.electrified = true; - return 0; -} - -int HRIF_GrpDisable(unsigned int, unsigned int) -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.enabled = false; - g_sdk.electrified = false; - return 0; -} - -int HRIF_GrpReset(unsigned int, unsigned int) -{ - std::lock_guard lock(g_sdk.mutex); - ++g_sdk.group_reset_calls; - if (g_sdk.emergency_input || g_sdk.safeguard_input || - g_sdk.software_safeguard) { - return 102; - } - g_sdk.robot_error = false; - return 0; -} - -int HRIF_GrpStop(unsigned int, unsigned int) -{ - std::lock_guard lock(g_sdk.mutex); - ++g_sdk.group_stop_calls; - g_sdk.idle_velocity_reads_after_stop = 0; - g_sdk.count_idle_reads = false; - if (g_sdk.motion_active) { - g_sdk.stop_pending = true; - g_sdk.stop_complete_at = Clock::now() + 120ms; - g_sdk.completion_at = {}; - } else { - g_sdk.stop_pending = false; - g_sdk.count_idle_reads = true; - } - g_sdk.servo_started = false; - return 0; -} - -int HRIF_SetOverride(unsigned int, unsigned int, double) -{ - return 0; -} - -int HRIF_ReadRobotState(unsigned int, unsigned int, - int& moving, int& enabled, int& error, - int& error_code, int& error_axis, int& brake, - int& paused, int& emergency_stop, int& safeguard, - int& electrified, int& connected_to_box, - int& blending_done, int& in_position) -{ - std::lock_guard lock(g_sdk.mutex); - if (!g_sdk.connected) { - return 201; - } - moving = g_sdk.movingLocked() ? 1 : 0; - enabled = g_sdk.enabled ? 1 : 0; - error = g_sdk.robot_error ? 1 : 0; - error_code = g_sdk.robot_error ? 9001 : 0; - error_axis = 0; - brake = g_sdk.enabled ? 1 : 0; - paused = g_sdk.paused ? 1 : 0; - emergency_stop = g_sdk.emergency_input ? 1 : 0; - safeguard = (g_sdk.safeguard_input || g_sdk.software_safeguard) ? 1 : 0; - electrified = g_sdk.electrified ? 1 : 0; - connected_to_box = 1; - blending_done = moving == 0 ? 1 : 0; - in_position = g_sdk.doneLocked() ? 1 : 0; - return 0; -} - -int HRIF_ReadEmergencyInfo(unsigned int, unsigned int, - int& emergency_signal_fault, - int& emergency_input, - int& safeguard_signal_fault, - int& safeguard_input) -{ - std::lock_guard lock(g_sdk.mutex); - if (!g_sdk.connected) { - return 202; - } - emergency_signal_fault = g_sdk.emergency_signal_fault ? 1 : 0; - emergency_input = g_sdk.emergency_input ? 1 : 0; - safeguard_signal_fault = g_sdk.safeguard_signal_fault ? 1 : 0; - safeguard_input = - (g_sdk.safeguard_input || g_sdk.software_safeguard) ? 1 : 0; - return 0; -} - -int HRIF_ReadCurWaypointID(unsigned int, unsigned int, std::string& waypoint) -{ - std::lock_guard lock(g_sdk.mutex); - waypoint = g_sdk.waypoint_id; - return 0; -} - -int HRIF_IsMotionDone(unsigned int, unsigned int, bool& done) -{ - std::lock_guard lock(g_sdk.mutex); - if (g_sdk.stale_done_once) { - g_sdk.stale_done_once = false; - done = true; - } else { - done = g_sdk.doneLocked(); - } - return 0; -} - -int HRIF_ReadActJointPos(unsigned int, unsigned int, - double& j1, double& j2, double& j3, - double& j4, double& j5, double& j6) -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.refreshLocked(); - j1 = g_sdk.joint_position_deg[0]; - j2 = g_sdk.joint_position_deg[1]; - j3 = g_sdk.joint_position_deg[2]; - j4 = g_sdk.joint_position_deg[3]; - j5 = g_sdk.joint_position_deg[4]; - j6 = g_sdk.joint_position_deg[5]; - return 0; -} - -int HRIF_ReadActJointVel(unsigned int, unsigned int, - double& j1, double& j2, double& j3, - double& j4, double& j5, double& j6) -{ - std::lock_guard lock(g_sdk.mutex); - const double velocity = g_sdk.movingLocked() ? 5.0 : 0.0; - j1 = j2 = j3 = j4 = j5 = j6 = velocity; - if (velocity == 0.0 && g_sdk.count_idle_reads) { - ++g_sdk.idle_velocity_reads_after_stop; - } - return 0; -} - -int HRIF_ReadActTcpPos(unsigned int, unsigned int, - double& x, double& y, double& z, - double& rx, double& ry, double& rz) -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.refreshLocked(); - x = g_sdk.tcp_position_hr[0]; - y = g_sdk.tcp_position_hr[1]; - z = g_sdk.tcp_position_hr[2]; - rx = g_sdk.tcp_position_hr[3]; - ry = g_sdk.tcp_position_hr[4]; - rz = g_sdk.tcp_position_hr[5]; - return 0; -} - -int HRIF_ReadActTcpVel(unsigned int, unsigned int, - double& x, double& y, double& z, - double& rx, double& ry, double& rz) -{ - std::lock_guard lock(g_sdk.mutex); - const double velocity = g_sdk.movingLocked() ? 5.0 : 0.0; - x = y = z = rx = ry = rz = velocity; - return 0; -} - -int HRIF_MoveJ(unsigned int, unsigned int, - double, double, double, double, double, double, - double j1, double j2, double j3, - double j4, double j5, double j6, - std::string, std::string, double, double, double, - int, int, int, int, std::string command_id) -{ - std::lock_guard lock(g_sdk.mutex); - ++g_sdk.move_j_calls; - g_sdk.joint_target_deg = {j1, j2, j3, j4, j5, j6}; - g_sdk.waypoint_id = std::move(command_id); - g_sdk.startMotionLocked(true); - return 0; -} - -int HRIF_MoveL(unsigned int, unsigned int, - double x, double y, double z, - double rx, double ry, double rz, - double, double, double, double, double, double, - std::string, std::string, double, double, double, - int, int, int, std::string command_id) -{ - std::lock_guard lock(g_sdk.mutex); - ++g_sdk.move_l_calls; - g_sdk.tcp_target_hr = {x, y, z, rx, ry, rz}; - g_sdk.waypoint_id = std::move(command_id); - g_sdk.startMotionLocked(false); - return 0; -} - -int HRIF_SpeedJ(unsigned int, unsigned int, - double, double, double, double, double, double, - double, double) -{ - std::lock_guard lock(g_sdk.mutex); - ++g_sdk.speed_j_calls; - g_sdk.startMotionLocked(true); - return 0; -} - -int HRIF_SpeedL(unsigned int, unsigned int, - double, double, double, double, double, double, - double, double, double) -{ - std::lock_guard lock(g_sdk.mutex); - ++g_sdk.speed_l_calls; - g_sdk.startMotionLocked(false); - return 0; -} - -int HRIF_StartServo(unsigned int, unsigned int, double, double) -{ - std::lock_guard lock(g_sdk.mutex); - ++g_sdk.start_servo_calls; - g_sdk.servo_started = true; - return 0; -} - -int HRIF_PushServoJ(unsigned int, unsigned int, - double j1, double j2, double j3, - double j4, double j5, double j6) -{ - std::lock_guard lock(g_sdk.mutex); - if (!g_sdk.servo_started) { - return 301; - } - g_sdk.joint_position_deg = {j1, j2, j3, j4, j5, j6}; - return 0; -} - -int HRIF_PushServoP(unsigned int, unsigned int, - std::vector& coord, - std::vector&, - std::vector&) -{ - std::lock_guard lock(g_sdk.mutex); - if (!g_sdk.servo_started || coord.size() < 6) { - return 302; - } - std::copy_n(coord.begin(), 6, g_sdk.tcp_position_hr.begin()); - return 0; -} - -int HRIF_SwitchScript(unsigned int, unsigned int, std::string script_name) -{ - std::lock_guard lock(g_sdk.mutex); - if (script_name.empty()) { - return 401; - } - g_sdk.selected_program = std::move(script_name); - return 0; -} - -int HRIF_StartScript(unsigned int) -{ - std::lock_guard lock(g_sdk.mutex); - if (g_sdk.selected_program.empty()) { - return 402; - } - g_sdk.program_running = true; - g_sdk.paused = false; - return 0; -} - -int HRIF_PauseScript(unsigned int) -{ - std::lock_guard lock(g_sdk.mutex); - if (!g_sdk.program_running) { - return 403; - } - g_sdk.paused = true; - return 0; -} - -int HRIF_StopScript(unsigned int) -{ - std::lock_guard lock(g_sdk.mutex); - ++g_sdk.stop_script_calls; - g_sdk.program_running = false; - g_sdk.paused = false; - return 0; -} - -int HRIF_EnterSafetyGuard(unsigned int, unsigned int, int flag) -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.software_safeguard = flag != 0; - return 0; -} - -int HRIF_ShutdownRobot(unsigned int) -{ - std::lock_guard lock(g_sdk.mutex); - g_sdk.connected = false; - g_sdk.enabled = false; - g_sdk.electrified = false; - return 0; -} - -} // extern "C" - -int main() -{ - using namespace cmvr::device; - - resetFakeSdk(); - HuayanRobot arm(makeConfig()); - CHECK_TRUE(arm.connect("127.0.0.1", 10003).ok()); - - MotionOptions options; - options.velocity = 0.4; - options.acceleration = 0.8; - CHECK_TRUE(arm.supportsActionQueueMotion()); - - JointPositionCommand joint_a{{0.10, -0.05, 0.08, 0.0, 0.02, -0.03}}; - MotionOptions cancelled_options = options; - cancelled_options.cancellation_requested = []() { return true; }; - CHECK_TRUE(!arm.moveJ(joint_a, cancelled_options).ok()); - CartesianPose cancelled_pose; - cancelled_pose.x = 0.20; - cancelled_pose.z = 0.30; - CHECK_TRUE(!arm.moveL(cancelled_pose, cancelled_options).ok()); - { - std::lock_guard lock(g_sdk.mutex); - CHECK_TRUE(g_sdk.move_j_calls == 0); - CHECK_TRUE(g_sdk.move_l_calls == 0); - } - - // Once a command has been accepted, caller cancellation returns promptly - // but retains the typed motion barrier until Stop confirms controller idle. - std::atomic cancel_during_wait{false}; - MotionOptions cancellable_options = options; - cancellable_options.cancellation_requested = [&cancel_during_wait]() { - return cancel_during_wait.load(); - }; - JointPositionCommand cancelled_in_wait{ - {0.05, -0.02, 0.04, 0.01, 0.0, -0.01}}; - holdNextMotion(); - auto cancelled_motion = std::async(std::launch::async, [&]() { - return arm.moveJ(cancelled_in_wait, cancellable_options); - }); - CHECK_TRUE(waitUntil([&]() { - std::lock_guard lock(g_sdk.mutex); - return g_sdk.move_j_calls > 0; - })); - cancel_during_wait.store(true); - CHECK_TRUE(cancelled_motion.wait_for(1s) == std::future_status::ready); - if (cancelled_motion.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(!cancelled_motion.get().ok()); - } - CHECK_TRUE(arm.busy()); - CHECK_TRUE(arm.stopMotion().ok()); - CHECK_TRUE(!arm.busy()); - - // The first IsMotionDone read intentionally reports the preceding idle - // state. Completion must be correlated with the command/target. Once the - // target is reached, an identical command is an idempotent no-op. - CHECK_TRUE(arm.moveJ(joint_a, options).ok()); - int move_j_after_first = 0; - { - std::lock_guard lock(g_sdk.mutex); - move_j_after_first = g_sdk.move_j_calls; - } - CHECK_TRUE(arm.moveJ(joint_a, options).ok()); - { - std::lock_guard lock(g_sdk.mutex); - CHECK_TRUE(g_sdk.move_j_calls == move_j_after_first); - } - - CartesianPose pose_a; - pose_a.x = 0.31; - pose_a.y = -0.12; - pose_a.z = 0.42; - pose_a.rx = 0.08; - pose_a.ry = -0.04; - pose_a.rz = 0.12; - CHECK_TRUE(arm.moveL(pose_a, options).ok()); - int move_l_after_first = 0; - { - std::lock_guard lock(g_sdk.mutex); - move_l_after_first = g_sdk.move_l_calls; - } - CHECK_TRUE(arm.moveL(pose_a, options).ok()); - { - std::lock_guard lock(g_sdk.mutex); - CHECK_TRUE(g_sdk.move_l_calls == move_l_after_first); - } - - // Stop must cancel the old owner and wait until the controller reports - // stable idle; clearing the owner immediately after GrpStop would fail the - // elapsed-time and consecutive-idle checks below. - JointPositionCommand joint_b{{0.22, -0.08, 0.14, 0.03, 0.04, -0.01}}; - holdNextMotion(); - const int before_held_move = move_j_after_first; - auto held_move = std::async(std::launch::async, [&]() { - return arm.moveJ(joint_b, options); - }); - CHECK_TRUE(waitUntil([&]() { - std::lock_guard lock(g_sdk.mutex); - return g_sdk.move_j_calls > before_held_move; - })); - const auto stop_started = Clock::now(); - CHECK_TRUE(arm.stopMotion().ok()); - const auto stop_elapsed = Clock::now() - stop_started; - CHECK_TRUE(stop_elapsed >= 100ms); - CHECK_TRUE(held_move.wait_for(1s) == std::future_status::ready); - if (held_move.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(!held_move.get().ok()); - } - CHECK_TRUE(!arm.busy()); - { - std::lock_guard lock(g_sdk.mutex); - CHECK_TRUE(g_sdk.idle_velocity_reads_after_stop >= 3); - } - CHECK_TRUE(arm.moveJ(joint_b, options).ok()); - - // A hardware E-stop cancels and terminates the active waypoint. Releasing - // the switch does not clear the software latch or grant a new permit. - JointPositionCommand joint_c{{0.34, -0.02, 0.09, 0.05, -0.02, 0.07}}; - holdNextMotion(); - int before_estop_move = 0; - int before_estop_stop = 0; - { - std::lock_guard lock(g_sdk.mutex); - before_estop_move = g_sdk.move_j_calls; - before_estop_stop = g_sdk.group_stop_calls; - } - auto estop_move = std::async(std::launch::async, [&]() { - return arm.moveJ(joint_c, options); - }); - CHECK_TRUE(waitUntil([&]() { - std::lock_guard lock(g_sdk.mutex); - return g_sdk.move_j_calls > before_estop_move; - })); - setHardwareEmergencyStop(true); - CHECK_TRUE(waitUntil([&]() { - std::lock_guard lock(g_sdk.mutex); - return g_sdk.group_stop_calls > before_estop_stop; - })); - CHECK_TRUE(estop_move.wait_for(2s) == std::future_status::ready); - if (estop_move.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(!estop_move.get().ok()); - } - setHardwareEmergencyStop(false); - std::this_thread::sleep_for(150ms); - - int move_count_while_latched = 0; - { - std::lock_guard lock(g_sdk.mutex); - move_count_while_latched = g_sdk.move_j_calls; - } - const auto rejected_while_latched = arm.moveJ(joint_a, options); - CHECK_TRUE(!rejected_while_latched.ok()); - { - std::lock_guard lock(g_sdk.mutex); - CHECK_TRUE(g_sdk.move_j_calls == move_count_while_latched); - } - CHECK_TRUE(arm.clearFault().ok()); - CHECK_TRUE(arm.torqueOn().ok()); - CHECK_TRUE(arm.moveJ(joint_a, options).ok()); - - // Speed commands own the controller while waiting. A different motion is - // rejected, and Stop releases ownership only after termination. - holdNextMotion(); - JointVelocityCommand speed{{0.1, 0.0, 0.0, 0.0, 0.0, 0.0}}; - int speed_calls_before = 0; - { - std::lock_guard lock(g_sdk.mutex); - speed_calls_before = g_sdk.speed_j_calls; - } - auto speed_motion = std::async(std::launch::async, [&]() { - return arm.speedJ(speed, 0.5, 2.0); - }); - CHECK_TRUE(waitUntil([&]() { - std::lock_guard lock(g_sdk.mutex); - return g_sdk.speed_j_calls > speed_calls_before; - })); - CHECK_TRUE(!arm.moveL(pose_a, options).ok()); - CHECK_TRUE(arm.stopMotion().ok()); - CHECK_TRUE(speed_motion.wait_for(1s) == std::future_status::ready); - if (speed_motion.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(!speed_motion.get().ok()); - } - CHECK_TRUE(!arm.busy()); - - // SpeedL used to hold the SDK mutex while waiting, which deadlocked its - // own timeout/Stop path. A concurrent Stop must cancel it, settle the - // controller, and allow a genuinely new Move command afterwards. - holdNextMotion(); - CartesianVelocity line_speed; - line_speed.vx = 0.05; - int speed_l_calls_before = 0; - { - std::lock_guard lock(g_sdk.mutex); - speed_l_calls_before = g_sdk.speed_l_calls; - } - auto line_speed_motion = std::async(std::launch::async, [&]() { - return arm.speedL(line_speed, 0.5, 2.0, FrameType::Base); - }); - CHECK_TRUE(waitUntil([&]() { - std::lock_guard lock(g_sdk.mutex); - return g_sdk.speed_l_calls > speed_l_calls_before; - })); - CHECK_TRUE(arm.stopMotion().ok()); - CHECK_TRUE(line_speed_motion.wait_for(1s) == std::future_status::ready); - if (line_speed_motion.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(!line_speed_motion.get().ok()); - } - CHECK_TRUE(!arm.busy()); - CHECK_TRUE(arm.moveJ(joint_b, options).ok()); - - // A dual-channel emergency input mismatch is a typed emergency latch. It - // remains blocked after the wiring level is healthy and is recovered only - // through the emergency recovery path. - int stops_before_signal_fault = 0; - { - std::lock_guard lock(g_sdk.mutex); - stops_before_signal_fault = g_sdk.group_stop_calls; - } - setEmergencySignalFault(true); - CHECK_TRUE(waitUntil([&]() { - std::lock_guard lock(g_sdk.mutex); - return g_sdk.group_stop_calls > stops_before_signal_fault; - })); - setEmergencySignalFault(false); - std::this_thread::sleep_for(100ms); - CHECK_TRUE(!arm.moveJ(joint_c, options).ok()); - CHECK_TRUE(arm.torqueOn().ok()); - CHECK_TRUE(arm.moveJ(joint_c, options).ok()); - - // Power-off holds a terminal barrier through GrpDisable. Motion remains - // denied until an explicit enable confirms the powered state again. - CHECK_TRUE(arm.torqueOff().ok()); - CHECK_TRUE(!arm.moveJ(joint_a, options).ok()); - CHECK_TRUE(arm.torqueOn().ok()); - CHECK_TRUE(arm.moveJ(joint_a, options).ok()); - - // Servo and program modes retain ownership beyond the start call. Stop of - // a retained program must use StopScript as well as the group stop path. - ServoOptions servo_options; - CHECK_TRUE(arm.startServoMode(servo_options).ok()); - CHECK_TRUE(!arm.moveJ(joint_b, options).ok()); - CHECK_TRUE(arm.servoJ(joint_b).ok()); - CHECK_TRUE(arm.stopServoMode().ok()); - CHECK_TRUE(!arm.busy()); - - CHECK_TRUE(arm.loadProgram("fake_program.script").ok()); - CHECK_TRUE(arm.playProgram().ok()); - CHECK_TRUE(!arm.moveJ(joint_c, options).ok()); - int stop_script_calls_before = 0; - { - std::lock_guard lock(g_sdk.mutex); - stop_script_calls_before = g_sdk.stop_script_calls; - } - CHECK_TRUE(arm.stopMotion().ok()); - { - std::lock_guard lock(g_sdk.mutex); - CHECK_TRUE(g_sdk.stop_script_calls > stop_script_calls_before); - } - CHECK_TRUE(!arm.busy()); - - // Retire an in-flight stale generation after transport loss before - // reconnecting; no old waiter may issue SDK reads into the new session. - holdNextMotion(); - int moves_before_transport_loss = 0; - { - std::lock_guard lock(g_sdk.mutex); - moves_before_transport_loss = g_sdk.move_j_calls; - } - auto transport_lost_move = std::async(std::launch::async, [&]() { - return arm.moveJ(joint_c, options); - }); - CHECK_TRUE(waitUntil([&]() { - std::lock_guard lock(g_sdk.mutex); - return g_sdk.move_j_calls > moves_before_transport_loss; - })); - dropFakeTransport(); - CHECK_TRUE(arm.connect("127.0.0.1", 10003).ok()); - CHECK_TRUE(transport_lost_move.wait_for(1s) == std::future_status::ready); - if (transport_lost_move.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(!transport_lost_move.get().ok()); - } - CHECK_TRUE(arm.moveJ(joint_b, options).ok()); - CHECK_TRUE(arm.disconnect().ok()); - - resetFakeSdk(); - HuayanRobot shutdown_arm(makeConfig()); - CHECK_TRUE(shutdown_arm.connect("127.0.0.1", 10003).ok()); - CHECK_TRUE(shutdown_arm.shutdown().ok()); - CHECK_TRUE(!shutdown_arm.isConnected()); - return failures == 0 ? 0 : 1; -} diff --git a/cmvr-es/devices/arm/huayan_arm/tests/huayan_lifecycle_state_test.cpp b/cmvr-es/devices/arm/huayan_arm/tests/huayan_lifecycle_state_test.cpp deleted file mode 100644 index 8bb93ff7..00000000 --- a/cmvr-es/devices/arm/huayan_arm/tests/huayan_lifecycle_state_test.cpp +++ /dev/null @@ -1,232 +0,0 @@ -#include "devices/arm/huayan_arm/huayan_lifecycle_state.h" - -#include -#include - -namespace { - -#define CHECK_TRUE(condition) \ - do { \ - if (!(condition)) { \ - std::cerr << "CHECK_TRUE failed at line " << __LINE__ << ": " \ - << #condition << std::endl; \ - return 1; \ - } \ - } while (false) - -} // namespace - -int main() -{ - using namespace cmvr::device::huayan_internal; - - MotionState motion; - CHECK_TRUE(motion.begin(MotionKind::None).status == - MotionStartStatus::Invalid); - - // A completed target does not poison an identical subsequent command, - // while an actually concurrent command is rejected. - const auto first_joint = motion.begin(MotionKind::Joint); - CHECK_TRUE(first_joint.started()); - CHECK_TRUE(motion.begin(MotionKind::Joint).status == - MotionStartStatus::Busy); - CHECK_TRUE(motion.begin(MotionKind::Linear).status == - MotionStartStatus::Busy); - motion.finish(first_joint.token); - const auto repeated_joint = motion.begin(MotionKind::Joint); - CHECK_TRUE(repeated_joint.started()); - CHECK_TRUE(repeated_joint.token.generation > - first_joint.token.generation); - motion.finish(first_joint.token); - CHECK_TRUE(motion.ownerActive(repeated_joint.token)); - motion.finish(repeated_joint.token); - CHECK_TRUE(!motion.busy()); - - // Stop cancels the current generation and cannot complete before its - // owner exits. - const auto linear = motion.begin(MotionKind::Linear); - CHECK_TRUE(linear.started()); - const auto stop_linear = motion.beginStop(); - CHECK_TRUE(stop_linear.started()); - CHECK_TRUE(stop_linear.kind == MotionKind::Linear); - CHECK_TRUE(stop_linear.active_token.generation == - linear.token.generation); - CHECK_TRUE(stop_linear.tracked_motion); - CHECK_TRUE(motion.cancelled(linear.token)); - CHECK_TRUE(motion.beginStop().status == - StopStartStatus::AlreadyStopping); - CHECK_TRUE(motion.begin(MotionKind::Joint).status == - MotionStartStatus::Stopping); - CHECK_TRUE(!motion.waitForOwnerExit( - linear.token, std::chrono::milliseconds(1))); - CHECK_TRUE(!motion.completeStop()); - motion.finish(linear.token); - CHECK_TRUE(motion.waitForOwnerExit( - linear.token, std::chrono::milliseconds(1))); - CHECK_TRUE(motion.completeStop()); - CHECK_TRUE(!motion.busy()); - - // An uncertain submission/completion remains fail-closed until a - // positively acknowledged Stop clears it. - const auto failed_speed = motion.begin(MotionKind::SpeedLinear); - CHECK_TRUE(failed_speed.started()); - motion.failMotion(failed_speed.token); - CHECK_TRUE(motion.snapshot().blocked); - CHECK_TRUE(motion.begin(MotionKind::Joint).status == - MotionStartStatus::Blocked); - const auto stop_failed_speed = motion.beginStop(); - CHECK_TRUE(stop_failed_speed.kind == MotionKind::SpeedLinear); - CHECK_TRUE(stop_failed_speed.tracked_motion); - CHECK_TRUE(motion.completeStop()); - - const auto failed_stop_motion = motion.begin(MotionKind::Joint); - CHECK_TRUE(failed_stop_motion.started()); - const auto failed_stop = motion.beginStop(); - CHECK_TRUE(failed_stop.kind == MotionKind::Joint); - motion.failStop(); - CHECK_TRUE(motion.snapshot().blocked); - CHECK_TRUE(motion.begin(MotionKind::Linear).status == - MotionStartStatus::Blocked); - motion.finish(failed_stop_motion.token); - const auto retry_failed_stop = motion.beginStop(); - CHECK_TRUE(retry_failed_stop.kind == MotionKind::Joint); - CHECK_TRUE(motion.completeStop()); - - // Servo and program modes remain owned after their start RPC returns. - const auto servo = motion.begin(MotionKind::Servo); - CHECK_TRUE(servo.started()); - motion.finish(servo.token, MotionFinishMode::Retain); - CHECK_TRUE(motion.snapshot().retained_kind == MotionKind::Servo); - CHECK_TRUE(motion.begin(MotionKind::Program).status == - MotionStartStatus::Busy); - const auto servo_update = motion.begin(MotionKind::Servo, true); - CHECK_TRUE(servo_update.started()); - motion.finish(servo_update.token); - CHECK_TRUE(motion.snapshot().retained_kind == MotionKind::Servo); - const auto stop_servo = motion.beginStop(); - CHECK_TRUE(stop_servo.kind == MotionKind::Servo); - CHECK_TRUE(stop_servo.tracked_motion); - CHECK_TRUE(motion.completeStop()); - - const auto program = motion.begin(MotionKind::Program); - CHECK_TRUE(program.started()); - motion.finish(program.token, MotionFinishMode::Retain); - const auto cancelled_program = motion.cancelActiveForSafety(); - CHECK_TRUE(cancelled_program.kind == MotionKind::Program); - CHECK_TRUE(cancelled_program.tracked_motion); - CHECK_TRUE(!cancelled_program.active_token.valid()); - CHECK_TRUE(motion.begin(MotionKind::Joint).status == - MotionStartStatus::Blocked); - const auto stop_program = motion.beginStop(); - CHECK_TRUE(stop_program.kind == MotionKind::Program); - CHECK_TRUE(motion.completeStop()); - - const auto safety_move = motion.begin(MotionKind::SpeedJoint); - CHECK_TRUE(safety_move.started()); - const auto cancelled_move = motion.cancelActiveForSafety(); - CHECK_TRUE(cancelled_move.kind == MotionKind::SpeedJoint); - CHECK_TRUE(cancelled_move.active_token.generation == - safety_move.token.generation); - CHECK_TRUE(motion.cancelled(safety_move.token)); - motion.finish(safety_move.token); - const auto stop_safety_move = motion.beginStop(); - CHECK_TRUE(stop_safety_move.kind == MotionKind::SpeedJoint); - CHECK_TRUE(motion.completeStop()); - - RawSafetyState raw; - CHECK_TRUE(classifySafetyCondition(raw) == SafetyCondition::Unknown); - raw.valid = true; - CHECK_TRUE(classifySafetyCondition(raw) == SafetyCondition::Normal); - raw.software_protective_stop = true; - CHECK_TRUE(classifySafetyCondition(raw) == - SafetyCondition::SoftwareProtectiveStop); - raw.software_emergency_stop = true; - CHECK_TRUE(classifySafetyCondition(raw) == - SafetyCondition::SoftwareEmergencyStop); - raw.robot_fault = 1; - CHECK_TRUE(classifySafetyCondition(raw) == - SafetyCondition::RobotFault); - raw.safeguard_stop = 1; - CHECK_TRUE(classifySafetyCondition(raw) == - SafetyCondition::SafeguardStop); - raw.emergency_stop = 1; - CHECK_TRUE(classifySafetyCondition(raw) == - SafetyCondition::EmergencyStop); - raw.safeguard_signal_fault = 1; - CHECK_TRUE(classifySafetyCondition(raw) == - SafetyCondition::SafeguardSignalFault); - raw.emergency_signal_fault = 1; - CHECK_TRUE(classifySafetyCondition(raw) == - SafetyCondition::EmergencySignalFault); - - SafetyState safety; - CHECK_TRUE(!safety.tryPermit().has_value()); - safety.observe(SafetyCondition::Normal); - const auto initial_permit = safety.tryPermit(); - CHECK_TRUE(initial_permit.has_value()); - CHECK_TRUE(safety.validate(*initial_permit)); - - safety.observe(SafetyCondition::EmergencyStop); - CHECK_TRUE(safety.snapshot().latched); - CHECK_TRUE(!safety.validate(*initial_permit)); - CHECK_TRUE(!safety.beginRecovery(safety.snapshot().epoch).has_value()); - const auto first_emergency_epoch = safety.snapshot().epoch; - safety.observe(SafetyCondition::EmergencyStop); - safety.observe(SafetyCondition::EmergencyStop); - CHECK_TRUE(safety.snapshot().epoch == first_emergency_epoch); - - // Releasing the hardware switch only changes the observed level; it does - // not clear the event latch or issue a new motion permit. - safety.observe(SafetyCondition::Normal); - CHECK_TRUE(safety.snapshot().latched); - CHECK_TRUE(!safety.tryPermit().has_value()); - - const auto not_ready = safety.beginRecovery(safety.snapshot().epoch); - CHECK_TRUE(not_ready.has_value()); - CHECK_TRUE(!safety.completeRecovery(*not_ready, false, true, true)); - CHECK_TRUE(safety.snapshot().latched); - safety.failRecovery(*not_ready); - - const auto not_idle = safety.beginRecovery(safety.snapshot().epoch); - CHECK_TRUE(not_idle.has_value()); - CHECK_TRUE(!safety.completeRecovery(*not_idle, true, false, true)); - CHECK_TRUE(safety.snapshot().latched); - safety.failRecovery(*not_idle); - - const auto not_cancelled = - safety.beginRecovery(safety.snapshot().epoch); - CHECK_TRUE(not_cancelled.has_value()); - CHECK_TRUE(!safety.completeRecovery(*not_cancelled, true, true, false)); - CHECK_TRUE(safety.snapshot().latched); - safety.failRecovery(*not_cancelled); - - const auto recovery_retry = - safety.beginRecovery(safety.snapshot().epoch); - CHECK_TRUE(recovery_retry.has_value()); - CHECK_TRUE(safety.completeRecovery( - *recovery_retry, true, true, true)); - const auto recovered_permit = safety.tryPermit(); - CHECK_TRUE(recovered_permit.has_value()); - CHECK_TRUE(safety.validate(*recovered_permit)); - - // A second safety event, including the same physical E-stop being pressed - // again, invalidates an older recovery token atomically. - safety.observe(SafetyCondition::EmergencyStop); - safety.observe(SafetyCondition::Normal); - const auto stale_recovery = - safety.beginRecovery(safety.snapshot().epoch); - CHECK_TRUE(stale_recovery.has_value()); - safety.observe(SafetyCondition::EmergencyStop); - safety.observe(SafetyCondition::Normal); - CHECK_TRUE(!safety.completeRecovery( - *stale_recovery, true, true, true)); - CHECK_TRUE(safety.snapshot().latched); - CHECK_TRUE(!safety.snapshot().recovery_in_progress); - - const auto stale_epoch = safety.snapshot().epoch; - safety.observe(SafetyCondition::SafeguardStop); - safety.observe(SafetyCondition::Normal); - CHECK_TRUE(!safety.beginRecovery(stale_epoch).has_value()); - - return 0; -} diff --git a/cmvr-es/devices/arm/ume_robot_arm/CMakeLists.txt b/cmvr-es/devices/arm/ume_robot_arm/CMakeLists.txt index f92b6ecd..17c4ff22 100644 --- a/cmvr-es/devices/arm/ume_robot_arm/CMakeLists.txt +++ b/cmvr-es/devices/arm/ume_robot_arm/CMakeLists.txt @@ -21,72 +21,3 @@ target_link_libraries(ume_robot_arm add_library(cmvr_es::device::ume_robot_arm ALIAS ume_robot_arm) install(TARGETS ume_robot_arm LIBRARY DESTINATION lib) - -if(BUILD_TESTING) - add_executable(damiao_mit_codec_test - tests/damiao_mit_codec_test.cpp - ) - target_link_libraries(damiao_mit_codec_test - PRIVATE - cmvr_es::device::ume_robot_arm - gtest - gtest_main - pthread - ) - add_test( - NAME damiao_mit_codec_test - COMMAND damiao_mit_codec_test - ) - set(_ume_robot_arm_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _ume_robot_arm_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(damiao_mit_codec_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_ume_robot_arm_test_environment}" - ) - - add_executable(damiao_can_fd_chain_test - tests/damiao_can_fd_chain_test.cpp - ) - target_link_libraries(damiao_can_fd_chain_test - PRIVATE - cmvr_es::device::ume_robot_arm - gtest - gtest_main - pthread - ) - add_test( - NAME damiao_can_fd_chain_test - COMMAND damiao_can_fd_chain_test - ) - set_tests_properties(damiao_can_fd_chain_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_ume_robot_arm_test_environment}" - ) - - add_executable(ume_robot_arm_test - tests/ume_robot_arm_test.cpp - ) - target_link_libraries(ume_robot_arm_test - PRIVATE - cmvr_es::device::ume_robot_arm - gtest - gtest_main - pthread - ) - target_compile_definitions(ume_robot_arm_test PRIVATE - CMVR_UME_ARM_CONFIG_PATH="${PROJECT_SOURCE_DIR}/cmvr-es/config/devices/arm/ume_arms.pb.txt" - ) - add_test( - NAME ume_robot_arm_test - COMMAND ume_robot_arm_test - ) - set_tests_properties(ume_robot_arm_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_ume_robot_arm_test_environment}" - ) -endif() diff --git a/cmvr-es/devices/arm/ume_robot_arm/tests/damiao_can_fd_chain_test.cpp b/cmvr-es/devices/arm/ume_robot_arm/tests/damiao_can_fd_chain_test.cpp deleted file mode 100644 index 782ce46c..00000000 --- a/cmvr-es/devices/arm/ume_robot_arm/tests/damiao_can_fd_chain_test.cpp +++ /dev/null @@ -1,407 +0,0 @@ -#include "arm/ume_robot_arm/include/damiao_can_fd_chain.h" - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "canbus/abstract_canbus.h" - -namespace cmvr::device { -namespace { - -class FakeCanbus final : public AbstractCanbus { -public: - std::string typeName() const override { return "FakeCanbus"; } - bool init() override - { - initialized = true; - return init_result; - } - bool start() override - { - started = start_result; - is_started_ = started; - return started; - } - bool stop() override - { - stopped = true; - started = false; - is_started_ = false; - return true; - } - - msgs::ErrorCode send(const std::vector& frames, - int32_t* frame_num) override - { - if (!started || !frame_num || - *frame_num != static_cast(frames.size())) { - return msgs::ErrorCode::CAN_CLIENT_ERROR_SEND_FAILED; - } - if (!send_result) { - return msgs::ErrorCode::CAN_CLIENT_ERROR_SEND_FAILED; - } - sent_batches.push_back(frames); - if (!scheduled_replies.empty()) { - for (const auto& reply : scheduled_replies.front()) { - replies.push_back(reply); - } - scheduled_replies.pop_front(); - } - return msgs::ErrorCode::OK; - } - - msgs::ErrorCode receive(std::vector* frames, - int32_t* frame_num) override - { - if (!started || !frames || !frame_num || replies.empty()) { - return msgs::ErrorCode::CAN_CLIENT_ERROR_RECV_FAILED; - } - frames->clear(); - frames->push_back(replies.front()); - replies.pop_front(); - *frame_num = 1; - return msgs::ErrorCode::OK; - } - - bool discardPendingFrames() override - { - ++drain_calls; - if (drain_delay > std::chrono::microseconds::zero()) { - std::this_thread::sleep_for(drain_delay); - } - replies.clear(); - return drain_result; - } - - std::string getErrorString(int32_t) override { return {}; } - - void enqueueReplies(std::vector batch) - { - scheduled_replies.push_back(std::move(batch)); - } - - bool init_result{true}; - bool start_result{true}; - bool initialized{false}; - bool started{false}; - bool stopped{false}; - bool drain_result{true}; - bool send_result{true}; - std::size_t drain_calls{0}; - std::chrono::microseconds drain_delay{0}; - std::vector> sent_batches; - std::deque replies; - std::deque> scheduled_replies; -}; - -DamiaoJointSpec joint(std::string name, - std::uint32_t command_id, - std::uint32_t feedback_id, - std::uint8_t reported_id, - int direction = 1) -{ - DamiaoJointSpec spec; - spec.joint_name = std::move(name); - spec.command_id = command_id; - spec.feedback_id = feedback_id; - spec.reported_motor_id = reported_id; - spec.model = DamiaoMotorModel::DM4310; - spec.direction = direction; - spec.zero_offset_rad = direction == 1 ? 0.1 : -0.2; - spec.joint_lower_rad = -2.0; - spec.joint_upper_rad = 2.0; - spec.max_velocity_rad_s = 3.0; - spec.max_torque_nm = 2.0; - spec.healthy_status_mask = 1U << 0U; - spec.max_driver_temperature_raw = 80U; - spec.max_motor_temperature_raw = 90U; - return spec; -} - -CanFrame feedback(std::uint32_t id, - std::uint8_t reported_id, - std::uint8_t status = 0U) -{ - CanFrame frame; - frame.id = id; - frame.len = 8; - frame.is_fd = true; - frame.bitrate_switch = true; - frame.rx_monotonic_ns = 100; - frame.data[0] = - static_cast((status << 4U) | reported_id); - frame.data[1] = 0x80; - frame.data[2] = 0x00; - frame.data[3] = 0x80; - frame.data[4] = 0x08; - frame.data[5] = 0x00; - frame.data[6] = 30U; - frame.data[7] = 35U; - return frame; -} - -std::chrono::steady_clock::time_point soon() -{ - return std::chrono::steady_clock::now() + - std::chrono::milliseconds(20); -} - -std::size_t countLifecycleByte( - const std::vector>& batches, - const std::uint8_t value) -{ - std::size_t count = 0; - for (const auto& batch : batches) { - for (const auto& frame : batch) { - if (frame.len == 8 && - frame.data[0] == 0xFF && - frame.data[7] == value) { - ++count; - } - } - } - return count; -} - -TEST(DamiaoCanFdChainTest, PassiveOpenNeverEnablesHardware) -{ - auto bus = std::make_shared(); - DamiaoCanFdChain chain( - bus, {joint("J1", 1, 0x11, 1)}, - DamiaoChainOptions{true, true, false}); - - ASSERT_TRUE(chain.init().ok()); - ASSERT_TRUE(chain.openPassive().ok()); - EXPECT_EQ(chain.state(), DamiaoChainState::Passive); - EXPECT_TRUE(bus->sent_batches.empty()); - - const auto arm_result = chain.arm(soon()); - EXPECT_FALSE(arm_result.ok()); - EXPECT_EQ(arm_result.code, ArmErrorCode::CommandRejected); - EXPECT_TRUE(bus->sent_batches.empty()); -} - -TEST(DamiaoCanFdChainTest, ExplicitArmAndExchangeUseUniqueConfiguredFeedback) -{ - auto bus = std::make_shared(); - DamiaoCanFdChain chain( - bus, - {joint("J1", 1, 0x11, 1), - joint("J2", 2, 0x12, 2, -1)}, - DamiaoChainOptions{true, true, true}); - ASSERT_TRUE(chain.init().ok()); - ASSERT_TRUE(chain.openPassive().ok()); - - // A stale invalid frame is already queued before this request. The drain - // must remove it; only replies generated by the subsequent send may be - // accepted. - bus->replies.push_back(feedback(0x11, 1, 2)); - bus->enqueueReplies({ - feedback(0x12, 2), - feedback(0x11, 1), - }); - ASSERT_TRUE(chain.arm(soon()).ok()); - EXPECT_EQ(chain.state(), DamiaoChainState::Armed); - EXPECT_EQ(countLifecycleByte(bus->sent_batches, 0xFC), 2U); - - bus->enqueueReplies({ - feedback(0x11, 1), - feedback(0x12, 2), - }); - DamiaoMitCommand commands[2]{}; - commands[0].tau_ff_nm = 1.0; - commands[1].tau_ff_nm = -1.0; - DamiaoJointFeedback states[2]{}; - ASSERT_TRUE(chain.exchange( - commands, 2, states, 2, soon()).ok()); - EXPECT_EQ(chain.state(), DamiaoChainState::Active); - EXPECT_TRUE(states[0].valid); - EXPECT_TRUE(states[1].valid); - // J2 has direction=-1 and offset=-0.2. - EXPECT_NEAR(states[1].q_rad, -0.2003814697265625, 1e-12); - EXPECT_NEAR(states[1].dq_rad_s, -0.0146484375, 1e-12); - EXPECT_NEAR(states[1].tau_nm, -0.0048828125, 1e-12); -} - -TEST(DamiaoCanFdChainTest, MissedFeedbackLatchesFaultAndNeverReenables) -{ - auto bus = std::make_shared(); - DamiaoCanFdChain chain( - bus, {joint("J1", 1, 0x11, 1)}, - DamiaoChainOptions{true, true, true}); - ASSERT_TRUE(chain.init().ok()); - ASSERT_TRUE(chain.openPassive().ok()); - bus->enqueueReplies({feedback(0x11, 1)}); - ASSERT_TRUE(chain.arm(soon()).ok()); - - DamiaoMitCommand command; - DamiaoJointFeedback state; - const auto result = chain.exchange( - &command, 1, &state, 1, - std::chrono::steady_clock::now() + - std::chrono::milliseconds(1)); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, ArmErrorCode::Timeout); - EXPECT_EQ(chain.state(), DamiaoChainState::FaultLatched); - EXPECT_EQ(countLifecycleByte(bus->sent_batches, 0xFC), 1U); - EXPECT_GE(countLifecycleByte(bus->sent_batches, 0xFD), 1U); - - // Clearing the fault is explicit and leaves the chain passive. - bus->enqueueReplies({feedback(0x11, 1)}); - ASSERT_TRUE(chain.clearFault(soon()).ok()); - EXPECT_EQ(chain.state(), DamiaoChainState::Passive); - EXPECT_EQ(countLifecycleByte(bus->sent_batches, 0xFC), 1U); -} - -TEST(DamiaoCanFdChainTest, DuplicateFeedbackCannotSatisfyAGroupCycle) -{ - auto bus = std::make_shared(); - DamiaoCanFdChain chain( - bus, - {joint("J1", 1, 0x11, 1), - joint("J2", 2, 0x12, 2)}, - DamiaoChainOptions{true, true, true}); - ASSERT_TRUE(chain.init().ok()); - ASSERT_TRUE(chain.openPassive().ok()); - bus->enqueueReplies({ - feedback(0x11, 1), - feedback(0x12, 2), - }); - ASSERT_TRUE(chain.arm(soon()).ok()); - - bus->enqueueReplies({ - feedback(0x11, 1), - feedback(0x11, 1), - }); - DamiaoMitCommand commands[2]{}; - DamiaoJointFeedback states[2]{}; - EXPECT_FALSE(chain.exchange( - commands, 2, states, 2, - std::chrono::steady_clock::now() + - std::chrono::milliseconds(1)).ok()); - EXPECT_EQ(chain.state(), DamiaoChainState::FaultLatched); - EXPECT_EQ(chain.statistics().duplicate_feedback, 1U); -} - -TEST(DamiaoCanFdChainTest, RejectsUnreviewedStatusAndClassicFrame) -{ - auto bus = std::make_shared(); - DamiaoCanFdChain chain( - bus, {joint("J1", 1, 0x11, 1)}, - DamiaoChainOptions{true, true, true}); - ASSERT_TRUE(chain.init().ok()); - ASSERT_TRUE(chain.openPassive().ok()); - bus->enqueueReplies({feedback(0x11, 1)}); - ASSERT_TRUE(chain.arm(soon()).ok()); - - bus->enqueueReplies({feedback(0x11, 1, 2)}); - DamiaoMitCommand command; - DamiaoJointFeedback state; - EXPECT_FALSE(chain.exchange( - &command, 1, &state, 1, soon()).ok()); - EXPECT_EQ(chain.state(), DamiaoChainState::FaultLatched); - - auto second_bus = std::make_shared(); - DamiaoCanFdChain second( - second_bus, {joint("J1", 1, 0x11, 1)}, - DamiaoChainOptions{true, true, true}); - ASSERT_TRUE(second.init().ok()); - ASSERT_TRUE(second.openPassive().ok()); - auto classic = feedback(0x11, 1); - classic.is_fd = false; - classic.bitrate_switch = false; - second_bus->enqueueReplies({classic}); - EXPECT_FALSE(second.arm(soon()).ok()); - EXPECT_EQ(second.state(), DamiaoChainState::FaultLatched); - - auto third_bus = std::make_shared(); - DamiaoCanFdChain third( - third_bus, {joint("J1", 1, 0x11, 1)}, - DamiaoChainOptions{true, true, true}); - ASSERT_TRUE(third.init().ok()); - ASSERT_TRUE(third.openPassive().ok()); - auto error_passive = feedback(0x11, 1); - error_passive.error_state_indicator = true; - third_bus->enqueueReplies({error_passive}); - EXPECT_FALSE(third.arm(soon()).ok()); - EXPECT_EQ(third.state(), DamiaoChainState::FaultLatched); -} - -TEST(DamiaoCanFdChainTest, HardwareEnableRequiresReviewedHealthContract) -{ - auto bus = std::make_shared(); - auto unreviewed = joint("J1", 1, 0x11, 1); - unreviewed.healthy_status_mask = 0U; - DamiaoCanFdChain chain( - bus, {unreviewed}, - DamiaoChainOptions{true, true, true}); - - const auto result = chain.init(); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, ArmErrorCode::InvalidArgument); - EXPECT_FALSE(bus->initialized); -} - -TEST(DamiaoCanFdChainTest, DisableReportsUnconfirmedSafetyFrames) -{ - auto bus = std::make_shared(); - DamiaoCanFdChain chain( - bus, {joint("J1", 1, 0x11, 1)}, - DamiaoChainOptions{true, true, true}); - ASSERT_TRUE(chain.init().ok()); - ASSERT_TRUE(chain.openPassive().ok()); - bus->enqueueReplies({feedback(0x11, 1)}); - ASSERT_TRUE(chain.arm(soon()).ok()); - - bus->send_result = false; - const auto result = chain.disable(); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, ArmErrorCode::CommandFailed); - EXPECT_EQ(chain.state(), DamiaoChainState::FaultLatched); -} - -TEST(DamiaoCanFdChainTest, ExpiredDeadlineAfterDrainNeverCommitsEnable) -{ - auto bus = std::make_shared(); - DamiaoCanFdChain chain( - bus, {joint("J1", 1, 0x11, 1)}, - DamiaoChainOptions{true, true, true}); - ASSERT_TRUE(chain.init().ok()); - ASSERT_TRUE(chain.openPassive().ok()); - - bus->drain_delay = std::chrono::milliseconds(3); - bus->enqueueReplies({feedback(0x11, 1)}); - const auto result = chain.arm( - std::chrono::steady_clock::now() + - std::chrono::milliseconds(1)); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, ArmErrorCode::Timeout); - EXPECT_EQ(chain.state(), DamiaoChainState::FaultLatched); - EXPECT_EQ(countLifecycleByte(bus->sent_batches, 0xFC), 0U); - EXPECT_GE(countLifecycleByte(bus->sent_batches, 0xFD), 1U); -} - -TEST(DamiaoCanFdChainTest, ConfigurationRejectsAmbiguousMappings) -{ - auto bus = std::make_shared(); - DamiaoCanFdChain chain( - bus, - {joint("J1", 1, 0x11, 1), - joint("J1", 2, 0x12, 2)}, - DamiaoChainOptions{true, true, false}); - const auto result = chain.init(); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, ArmErrorCode::InvalidArgument); - EXPECT_FALSE(bus->initialized); -} - -} // namespace -} // namespace cmvr::device diff --git a/cmvr-es/devices/arm/ume_robot_arm/tests/damiao_mit_codec_test.cpp b/cmvr-es/devices/arm/ume_robot_arm/tests/damiao_mit_codec_test.cpp deleted file mode 100644 index 5a3bcef1..00000000 --- a/cmvr-es/devices/arm/ume_robot_arm/tests/damiao_mit_codec_test.cpp +++ /dev/null @@ -1,150 +0,0 @@ -#include "arm/ume_robot_arm/include/damiao_mit_codec.h" - -#include -#include -#include - -#include - -namespace cmvr::device { -namespace { - -void expectPayload(const CanFrame& frame, - const std::array& expected) -{ - ASSERT_EQ(frame.len, expected.size()); - for (std::size_t i = 0; i < expected.size(); ++i) { - EXPECT_EQ(frame.data[i], expected[i]) << "byte " << i; - } -} - -TEST(DamiaoMitCodecTest, MatchesLegacyPythonGoldenVectors) -{ - CanFrame frame; - DamiaoMitCommand zero; - auto result = DamiaoMitCodec::encodeMit( - 1, DamiaoMotorModel::DM4310, zero, true, true, frame); - ASSERT_TRUE(result); - EXPECT_EQ(result.saturation_mask, DAMIAO_SATURATION_NONE); - EXPECT_TRUE(frame.is_fd); - EXPECT_TRUE(frame.bitrate_switch); - expectPayload(frame, {0x7F, 0xFF, 0x7F, 0xF0, - 0x00, 0x00, 0x07, 0xFF}); - - DamiaoMitCommand nontrivial; - nontrivial.kp = 100.0; - nontrivial.kd = 1.0; - nontrivial.q_rad = 1.25; - nontrivial.dq_rad_s = -2.5; - nontrivial.tau_ff_nm = 3.0; - result = DamiaoMitCodec::encodeMit( - 1, DamiaoMotorModel::DM4310, nontrivial, false, false, frame); - ASSERT_TRUE(result); - expectPayload(frame, {0x8C, 0xCC, 0x75, 0x43, - 0x33, 0x33, 0x3A, 0x65}); -} - -TEST(DamiaoMitCodecTest, ReportsProtocolSaturationWithoutHidingIt) -{ - DamiaoMitCommand command; - command.q_rad = 100.0; - command.dq_rad_s = -100.0; - command.kp = 600.0; - command.kd = -1.0; - command.tau_ff_nm = 100.0; - CanFrame frame; - const auto result = DamiaoMitCodec::encodeMit( - 2, DamiaoMotorModel::DM4310, command, false, false, frame); - ASSERT_TRUE(result); - EXPECT_EQ( - result.saturation_mask, - DAMIAO_SATURATION_Q | DAMIAO_SATURATION_DQ | - DAMIAO_SATURATION_KP | DAMIAO_SATURATION_KD | - DAMIAO_SATURATION_TAU); -} - -TEST(DamiaoMitCodecTest, RejectsNonFiniteInput) -{ - DamiaoMitCommand command; - command.tau_ff_nm = std::numeric_limits::quiet_NaN(); - CanFrame frame; - const auto result = DamiaoMitCodec::encodeMit( - 1, DamiaoMotorModel::DM4310, command, false, false, frame); - EXPECT_FALSE(result); - EXPECT_EQ(result.error, DamiaoCodecError::NonFiniteInput); -} - -TEST(DamiaoMitCodecTest, EncodesLifecycleFramesWithoutEnablingImplicitly) -{ - CanFrame frame; - ASSERT_EQ(DamiaoMitCodec::encodeMode( - 3, DamiaoMode::Enable, true, true, frame), - DamiaoCodecError::None); - expectPayload(frame, {0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFC}); - - ASSERT_EQ(DamiaoMitCodec::encodeMode( - 3, DamiaoMode::Disable, true, true, frame), - DamiaoCodecError::None); - EXPECT_EQ(frame.data[7], 0xFD); - ASSERT_EQ(DamiaoMitCodec::encodeMode( - 3, DamiaoMode::SetZero, true, true, frame), - DamiaoCodecError::None); - EXPECT_EQ(frame.data[7], 0xFE); - ASSERT_EQ(DamiaoMitCodec::encodeMode( - 3, DamiaoMode::ClearFault, true, true, frame), - DamiaoCodecError::None); - EXPECT_EQ(frame.data[7], 0xFB); -} - -TEST(DamiaoMitCodecTest, DecodesLegacyFeedbackAndRequiresConfiguredId) -{ - CanFrame frame; - frame.id = 0x11; - frame.len = 8; - frame.is_fd = true; - frame.bitrate_switch = true; - frame.rx_monotonic_ns = 1234567; - frame.data[0] = 0xA1; - frame.data[1] = 0x80; - frame.data[2] = 0x00; - frame.data[3] = 0x80; - frame.data[4] = 0x08; - frame.data[5] = 0x00; - frame.data[6] = 40; - frame.data[7] = 41; - - DamiaoJointFeedback feedback; - EXPECT_EQ(DamiaoMitCodec::decodeFeedback( - frame, 0x12, DamiaoMotorModel::DM4310, feedback), - DamiaoCodecError::UnexpectedFeedbackId); - EXPECT_FALSE(feedback.valid); - - ASSERT_EQ(DamiaoMitCodec::decodeFeedback( - frame, 0x11, DamiaoMotorModel::DM4310, feedback), - DamiaoCodecError::None); - EXPECT_TRUE(feedback.valid); - EXPECT_EQ(feedback.reported_motor_id, 1); - EXPECT_EQ(feedback.status, 0x0A); - EXPECT_EQ(feedback.driver_temperature_raw, 40); - EXPECT_EQ(feedback.motor_temperature_raw, 41); - EXPECT_EQ(feedback.rx_monotonic_ns, 1234567); - EXPECT_NEAR(feedback.q_rad, 0.0003814697265625, 1e-12); - EXPECT_NEAR(feedback.dq_rad_s, 0.0146484375, 1e-12); - EXPECT_NEAR(feedback.tau_nm, 0.0048828125, 1e-12); -} - -TEST(DamiaoMitCodecTest, ContainsAllLegacyMotorRanges) -{ - EXPECT_DOUBLE_EQ( - DamiaoMitCodec::limitsFor(DamiaoMotorModel::DM8009).tau_max_nm, - 54.0); - EXPECT_DOUBLE_EQ( - DamiaoMitCodec::limitsFor(DamiaoMotorModel::DMH3510).dq_max_rad_s, - 280.0); - EXPECT_FALSE( - DamiaoMitCodec::limitsFor(DamiaoMotorModel::Unknown).valid()); -} - -} // namespace -} // namespace cmvr::device diff --git a/cmvr-es/devices/arm/ume_robot_arm/tests/ume_robot_arm_test.cpp b/cmvr-es/devices/arm/ume_robot_arm/tests/ume_robot_arm_test.cpp deleted file mode 100644 index e7241ebc..00000000 --- a/cmvr-es/devices/arm/ume_robot_arm/tests/ume_robot_arm_test.cpp +++ /dev/null @@ -1,338 +0,0 @@ -#include "arm/ume_robot_arm/include/ume_robot_arm.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "canbus/abstract_canbus.h" -#include "common/io/proto_file_io.h" - -#ifndef CMVR_UME_ARM_CONFIG_PATH -#define CMVR_UME_ARM_CONFIG_PATH "" -#endif - -namespace cmvr::device { -namespace { - -class LoopbackDamiaoBus final : public AbstractCanbus { -public: - std::string typeName() const override { return "LoopbackDamiaoBus"; } - bool init() override - { - std::lock_guard lock(mutex); - initialized = true; - return true; - } - bool start() override - { - std::lock_guard lock(mutex); - started = true; - is_started_ = true; - return true; - } - bool stop() override - { - std::lock_guard lock(mutex); - started = false; - is_started_ = false; - return true; - } - - msgs::ErrorCode send( - const std::vector& frames, - int32_t* frame_num) override - { - std::lock_guard lock(mutex); - if (!started || !frame_num || - *frame_num != static_cast(frames.size())) { - return msgs::ErrorCode::CAN_CLIENT_ERROR_SEND_FAILED; - } - if (!send_result) { - return msgs::ErrorCode::CAN_CLIENT_ERROR_SEND_FAILED; - } - sent_batches.push_back(frames); - for (const auto& frame : frames) { - if (frame.id < 1U || frame.id > 8U) { - continue; - } - CanFrame reply; - reply.id = 0x10U + frame.id; - reply.len = 8U; - reply.is_fd = true; - reply.bitrate_switch = true; - reply.rx_monotonic_ns = - std::chrono::duration_cast( - std::chrono::steady_clock::now().time_since_epoch()) - .count(); - reply.data[0] = static_cast(frame.id); - reply.data[1] = 0x80U; - reply.data[2] = 0x00U; - reply.data[3] = 0x80U; - reply.data[4] = 0x08U; - reply.data[5] = 0x00U; - replies.push_back(reply); - } - return msgs::ErrorCode::OK; - } - - msgs::ErrorCode receive( - std::vector* frames, - int32_t* frame_num) override - { - std::lock_guard lock(mutex); - if (!started || !frames || !frame_num || replies.empty()) { - return msgs::ErrorCode::CAN_CLIENT_ERROR_RECV_FAILED; - } - frames->clear(); - frames->push_back(replies.front()); - replies.pop_front(); - *frame_num = 1; - return msgs::ErrorCode::OK; - } - - bool discardPendingFrames() override - { - std::lock_guard lock(mutex); - replies.clear(); - return started; - } - - std::string getErrorString(int32_t) override { return {}; } - - void setSendResult(const bool result) - { - std::lock_guard lock(mutex); - send_result = result; - } - - std::size_t lifecycleCount(const std::uint8_t byte) const - { - std::lock_guard lock(mutex); - std::size_t count = 0; - for (const auto& batch : sent_batches) { - for (const auto& frame : batch) { - if (frame.len == 8U && - frame.data[0] == 0xFFU && - frame.data[7] == byte) { - ++count; - } - } - } - return count; - } - - bool initialized{false}; - bool started{false}; - bool send_result{true}; - std::deque replies; - std::vector> sent_batches; - mutable std::mutex mutex; -}; - -config::RobotArmConfig configFor(const bool hardware_enabled) -{ - config::RobotArmConfig cfg; - cfg.set_id("ume_right"); - auto* ume = cfg.mutable_ume(); - ume->set_hardware_enabled(hardware_enabled); - ume->set_control_frequency_hz(800U); - ume->set_cycle_deadline_us(1000U); - ume->set_feedback_watchdog_ms(20U); - auto* can = ume->mutable_can(); - can->set_interface_name("fake-can"); - can->set_enable_fd(true); - can->set_bitrate_switch(true); - can->set_send_timeout_us(100U); - can->set_receive_timeout_us(100U); - can->set_receive_own_messages(false); - for (std::uint32_t i = 1; i <= 8U; ++i) { - auto* joint = ume->add_joints(); - joint->set_joint_name("RJ" + std::to_string(i)); - joint->set_command_id(i); - joint->set_feedback_id(0x10U + i); - joint->set_reported_motor_id(i); - joint->set_model(config::DAMIAO_MOTOR_MODEL_DM4310); - joint->set_direction(1); - joint->set_joint_lower_rad(-2.0); - joint->set_joint_upper_rad(2.0); - joint->set_max_velocity_rad_s(3.0); - joint->set_max_torque_nm(2.0); - joint->add_healthy_feedback_status(0U); - joint->set_max_driver_temperature_raw(80U); - joint->set_max_motor_temperature_raw(90U); - } - return cfg; -} - -bool waitUntil( - const std::function& predicate, - const std::chrono::milliseconds timeout) -{ - const auto deadline = std::chrono::steady_clock::now() + timeout; - while (std::chrono::steady_clock::now() < deadline) { - if (predicate()) { - return true; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - return predicate(); -} - -TEST(UmeRobotArmTest, LifecycleIsPassiveUntilExplicitFreshTorqueCommand) -{ - auto bus = std::make_shared(); - UmeRobotArm arm(configFor(true), bus); - - ASSERT_TRUE(arm.init()); - EXPECT_EQ(bus->lifecycleCount(0xFCU), 0U); - ASSERT_TRUE(arm.start()); - EXPECT_EQ(bus->lifecycleCount(0xFCU), 0U); - - TorqueServoOptions options; - options.period = 0.00125; - options.command_watchdog_ms = 100U; - ASSERT_TRUE(arm.startTorqueMode(options).ok()); - JointTorqueCommand command; - command.torque.assign(8U, 0.0); - ASSERT_TRUE(arm.servoTorque(command).ok()); - ASSERT_TRUE(arm.torqueOn().ok()); - - ASSERT_TRUE(waitUntil( - [&arm] { return arm.getJointState().sequence > 0U; }, - std::chrono::milliseconds(30))); - const auto state = arm.getJointState(); - EXPECT_TRUE(state.position_valid); - EXPECT_TRUE(state.velocity_valid); - EXPECT_TRUE(state.effort_valid); - EXPECT_EQ(state.position.size(), 8U); - EXPECT_EQ(bus->lifecycleCount(0xFCU), 8U); - EXPECT_EQ(arm.getControlMode(), ControlMode::Torque); - - EXPECT_TRUE(arm.stop()); - EXPECT_GE(bus->lifecycleCount(0xFDU), 8U); -} - -TEST(UmeRobotArmTest, StaleCommandLatchesFaultAndNeverReenables) -{ - auto bus = std::make_shared(); - UmeRobotArm arm(configFor(true), bus); - ASSERT_TRUE(arm.init()); - ASSERT_TRUE(arm.start()); - - TorqueServoOptions options; - options.period = 0.001; - options.command_watchdog_ms = 2U; - ASSERT_TRUE(arm.startTorqueMode(options).ok()); - JointTorqueCommand command; - command.torque.assign(8U, 0.0); - ASSERT_TRUE(arm.servoTorque(command).ok()); - ASSERT_TRUE(arm.torqueOn().ok()); - ASSERT_TRUE(waitUntil( - [&arm] { return arm.isFault(); }, - std::chrono::milliseconds(50))); - - EXPECT_FALSE(arm.busy()); - EXPECT_EQ(bus->lifecycleCount(0xFCU), 8U); - EXPECT_GE(bus->lifecycleCount(0xFDU), 8U); - EXPECT_EQ(arm.healthSnapshot().state, DeviceHealthState::Fault); -} - -TEST(UmeRobotArmTest, HardwareGateRejectsEnableWithoutWritingIt) -{ - auto bus = std::make_shared(); - UmeRobotArm arm(configFor(false), bus); - ASSERT_TRUE(arm.init()); - ASSERT_TRUE(arm.start()); - ASSERT_TRUE(arm.startTorqueMode(TorqueServoOptions{}).ok()); - JointTorqueCommand command; - command.torque.assign(8U, 0.0); - ASSERT_TRUE(arm.servoTorque(command).ok()); - - const auto result = arm.torqueOn(); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, ArmErrorCode::CommandRejected); - EXPECT_EQ(bus->lifecycleCount(0xFCU), 0U); -} - -TEST(UmeRobotArmTest, PositionServoIsExplicitlyUnsupported) -{ - auto bus = std::make_shared(); - UmeRobotArm arm(configFor(false), bus); - JointPositionCommand command; - command.position.assign(8U, 0.0); - const auto result = arm.servoJ(command); - EXPECT_EQ(result.code, ArmErrorCode::UnsupportedCommand); -} - -TEST(UmeRobotArmTest, RejectsCycleDeadlineLongerThanControlPeriod) -{ - auto cfg = configFor(false); - cfg.mutable_ume()->set_cycle_deadline_us(2000U); - auto bus = std::make_shared(); - UmeRobotArm arm(cfg, bus); - - EXPECT_FALSE(arm.init()); - EXPECT_FALSE(bus->initialized); - EXPECT_EQ( - arm.healthSnapshot().state, - DeviceHealthState::Fault); -} - -TEST(UmeRobotArmTest, RejectsReportedMotorIdBeforeNarrowingConversion) -{ - auto cfg = configFor(false); - cfg.mutable_ume()->mutable_joints(0)->set_reported_motor_id(257U); - auto bus = std::make_shared(); - UmeRobotArm arm(cfg, bus); - - EXPECT_FALSE(arm.init()); - EXPECT_FALSE(bus->initialized); - EXPECT_EQ(arm.healthSnapshot().state, DeviceHealthState::Fault); -} - -TEST(UmeRobotArmTest, EmergencyStopReportsUnconfirmedDisable) -{ - auto bus = std::make_shared(); - UmeRobotArm arm(configFor(true), bus); - ASSERT_TRUE(arm.init()); - ASSERT_TRUE(arm.start()); - - bus->setSendResult(false); - const auto result = arm.emergencyStop(); - - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result.code, ArmErrorCode::CommandFailed); - EXPECT_TRUE(arm.isEmergencyStopped()); - EXPECT_TRUE(arm.isFault()); - EXPECT_NE( - arm.healthSnapshot().error_message.find("zero/disable failed"), - std::string::npos); -} - -TEST(UmeRobotArmTest, CheckedInDualArmConfigParsesAndKeepsHardwareDisabled) -{ - config::ArmRootConfig root; - ASSERT_TRUE(ProtoMessageIo::getProtoFromAsciiFile( - CMVR_UME_ARM_CONFIG_PATH, &root)); - ASSERT_EQ(root.arm().robot_arms_size(), 2); - for (const auto& arm : root.arm().robot_arms()) { - ASSERT_TRUE(arm.has_ume()); - EXPECT_EQ(arm.ume().joints_size(), 8); - EXPECT_FALSE(arm.ume().hardware_enabled()); - EXPECT_TRUE(arm.ume().can().enable_fd()); - EXPECT_TRUE(arm.ume().can().bitrate_switch()); - EXPECT_GT(arm.ume().can().send_timeout_us(), 0U); - EXPECT_FALSE(arm.ume().can().receive_own_messages()); - } -} - -} // namespace -} // namespace cmvr::device diff --git a/cmvr-es/devices/canbus/can_client/pcan/pcan_client.cc b/cmvr-es/devices/canbus/can_client/pcan/pcan_client.cc deleted file mode 100644 index 0dc99860..00000000 --- a/cmvr-es/devices/canbus/can_client/pcan/pcan_client.cc +++ /dev/null @@ -1,205 +0,0 @@ -#include "common/base/logging/logger.h" -#include "pcan_client.h" - -#include -#include -#include -#include -#include "cmvr/msgs/error_code.pb.h" -#include "cstdio" - -namespace cmvr { - namespace device { -#define CAN_ID_MASK 0x1FFFF800U // can_filter mask -#define CAN_STANDARD_MAX_ID 0x7FFU - - using cmvr::msgs::ErrorCode; - using cmvr::msgs::CANCardParameter; - PcanClient::PcanClient(const config::SocketCanConfig &cfg) { - port_ = static_cast(cfg.channel_id()); - interface_ = CANCardParameter::NATIVE; - enable_can_err_check_ = false; - } - - PcanClient::~PcanClient() { - stop(); - } - - bool PcanClient::init() { - - -#define LPCSTR const char* - /// - /// Sets a TPCANDevice value. The input can be numeric, in hexadecimal or decimal format, or as string denoting - /// a TPCANDevice value name. - /// - LPCSTR DeviceType = "PCAN_PCI"; - /// - /// Sets value in range of a double. The input can be hexadecimal or decimal format. - /// - LPCSTR DeviceID = ""; - /// - /// Sets a zero-based index value in range of a double. The input can be hexadecimal or decimal format. - /// - LPCSTR ControllerNumber = ""; - /// - /// Sets a valid Internet Protocol address - /// - LPCSTR IPAddress = ""; - /// - /// Sets a valid GUID for a PCAN device - /// - LPCSTR DeviceGUID = ""; - - - char sParameters[260]; - if (DeviceType != "") - snprintf(sParameters, sizeof(sParameters), "%s=%s", LOOKUP_DEVICE_TYPE, DeviceType); - if (DeviceID != "") - { - if (sParameters != "") - snprintf(sParameters, sizeof(sParameters), "%s, ", sParameters); - snprintf(sParameters, sizeof(sParameters), "%s%s=%s", sParameters, LOOKUP_DEVICE_ID, DeviceID); - } - if (ControllerNumber != "") - { - if (sParameters != "") - snprintf(sParameters, sizeof(sParameters), "%s, ", sParameters); - snprintf(sParameters, sizeof(sParameters), "%s%s=%s", sParameters, LOOKUP_CONTROLLER_NUMBER, ControllerNumber); - } - if (IPAddress != "") - { - if (sParameters != "") - snprintf(sParameters, sizeof(sParameters), "%s, ", sParameters); - snprintf(sParameters, sizeof(sParameters), "%s%s=%s", sParameters, LOOKUP_IP_ADDRESS, IPAddress); - } - - if (DeviceGUID != "") - { - if (sParameters != "") - snprintf(sParameters, sizeof(sParameters), "%s, ", sParameters); - snprintf(sParameters, sizeof(sParameters), "%s%s=%s", sParameters, LOOKUP_DEVICE_GUID, DeviceGUID); - } - - TPCANHandle handle; - TPCANStatus stsResult = CAN_LookUpChannel((LPSTR)sParameters, &handle); - TPCANStatus ret = CAN_Initialize(PcanHandle, Bitrate); - if (ret != PCAN_ERROR_OK) { - CMVR_LOG(ERROR) << "send message failed, error code: " << ret; - return false; - } - - TPCANStatus state = CAN_GetStatus(PcanHandle); - if (state & PCAN_ERROR_BUSOFF) { - // 进入 bus-off,尝试复位总线 - CMVR_LOG(ERROR) << "send message failed, error code: " << ret; - return false; - } - - return true; - } - - bool PcanClient::start() { - is_started_ = true; - return true; - } - - bool PcanClient::stop() { - if (is_started_) { - is_started_ = false; - CAN_Uninitialize(dev_handler_); - CMVR_LOG(INFO) << "close socket can ok. port:" << port_; - } - return true; - } - - cmvr::msgs::ErrorCode PcanClient::send(const std::vector &frames, int32_t *const frame_num) { - if (frame_num == nullptr) { - CMVR_LOG(FATAL) << "frame_num is null"; - } - if (frames.size() != static_cast(*frame_num)) { - CMVR_LOG(FATAL) << "frames size does not match frame_num"; - } - - if (!is_started_) { - CMVR_LOG(ERROR) << "Nvidia can client has not been initiated! Please init first!"; - return ErrorCode::CAN_CLIENT_ERROR_SEND_FAILED; - } - for (size_t i = 0; i < frames.size() && i < MAX_CAN_SEND_FRAME_LEN; ++i) { - if (frames[i].len > CANBUS_MESSAGE_LENGTH || frames[i].len < 0) { - CMVR_LOG(ERROR) << "frames[" << i << "].len = " << frames[i].len - << ", which is not equal to can message data length (" - << CANBUS_MESSAGE_LENGTH << ")."; - return ErrorCode::CAN_CLIENT_ERROR_SEND_FAILED; - } - if (frames[i].id > CAN_STANDARD_MAX_ID) { - send_frames_[i].ID = (frames[i].id & CAN_EFF_MASK) | CAN_EFF_FLAG; - } else { - send_frames_[i].ID = (frames[i].id & CAN_SFF_MASK); - } - // CMVR_LOG(INFO) << "send can id is " << send_frames_[i].can_id; - send_frames_[i].LEN = frames[i].len; - std::memcpy(send_frames_[i].DATA, frames[i].data, frames[i].len); - send_frames_[i].MSGTYPE = PCAN_MESSAGE_EXTENDED; - // Synchronous transmission of CAN messages - TPCANStatus ret = CAN_Write(PcanHandle, &send_frames_[i]); - if (ret != PCAN_ERROR_OK) { - CMVR_LOG(ERROR) << "send message failed, error code: " << ret; - return ErrorCode::CAN_CLIENT_ERROR_BASE; - } - } - - return ErrorCode::OK; - } - - cmvr::msgs::ErrorCode PcanClient::receive(std::vector *const frames, int32_t *const frame_num) { - if (!is_started_) { - CMVR_LOG(ERROR) << "Nvidia can client is not init! Please init first!"; - return ErrorCode::CAN_CLIENT_ERROR_RECV_FAILED; - } - - if (*frame_num > MAX_CAN_RECV_FRAME_LEN || *frame_num < 0) { - CMVR_LOG(ERROR) << "recv can frame num not in range[0, " << MAX_CAN_RECV_FRAME_LEN - << "], frame_num:" << *frame_num; - // TODO(Authors): check the difference of returning frame_num/error_code - return ErrorCode::CAN_CLIENT_ERROR_FRAME_NUM; - } - TPCANTimestamp CANTimeStamp; - for (int32_t i = 0; i < *frame_num && i < MAX_CAN_RECV_FRAME_LEN; ++i) { - CanFrame cf; - - // We execute the "Read" function of the PCANBasic - TPCANStatus ret = CAN_Read(PcanHandle, &recv_frames_[i], &CANTimeStamp); - if (ret != PCAN_ERROR_OK) { - - CMVR_LOG(ERROR) << "receive message failed, error code: " << ret; - return ErrorCode::CAN_CLIENT_ERROR_BASE; - } - if (recv_frames_[i].LEN > CANBUS_MESSAGE_LENGTH || - recv_frames_[i].LEN < 0) { - CMVR_LOG(ERROR) << "recv_frames_[" << i - << "].can_dlc = " << recv_frames_[i].LEN - << ", which is not equal to can message data length (" - << CANBUS_MESSAGE_LENGTH << ")."; - return ErrorCode::CAN_CLIENT_ERROR_RECV_FAILED; - } - if (recv_frames_[i].ID > CAN_STANDARD_MAX_ID) { - cf.id = enable_can_err_check_ - ? recv_frames_[i].ID & CAN_EFF_MASK | CAN_ERR_FLAG - : recv_frames_[i].ID & CAN_EFF_MASK; - } else { - cf.id = (recv_frames_[i].ID & CAN_SFF_MASK); - } - CMVR_LOG(INFO) << "Socket can receive can id is " << recv_frames_[i].ID; - cf.len = recv_frames_[i].LEN; - std::memcpy(cf.data, recv_frames_[i].DATA, recv_frames_[i].LEN); - frames->push_back(cf); - } - return ErrorCode::OK; - } - - std::string PcanClient::getErrorString(const int32_t status) { - return ""; - } - } // namespace device -} // namespace cmvr diff --git a/cmvr-es/devices/canbus/can_client/pcan/pcan_client.h b/cmvr-es/devices/canbus/can_client/pcan/pcan_client.h deleted file mode 100644 index 94401e65..00000000 --- a/cmvr-es/devices/canbus/can_client/pcan/pcan_client.h +++ /dev/null @@ -1,86 +0,0 @@ -// -// Created by lgv on 2025/8/7. -// - -/** - * @file - * @brief Defines the SocketCanClientRaw class which inherits AbstractCanbus. - */ -#pragma once - -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include "cmvr/msgs/error_code.pb.h" -#include "cmvr/msgs/can_card_parameter.pb.h" -#include "cmvr/config/motor_config/motor_config.pb.h" - -#include "gflags/gflags.h" -#include "../../abstract_canbus.h" -#include "canbus/common/canbus_consts.h" - -#include - -namespace cmvr { - namespace device { - - class PcanClient final : public AbstractCanbus { - public: - explicit PcanClient(const config::SocketCanConfig &cfg); - ~PcanClient(); - std::string typeName() const override { return "PcanClient"; } - bool init() override; - bool start() override; - bool stop() override; - - /** - * @brief Send messages - * @param frames The messages to send. - * @param frame_num The amount of messages to send. - * @return The status of the sending action - */ - cmvr::msgs::ErrorCode send(const std::vector &frames, - int32_t *const frame_num) override; - - /** - * @brief Receive messages - * @param frames The messages to receive. - * @param frame_num The amount of messages to receive. - * @return The status of the receiving action - */ - cmvr::msgs::ErrorCode receive(std::vector *const frames, - int32_t *const frame_num) override; - - /** - * @brief Get the error string. - * @param status The status to get the error string. - */ - std::string getErrorString(const int32_t status) override; - private: - int dev_handler_ = 0; - cmvr::msgs::CANCardParameter::CANChannelId port_; - cmvr::msgs::CANCardParameter::CANInterface interface_; - TPCANMsg send_frames_[MAX_CAN_SEND_FRAME_LEN]; - TPCANMsg recv_frames_[MAX_CAN_RECV_FRAME_LEN]; - - - // - bool enable_can_err_check_{false}; - const TPCANHandle PcanHandle = PCAN_USBBUS1; - const TPCANBaudrate Bitrate = PCAN_BAUD_1M; - }; - } -} diff --git a/cmvr-es/devices/canbus/can_client/pcan/pcan_client_test.cpp b/cmvr-es/devices/canbus/can_client/pcan/pcan_client_test.cpp deleted file mode 100644 index e493b851..00000000 --- a/cmvr-es/devices/canbus/can_client/pcan/pcan_client_test.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "common/base/logging/logger.h" -// -// Created by lgv on 2025/8/7. -// -#include "cmvr/msgs/error_code.pb.h" -#include "cmvr/msgs/can_card_parameter.pb.h" -#include "canbus/can_client/pcan/pcan_client.h" -#include "gtest/gtest.h" -namespace cmvr { - namespace device { - using cmvr::msgs::ErrorCode; - using cmvr::msgs::CANCardParameter; - - TEST(PcanClienTest, simple_test) { - CANCardParameter param; - param.set_brand(CANCardParameter::SOCKET_CAN_RAW); - param.set_channel_id(CANCardParameter::CHANNEL_ID_ZERO); - - config::SocketCanConfig cfg; - cfg.set_channel_id(0); - PcanClient socket_can_client(cfg); - - socket_can_client.init(); - - // EXPECT_EQ(socket_can_client.start(), ErrorCode::CAN_CLIENT_ERROR_BASE); - socket_can_client.start(); - std::vector frames; - // int32_t num = 0; - // EXPECT_EQ(socket_can_client.send(frames, &num), - // ErrorCode::OK); - // ++num; - // EXPECT_EQ(socket_can_client.receive(&frames, &num), - // ErrorCode::OK); - // CMVR_LOG(INFO) << frames.at(0).CanFrameString(); - CanFrame can_frame; - can_frame.id = 0x123; - can_frame.len = 8; - memset(can_frame.data, 0xA3, sizeof(can_frame.data)); - frames.clear(); - frames.push_back(can_frame); - EXPECT_EQ(socket_can_client.sendSingleFrame(frames), - ErrorCode::OK); - socket_can_client.stop(); - } - } -} diff --git a/cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeLists.txt b/cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeLists.txt index 0c340a57..1e522d43 100644 --- a/cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeLists.txt +++ b/cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeLists.txt @@ -7,30 +7,3 @@ add_library(cmvr_es::device::rh56dftp_dexhand ALIAS rh56dftp_dexhand) target_link_libraries(rh56dftp_dexhand PRIVATE cmvr_es::hardware cmvr_es::proto -lmodbus) install(TARGETS rh56dftp_dexhand LIBRARY DESTINATION lib) - -if(BUILD_TESTING) - add_executable(rh56dftp_dexhand_stop_all_test - tests/rh56dftp_dexhand_stop_all_test.cpp - ) - target_link_libraries(rh56dftp_dexhand_stop_all_test PRIVATE - cmvr_es::device::rh56dftp_dexhand - gtest - gtest_main - pthread - ) - add_test( - NAME rh56dftp_dexhand_stop_all_test - COMMAND rh56dftp_dexhand_stop_all_test - ) - set(_rh56_stop_all_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _rh56_stop_all_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(rh56dftp_dexhand_stop_all_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_rh56_stop_all_test_environment}" - ) -endif() diff --git a/cmvr-es/devices/dexhand/rh56dftp_dexhand/tests/rh56dftp_dexhand_stop_all_test.cpp b/cmvr-es/devices/dexhand/rh56dftp_dexhand/tests/rh56dftp_dexhand_stop_all_test.cpp deleted file mode 100644 index 9414588c..00000000 --- a/cmvr-es/devices/dexhand/rh56dftp_dexhand/tests/rh56dftp_dexhand_stop_all_test.cpp +++ /dev/null @@ -1,348 +0,0 @@ -#include "devices/dexhand/rh56dftp_dexhand/include/rh56dftp_dexhand.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace cmvr::device { -namespace { - -using namespace std::chrono_literals; - -class FakeModbusController final : public ModbusController { -public: - bool open(const std::string&, int) override - { - std::lock_guard lock(mutex_); - open_ = true; - return true; - } - - void close() override - { - std::lock_guard lock(mutex_); - open_ = false; - } - - bool isOpen() const override - { - std::lock_guard lock(mutex_); - return open_; - } - - bool writeRegisters( - int, - const uint16_t* values, - const int count) override - { - std::unique_lock lock(mutex_); - ++write_calls_; - write_started_ = true; - condition_.notify_all(); - condition_.wait(lock, [this] { return !block_write_; }); - if (!write_succeeds_) { - return false; - } - actual_angles_.assign(values, values + count); - return true; - } - - bool readRegisterBlock( - const int address, - const int count, - std::vector& values) override - { - std::unique_lock lock(mutex_); - ++read_calls_; - read_started_ = true; - condition_.notify_all(); - condition_.wait(lock, [this] { return !block_read_; }); - const std::vector* source = &actual_angles_; - std::vector sampled_angles; - if (address == 1546 && !actual_angle_samples_.empty()) { - const auto sample = actual_angle_samples_.front(); - actual_angle_samples_.pop_front(); - sampled_angles.assign(sample.begin(), sample.end()); - source = &sampled_angles; - } - values.assign(static_cast(count), 0U); - for (std::size_t index = 0; - index < values.size() && index < source->size(); - ++index) { - values[index] = (*source)[index]; - } - return read_succeeds_; - } - - void setActualAngles(const std::array& values) - { - std::lock_guard lock(mutex_); - actual_angles_.assign(values.begin(), values.end()); - actual_angle_samples_.clear(); - } - - void setActualAngleSamples( - std::deque> samples) - { - std::lock_guard lock(mutex_); - actual_angle_samples_ = std::move(samples); - } - - void setWriteSucceeds(const bool succeeds) - { - std::lock_guard lock(mutex_); - write_succeeds_ = succeeds; - } - - void blockNextRead() - { - std::lock_guard lock(mutex_); - block_read_ = true; - read_started_ = false; - } - - void releaseRead() - { - { - std::lock_guard lock(mutex_); - block_read_ = false; - } - condition_.notify_all(); - } - - bool waitForRead(const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return condition_.wait_for( - lock, timeout, [this] { return read_started_; }); - } - - bool waitForReadCalls( - const int expected, - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return condition_.wait_for( - lock, timeout, [this, expected] { return read_calls_ >= expected; }); - } - - void blockNextWrite() - { - std::lock_guard lock(mutex_); - block_write_ = true; - write_started_ = false; - } - - void releaseWrite() - { - { - std::lock_guard lock(mutex_); - block_write_ = false; - } - condition_.notify_all(); - } - - bool waitForWrite(const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return condition_.wait_for( - lock, timeout, [this] { return write_started_; }); - } - - int readCalls() const - { - std::lock_guard lock(mutex_); - return read_calls_; - } - - int writeCalls() const - { - std::lock_guard lock(mutex_); - return write_calls_; - } - -private: - mutable std::mutex mutex_; - std::condition_variable condition_; - std::vector actual_angles_{6U, 0U}; - std::deque> actual_angle_samples_; - bool open_{false}; - bool block_read_{false}; - bool block_write_{false}; - bool read_started_{false}; - bool write_started_{false}; - bool read_succeeds_{true}; - bool write_succeeds_{true}; - int read_calls_{0}; - int write_calls_{0}; -}; - -struct TestHand { - TestHand() - { - config.set_id("rh56-test"); - config.set_ip("fake-modbus"); - auto controller = std::make_unique(); - fake = controller.get(); - hand = std::make_unique( - config, std::move(controller)); - EXPECT_TRUE(hand->init()); - } - - ~TestHand() - { - if (hand) { - hand->stop(); - } - } - - config::RH56DFTPDexHandConfig config; - FakeModbusController* fake{nullptr}; - std::unique_ptr hand; -}; - -TEST(RH56DFTPDexhandStopAllTest, IdleTactileDeviceStopsWithoutClosingLifecycle) -{ - TestHand fixture; - - EXPECT_TRUE(fixture.hand->stopOperationalActivity()); - EXPECT_EQ(fixture.hand->state(), AbstractDexHand::Status::INITIALIZED); - EXPECT_TRUE(fixture.fake->isOpen()); - - const int reads_before = fixture.fake->readCalls(); - (void)fixture.hand->getSensorData( - AbstractDexHand::FingerType::INDEX, - AbstractDexHand::TactileRegion::TIP); - EXPECT_EQ(fixture.fake->readCalls(), reads_before); -} - -TEST(RH56DFTPDexhandStopAllTest, UnreachedAngleTargetFailsClosedThenRecovers) -{ - TestHand fixture; - const std::vector target{100, 200, 300, 400, 500, 600}; - - fixture.hand->setAngles(target); - fixture.fake->setActualAngles({0, 0, 0, 0, 0, 0}); - EXPECT_FALSE(fixture.hand->stopOperationalActivity()); - - fixture.fake->setActualAngles({100, 200, 300, 400, 500, 600}); - EXPECT_TRUE(fixture.hand->stopOperationalActivity()); - EXPECT_TRUE(fixture.fake->isOpen()); -} - -TEST(RH56DFTPDexhandStopAllTest, MovingSampleAtTargetDoesNotConfirmStop) -{ - TestHand fixture; - const std::vector target{100, 200, 300, 400, 500, 600}; - - fixture.hand->setAngles(target); - fixture.fake->setActualAngleSamples({ - {100, 200, 300, 400, 500, 600}, - {103, 203, 303, 403, 503, 603}, - {106, 206, 306, 406, 506, 606}, - }); - EXPECT_FALSE(fixture.hand->stopOperationalActivity()); - - fixture.fake->setActualAngles({100, 200, 300, 400, 500, 600}); - EXPECT_TRUE(fixture.hand->stopOperationalActivity()); -} - -TEST(RH56DFTPDexhandStopAllTest, FailedAngleWriteRemainsUnconfirmed) -{ - TestHand fixture; - fixture.fake->setActualAngles({0, 0, 0, 0, 0, 0}); - fixture.fake->setWriteSucceeds(false); - - fixture.hand->setAngles({100, 200, 300, 400, 500, 600}); - - EXPECT_FALSE(fixture.hand->stopOperationalActivity()); -} - -TEST(RH56DFTPDexhandStopAllTest, StopWaitsForAdmittedAngleWrite) -{ - TestHand fixture; - fixture.fake->blockNextWrite(); - const std::vector target{100, 200, 300, 400, 500, 600}; - auto command = std::async(std::launch::async, [&] { - fixture.hand->setAngles(target); - }); - ASSERT_TRUE(fixture.fake->waitForWrite(500ms)); - - auto stop = std::async(std::launch::async, [&] { - return fixture.hand->stopOperationalActivity(); - }); - EXPECT_EQ(stop.wait_for(20ms), std::future_status::timeout); - - fixture.fake->releaseWrite(); - EXPECT_EQ(command.wait_for(500ms), std::future_status::ready); - command.get(); - ASSERT_EQ(stop.wait_for(500ms), std::future_status::ready); - EXPECT_TRUE(stop.get()); - - const int writes_before = fixture.fake->writeCalls(); - fixture.hand->setAngles(target); - EXPECT_EQ(fixture.fake->writeCalls(), writes_before); - EXPECT_TRUE(fixture.hand->resumeOperationalActivity()); - fixture.hand->setAngles(target); - EXPECT_EQ(fixture.fake->writeCalls(), writes_before + 1); -} - -TEST(RH56DFTPDexhandStopAllTest, StopWaitsForAdmittedTactileRead) -{ - TestHand fixture; - fixture.fake->blockNextRead(); - auto read = std::async(std::launch::async, [&] { - return fixture.hand->getSensorData( - AbstractDexHand::FingerType::INDEX, - AbstractDexHand::TactileRegion::TIP); - }); - ASSERT_TRUE(fixture.fake->waitForRead(500ms)); - - auto stop = std::async(std::launch::async, [&] { - return fixture.hand->stopOperationalActivity(); - }); - EXPECT_EQ(stop.wait_for(20ms), std::future_status::timeout); - - fixture.fake->releaseRead(); - EXPECT_EQ(read.wait_for(500ms), std::future_status::ready); - (void)read.get(); - ASSERT_EQ(stop.wait_for(500ms), std::future_status::ready); - EXPECT_TRUE(stop.get()); -} - -TEST(RH56DFTPDexhandStopAllTest, StopDrainsAndPausesBackgroundTactilePolling) -{ - TestHand fixture; - ASSERT_TRUE(fixture.hand->start()); - - const int reads_before_block = fixture.fake->readCalls(); - fixture.fake->blockNextRead(); - ASSERT_TRUE(fixture.fake->waitForReadCalls(reads_before_block + 1, 500ms)); - - auto stop = std::async(std::launch::async, [&] { - return fixture.hand->stopOperationalActivity(); - }); - EXPECT_EQ(stop.wait_for(20ms), std::future_status::timeout); - - fixture.fake->releaseRead(); - ASSERT_EQ(stop.wait_for(500ms), std::future_status::ready); - EXPECT_TRUE(stop.get()); - - const int reads_after_stop = fixture.fake->readCalls(); - std::this_thread::sleep_for(30ms); - EXPECT_EQ(fixture.fake->readCalls(), reads_after_stop); - - ASSERT_TRUE(fixture.hand->resumeOperationalActivity()); - EXPECT_TRUE(fixture.fake->waitForReadCalls(reads_after_stop + 1, 500ms)); -} - -} // namespace -} // namespace cmvr::device diff --git a/cmvr-es/devices/motor/README.md b/cmvr-es/devices/motor/README.md index 46949387..46f4e279 100644 --- a/cmvr-es/devices/motor/README.md +++ b/cmvr-es/devices/motor/README.md @@ -34,14 +34,3 @@ RobotArm 和业务 Task 只依赖 `MotorManager`/`AbstractMotor` 的稳定接口 - 软件 `emergencyStop` 和 Quick Stop 不具备功能安全等级; - 真实设备必须具有经风险评估确定的硬接线急停、安全继电器和驱动器安全链; - 新硬件配置保持 `enable: false`,完成方向、限位和故障注入验证后才能启用。 - -## 测试 - -```bash -cmake --build build --target grpc_motor_service_test -j4 -ctest --test-dir build \ - -R '^grpc_motor_service_test$' \ - --output-on-failure -``` - -该测试使用 fake motor,不替代真实总线、驱动器或安全链验证。 diff --git a/cmvr-es/devices/speaker/ffmpeg_speaker/CMakeLists.txt b/cmvr-es/devices/speaker/ffmpeg_speaker/CMakeLists.txt index c37d546c..7ff77300 100644 --- a/cmvr-es/devices/speaker/ffmpeg_speaker/CMakeLists.txt +++ b/cmvr-es/devices/speaker/ffmpeg_speaker/CMakeLists.txt @@ -7,32 +7,3 @@ add_library(cmvr_es::device::ffmpeg_speaker ALIAS ffmpeg_speaker) target_link_libraries(ffmpeg_speaker PRIVATE -lpulse-simple -lpulse cmvr_es::proto) install(TARGETS ffmpeg_speaker LIBRARY DESTINATION lib) - -if(BUILD_TESTING) - add_executable(ffmpeg_speaker_lifecycle_test - tests/ffmpeg_speaker_lifecycle_test.cpp - ) - target_link_libraries(ffmpeg_speaker_lifecycle_test - PRIVATE - cmvr_es::device::ffmpeg_speaker - avcodec - avformat - avutil - swresample - ) - add_test( - NAME ffmpeg_speaker_lifecycle_test - COMMAND ffmpeg_speaker_lifecycle_test - ) - set(_ffmpeg_speaker_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _ffmpeg_speaker_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(ffmpeg_speaker_lifecycle_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_ffmpeg_speaker_test_environment}" - ) -endif() diff --git a/cmvr-es/devices/speaker/ffmpeg_speaker/tests/ffmpeg_speaker_lifecycle_test.cpp b/cmvr-es/devices/speaker/ffmpeg_speaker/tests/ffmpeg_speaker_lifecycle_test.cpp deleted file mode 100644 index 432a82a6..00000000 --- a/cmvr-es/devices/speaker/ffmpeg_speaker/tests/ffmpeg_speaker_lifecycle_test.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "include/ffmpeg_speaker.h" - -#include - -namespace { - -bool check(const bool condition, const char* expression, const int line) -{ - if (condition) { - return true; - } - std::cerr << "CHECK failed at line " << line << ": " << expression << '\n'; - return false; -} - -#define CHECK_TRUE(expression) \ - do { \ - if (!check(static_cast(expression), #expression, __LINE__)) { \ - return 1; \ - } \ - } while (false) - -} // namespace - -int main() -{ - cmvr::config::FFMpegSpeakerConfig config; - config.set_id("lifecycle-test-speaker"); - cmvr::device::ffmpegSpeaker speaker(config); - cmvr::device::SpeakerState state{}; - - CHECK_TRUE(speaker.init()); - speaker.getState(state); - CHECK_TRUE(state.is_initialized); - - speaker.resetPlayState(); - speaker.getState(state); - CHECK_TRUE(state.is_initialized); - - CHECK_TRUE(speaker.stopPlayback()); - speaker.getState(state); - CHECK_TRUE(state.is_initialized); - - speaker.stopStreaming(); - speaker.getState(state); - CHECK_TRUE(state.is_initialized); - - CHECK_TRUE(speaker.stop()); - speaker.getState(state); - CHECK_TRUE(!state.is_initialized); - - std::cout << "ffmpeg_speaker_lifecycle_test: PASS\n"; - return 0; -} diff --git a/cmvr-es/manager/README.md b/cmvr-es/manager/README.md index 620a6288..95b2cd5c 100644 --- a/cmvr-es/manager/README.md +++ b/cmvr-es/manager/README.md @@ -229,16 +229,6 @@ ring generation 不等于 `TrackDescriptor::generation`,ring 的 `ReadResult.s ## 测试 -MediaSourceManager: - -```bash -cmake --build build --target media_source_manager_test -ctest \ - --test-dir build \ - -R '^media_source_manager_test$' \ - --output-on-failure -``` - DeviceManager 已有 `device_manager_snapshot_test`,覆盖全量状态表、生命周期失败、 异常限长、排序和值快照并发读取。TaskManager 仍缺少独立 CTest。修改其行为时 至少补充: diff --git a/cmvr-es/manager/control_authority_manager/CMakeLists.txt b/cmvr-es/manager/control_authority_manager/CMakeLists.txt index f69da862..115d0698 100644 --- a/cmvr-es/manager/control_authority_manager/CMakeLists.txt +++ b/cmvr-es/manager/control_authority_manager/CMakeLists.txt @@ -12,23 +12,3 @@ add_library( ALIAS control_authority_manager ) install(TARGETS control_authority_manager ARCHIVE DESTINATION lib) - -if(BUILD_TESTING) - add_executable(control_authority_manager_test - tests/control_authority_manager_test.cpp - ) - target_link_libraries(control_authority_manager_test - PRIVATE - cmvr_es::control_authority_manager - gtest - gtest_main - pthread - ) - add_test( - NAME control_authority_manager_test - COMMAND control_authority_manager_test - ) - set_tests_properties(control_authority_manager_test PROPERTIES - TIMEOUT 10 - ) -endif() diff --git a/cmvr-es/manager/control_authority_manager/tests/control_authority_manager_test.cpp b/cmvr-es/manager/control_authority_manager/tests/control_authority_manager_test.cpp deleted file mode 100644 index f0703b7b..00000000 --- a/cmvr-es/manager/control_authority_manager/tests/control_authority_manager_test.cpp +++ /dev/null @@ -1,923 +0,0 @@ -#include "manager/control_authority_manager/include/control_authority_manager.h" - -#include -#include -#include - -#include - -namespace cmvr::control { -namespace { - -using namespace std::chrono_literals; - -class ControlAuthorityManagerTest : public ::testing::Test { -protected: - void SetUp() override - { - ControlAuthorityManager::instance().clear(); - } - - void TearDown() override - { - ControlAuthorityManager::instance().clear(); - } -}; - -TEST_F(ControlAuthorityManagerTest, LeaseIsExclusiveAndExactReleaseRestoresAccess) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto first = - manager.tryAcquire("right_arm", "session-a", 100ms); - ASSERT_TRUE(first.acquired); - EXPECT_TRUE(manager.validate(first.token)); - EXPECT_TRUE(manager.isLeased("right_arm")); - - const auto conflict = - manager.tryAcquire("right_arm", "session-b", 100ms); - EXPECT_FALSE(conflict.acquired); - - manager.release(first.token); - EXPECT_FALSE(manager.isLeased("right_arm")); - EXPECT_TRUE( - manager.tryAcquire("right_arm", "session-b", 100ms) - .acquired); -} - -TEST_F(ControlAuthorityManagerTest, StaleGenerationCannotReleaseNewLease) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto old = - manager.tryAcquire("right_arm", "session-a", 100ms); - ASSERT_TRUE(old.acquired); - manager.release(old.token); - const auto current = - manager.tryAcquire("right_arm", "session-a", 100ms); - ASSERT_TRUE(current.acquired); - ASSERT_NE( - old.token.generation, - current.token.generation); - - manager.release(old.token); - EXPECT_TRUE(manager.validate(current.token)); -} - -TEST_F(ControlAuthorityManagerTest, - SafetyBarrierAtomicallyPreemptsControlAndRejectsOtherOwners) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 100ms); - ASSERT_TRUE(control.acquired); - - const auto barrier = manager.preemptAcquire( - "right_arm", "stop-operation", 100ms); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - EXPECT_FALSE(manager.validate(control.token)); - EXPECT_TRUE(manager.validate(barrier.token)); - - const auto move_during_stop = - manager.tryAcquire("right_arm", "new-move", 100ms); - EXPECT_FALSE(move_during_stop.acquired); - const auto second_stop = manager.preemptAcquire( - "right_arm", "second-stop", 100ms); - ASSERT_TRUE(second_stop.acquired) << second_stop.detail; - - manager.release(control.token); - EXPECT_TRUE(manager.validate(barrier.token)); - manager.release(barrier.token); - EXPECT_TRUE(manager.validate(second_stop.token)); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "new-move", 100ms) - .acquired); - manager.release(second_stop.token); - EXPECT_FALSE(manager.isLeased("right_arm")); -} - -TEST_F(ControlAuthorityManagerTest, - SafetyPreemptionReturnsWhileDispatchIsInFlightAndWaitsForBoth) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - - auto dispatch = manager.tryBeginDispatch(control.token); - ASSERT_TRUE(dispatch.acquired()); - auto pending_barrier = std::async( - std::launch::async, - [&manager]() { - return manager.preemptAcquire( - "right_arm", "stop-operation", 1s); - }); - - const auto preempt_status = pending_barrier.wait_for(100ms); - if (preempt_status != std::future_status::ready) { - dispatch = {}; - const auto cleanup_barrier = pending_barrier.get(); - if (cleanup_barrier.acquired) { - manager.release(cleanup_barrier.token); - } - FAIL() << "safety preemption waited for an in-flight dispatch"; - return; - } - - const auto acquired_barrier = pending_barrier.get(); - ASSERT_TRUE(acquired_barrier.acquired) - << acquired_barrier.detail; - EXPECT_FALSE(manager.validate(control.token)); - EXPECT_FALSE(manager.tryBeginDispatch(control.token).acquired()); - - EXPECT_FALSE(manager.waitForPreemptedRelease( - acquired_barrier.token, 10ms)); - manager.release(control.token); - EXPECT_FALSE(manager.waitForPreemptedRelease( - acquired_barrier.token, 10ms)); - - dispatch = {}; - EXPECT_TRUE(manager.waitForPreemptedRelease( - acquired_barrier.token, 10ms)); - manager.release(acquired_barrier.token); -} - -TEST_F(ControlAuthorityManagerTest, - DispatchOnOneResourceDoesNotDelaySafetyPreemptionOnAnother) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto right_control = - manager.tryAcquire("right_arm", "right-move", 1s); - const auto left_control = - manager.tryAcquire("left_arm", "left-move", 1s); - ASSERT_TRUE(right_control.acquired); - ASSERT_TRUE(left_control.acquired); - - auto right_dispatch = manager.tryBeginDispatch(right_control.token); - ASSERT_TRUE(right_dispatch.acquired()); - auto pending_left_barrier = std::async( - std::launch::async, - [&manager]() { - return manager.preemptAcquire( - "left_arm", "left-stop", 1s); - }); - - const auto preempt_status = pending_left_barrier.wait_for(100ms); - if (preempt_status != std::future_status::ready) { - right_dispatch = {}; - const auto cleanup_barrier = pending_left_barrier.get(); - if (cleanup_barrier.acquired) { - manager.release(cleanup_barrier.token); - } - FAIL() << "one resource's dispatch blocked another resource's stop"; - return; - } - - const auto left_barrier = pending_left_barrier.get(); - ASSERT_TRUE(left_barrier.acquired) << left_barrier.detail; - manager.release(left_control.token); - EXPECT_TRUE(manager.waitForPreemptedRelease( - left_barrier.token, 0ms)); - manager.release(left_barrier.token); - - EXPECT_TRUE(right_dispatch.acquired()); - right_dispatch = {}; - manager.release(right_control.token); -} - -TEST_F(ControlAuthorityManagerTest, - DispatchGuardDestructorReleasesTheInFlightFence) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - - ControlAcquireResult barrier; - { - auto dispatch = manager.tryBeginDispatch(control.token); - ASSERT_TRUE(dispatch.acquired()); - barrier = manager.preemptAcquire( - "right_arm", "stop-operation", 1s); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - manager.release(control.token); - EXPECT_FALSE(manager.waitForPreemptedRelease( - barrier.token, 0ms)); - } - - EXPECT_TRUE(manager.waitForPreemptedRelease(barrier.token, 0ms)); - manager.release(barrier.token); -} - -TEST_F(ControlAuthorityManagerTest, - DispatchGuardMoveAssignmentReleasesOnlyItsPreviousFence) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto right_control = - manager.tryAcquire("right_arm", "right-move", 1s); - const auto left_control = - manager.tryAcquire("left_arm", "left-move", 1s); - ASSERT_TRUE(right_control.acquired); - ASSERT_TRUE(left_control.acquired); - - auto right_dispatch = manager.tryBeginDispatch(right_control.token); - auto left_dispatch = manager.tryBeginDispatch(left_control.token); - ASSERT_TRUE(right_dispatch.acquired()); - ASSERT_TRUE(left_dispatch.acquired()); - const auto right_barrier = manager.preemptAcquire( - "right_arm", "right-stop", 1s); - const auto left_barrier = manager.preemptAcquire( - "left_arm", "left-stop", 1s); - ASSERT_TRUE(right_barrier.acquired) << right_barrier.detail; - ASSERT_TRUE(left_barrier.acquired) << left_barrier.detail; - manager.release(right_control.token); - manager.release(left_control.token); - - right_dispatch = std::move(left_dispatch); - EXPECT_TRUE(right_dispatch.acquired()); - EXPECT_FALSE(left_dispatch.acquired()); - EXPECT_TRUE(manager.waitForPreemptedRelease( - right_barrier.token, 0ms)); - EXPECT_FALSE(manager.waitForPreemptedRelease( - left_barrier.token, 0ms)); - - right_dispatch = {}; - EXPECT_TRUE(manager.waitForPreemptedRelease( - left_barrier.token, 0ms)); - manager.release(right_barrier.token); - manager.release(left_barrier.token); -} - -TEST_F(ControlAuthorityManagerTest, - RevokeKeepsAnInFlightDispatchFencedFromNormalSuccessors) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - auto dispatch = manager.tryBeginDispatch(control.token); - ASSERT_TRUE(dispatch.acquired()); - - manager.revoke("right_arm"); - EXPECT_FALSE(manager.validate(control.token)); - EXPECT_TRUE(manager.isLeased("right_arm")); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "successor", 1s).acquired); - manager.release(control.token); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "successor", 1s).acquired); - - dispatch = {}; - const auto successor = - manager.tryAcquire("right_arm", "successor", 1s); - ASSERT_TRUE(successor.acquired) << successor.detail; - manager.release(successor.token); -} - -TEST_F(ControlAuthorityManagerTest, - ClearKeepsInFlightDispatchesWhileErasingIdleEntries) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto active = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(active.acquired); - ASSERT_TRUE(manager.tryAcquire("idle_arm", "idle-session", 1s).acquired); - auto dispatch = manager.tryBeginDispatch(active.token); - ASSERT_TRUE(dispatch.acquired()); - - manager.clear(); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "successor", 1s).acquired); - const auto idle_successor = - manager.tryAcquire("idle_arm", "idle-successor", 1s); - ASSERT_TRUE(idle_successor.acquired) << idle_successor.detail; - manager.release(idle_successor.token); - - dispatch = {}; - const auto active_successor = - manager.tryAcquire("right_arm", "successor", 1s); - ASSERT_TRUE(active_successor.acquired) << active_successor.detail; - manager.release(active_successor.token); -} - -TEST_F(ControlAuthorityManagerTest, - ExpiredLeaseKeepsInFlightDispatchFencedFromNormalSuccessors) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 10ms); - ASSERT_TRUE(control.acquired); - auto dispatch = manager.tryBeginDispatch(control.token); - ASSERT_TRUE(dispatch.acquired()); - std::this_thread::sleep_for(20ms); - - EXPECT_FALSE(manager.validate(control.token)); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "successor", 1s).acquired); - manager.release(control.token); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "successor", 1s).acquired); - - dispatch = {}; - const auto successor = - manager.tryAcquire("right_arm", "successor", 1s); - ASSERT_TRUE(successor.acquired) << successor.detail; - manager.release(successor.token); -} - -TEST_F(ControlAuthorityManagerTest, - DispatchGuardSurvivesAuthorityMapRehash) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - auto dispatch = manager.tryBeginDispatch(control.token); - ASSERT_TRUE(dispatch.acquired()); - - for (int index = 0; index < 512; ++index) { - ASSERT_TRUE(manager.tryAcquire( - "rehash-resource-" + std::to_string(index), - "rehash-owner", - 1s).acquired); - } - - const auto barrier = manager.preemptAcquire( - "right_arm", "stop-operation", 1s); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - manager.release(control.token); - EXPECT_FALSE(manager.waitForPreemptedRelease(barrier.token, 0ms)); - dispatch = {}; - EXPECT_TRUE(manager.waitForPreemptedRelease(barrier.token, 0ms)); - manager.release(barrier.token); -} - -TEST_F(ControlAuthorityManagerTest, - StaleLeaseCannotBeginDispatchAfterSafetyPreemption) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - const auto barrier = manager.preemptAcquire( - "right_arm", "stop-operation", 1s); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - - EXPECT_FALSE(manager.tryBeginDispatch(control.token).acquired()); - manager.release(barrier.token); -} - -TEST_F(ControlAuthorityManagerTest, - ReleasedLastSafetyBarrierKeepsPreemptedHandlerFenced) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - const auto barrier = manager.preemptAcquire( - "right_arm", "stop-operation", 1s); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - - manager.release(barrier.token); - EXPECT_TRUE(manager.isLeased("right_arm")); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "new-move", 1s).acquired); - - manager.release(control.token); - EXPECT_FALSE(manager.isLeased("right_arm")); - EXPECT_TRUE( - manager.tryAcquire("right_arm", "new-move", 1s).acquired); -} - -TEST_F(ControlAuthorityManagerTest, - SafetyBarrierWaitsForPreemptedNormalLeaseRelease) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - const auto barrier = manager.preemptAcquire( - "right_arm", "stop-operation", 1s); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - - auto wait_result = std::async( - std::launch::async, - [&manager, token = barrier.token]() { - return manager.waitForPreemptedRelease(token, 1s); - }); - EXPECT_EQ( - wait_result.wait_for(30ms), - std::future_status::timeout); - - manager.release(control.token); - EXPECT_TRUE(wait_result.get()); - EXPECT_TRUE(manager.validate(barrier.token)); - manager.release(barrier.token); -} - -TEST_F(ControlAuthorityManagerTest, - ConditionalSafetyBarrierTracksPreemptedNormalLeaseRelease) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - auto dispatch = manager.tryBeginDispatch(control.token); - ASSERT_TRUE(dispatch.acquired()); - const auto barrier = manager.preemptAcquireIfCurrent( - control.token, "timed-out-action", 1s); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - - EXPECT_FALSE( - manager.waitForPreemptedRelease(barrier.token, 10ms)); - dispatch = {}; - EXPECT_FALSE( - manager.waitForPreemptedRelease(barrier.token, 10ms)); - manager.release(control.token); - EXPECT_TRUE( - manager.waitForPreemptedRelease(barrier.token, 10ms)); - manager.release(barrier.token); -} - -TEST_F(ControlAuthorityManagerTest, - ReleasedSafetyHolderStopsWaitingWithoutAffectingOtherHolder) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - const auto first_barrier = manager.preemptAcquire( - "right_arm", "first-stop", 1s); - ASSERT_TRUE(first_barrier.acquired) << first_barrier.detail; - const auto second_barrier = manager.preemptAcquire( - "right_arm", "second-stop", 1s); - ASSERT_TRUE(second_barrier.acquired) << second_barrier.detail; - - auto first_wait = std::async( - std::launch::async, - [&manager, token = first_barrier.token]() { - return manager.waitForPreemptedRelease(token, 1s); - }); - auto second_wait = std::async( - std::launch::async, - [&manager, token = second_barrier.token]() { - return manager.waitForPreemptedRelease(token, 1s); - }); - EXPECT_EQ(first_wait.wait_for(30ms), std::future_status::timeout); - EXPECT_EQ(second_wait.wait_for(30ms), std::future_status::timeout); - - manager.release(first_barrier.token); - EXPECT_FALSE(first_wait.get()); - EXPECT_EQ(second_wait.wait_for(30ms), std::future_status::timeout); - manager.release(control.token); - EXPECT_TRUE(second_wait.get()); - manager.release(second_barrier.token); -} - -TEST_F(ControlAuthorityManagerTest, - PreemptedReleaseRequiresExactNormalLeaseToken) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - const auto barrier = manager.preemptAcquire( - "right_arm", "stop-operation", 1s); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - - auto forged = control.token; - forged.owner_id = "different-owner"; - manager.release(forged); - EXPECT_FALSE( - manager.waitForPreemptedRelease(barrier.token, 10ms)); - - manager.release(control.token); - EXPECT_TRUE( - manager.waitForPreemptedRelease(barrier.token, 0ms)); - manager.release(barrier.token); -} - -TEST_F(ControlAuthorityManagerTest, - ClearWakesPreemptedReleaseWaiterAndInvalidatesSafetyHolder) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - const auto barrier = manager.preemptAcquire( - "right_arm", "stop-operation", 1s); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - - auto wait_result = std::async( - std::launch::async, - [&manager, token = barrier.token]() { - return manager.waitForPreemptedRelease(token, 1s); - }); - EXPECT_EQ( - wait_result.wait_for(30ms), - std::future_status::timeout); - - manager.clear(); - EXPECT_FALSE(wait_result.get()); - manager.release(control.token); -} - -TEST_F(ControlAuthorityManagerTest, - RevokeWakesPreemptedReleaseWaiterAndInvalidatesSafetyHolder) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - const auto barrier = manager.preemptAcquire( - "right_arm", "stop-operation", 1s); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - - auto wait_result = std::async( - std::launch::async, - [&manager, token = barrier.token]() { - return manager.waitForPreemptedRelease(token, 1s); - }); - EXPECT_EQ( - wait_result.wait_for(30ms), - std::future_status::timeout); - - manager.revoke("right_arm"); - EXPECT_FALSE(wait_result.get()); - manager.release(control.token); -} - -TEST_F(ControlAuthorityManagerTest, - ExpiredNormalLeaseStillRequiresHandlerReleaseAfterPreemption) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 10ms); - ASSERT_TRUE(control.acquired); - std::this_thread::sleep_for(20ms); - - const auto barrier = manager.preemptAcquire( - "right_arm", "stop-operation", 1s); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - EXPECT_FALSE( - manager.waitForPreemptedRelease(barrier.token, 10ms)); - - manager.release(control.token); - EXPECT_TRUE( - manager.waitForPreemptedRelease(barrier.token, 0ms)); - manager.release(barrier.token); -} - -TEST_F(ControlAuthorityManagerTest, - QuarantinedFallbackTracksOriginalNormalHandlerRelease) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - ASSERT_TRUE(manager.quarantineIfCurrent(control.token)); - - const auto barrier = manager.preemptAcquire( - "right_arm", "stop-operation", 1s); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - EXPECT_FALSE( - manager.waitForPreemptedRelease(barrier.token, 10ms)); - - manager.release(control.token); - EXPECT_TRUE( - manager.waitForPreemptedRelease(barrier.token, 0ms)); - manager.release(barrier.token); - EXPECT_TRUE(manager.isLeased("right_arm")); - - manager.revoke("right_arm"); -} - -TEST_F(ControlAuthorityManagerTest, - WaitRejectsStaleSafetyTokenForSuccessorEntry) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto old_control = - manager.tryAcquire("right_arm", "old-move", 1s); - ASSERT_TRUE(old_control.acquired); - const auto old_barrier = manager.preemptAcquire( - "right_arm", "old-stop", 1s); - ASSERT_TRUE(old_barrier.acquired) << old_barrier.detail; - manager.release(old_barrier.token); - - EXPECT_FALSE( - manager.tryAcquire("right_arm", "new-move", 1s).acquired); - manager.release(old_control.token); - - const auto successor = - manager.tryAcquire("right_arm", "new-move", 1s); - ASSERT_TRUE(successor.acquired); - const auto current_barrier = manager.preemptAcquire( - "right_arm", "new-stop", 1s); - ASSERT_TRUE(current_barrier.acquired) << current_barrier.detail; - - EXPECT_FALSE(manager.waitForPreemptedRelease( - old_barrier.token, 0ms)); - EXPECT_FALSE(manager.waitForPreemptedRelease( - current_barrier.token, 10ms)); - - manager.release(successor.token); - EXPECT_TRUE(manager.waitForPreemptedRelease( - current_barrier.token, 0ms)); - manager.release(current_barrier.token); -} - -TEST_F(ControlAuthorityManagerTest, - ConditionalSafetyBarrierPreemptsMatchingCurrentLease) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 100ms); - ASSERT_TRUE(control.acquired); - - const auto barrier = manager.preemptAcquireIfCurrent( - control.token, "timed-out-action", 100ms); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - EXPECT_FALSE(manager.validate(control.token)); - EXPECT_TRUE(manager.validate(barrier.token)); - manager.release(control.token); - EXPECT_TRUE(manager.validate(barrier.token)); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "new-move", 100ms) - .acquired); - - manager.release(barrier.token); - EXPECT_FALSE(manager.isLeased("right_arm")); -} - -TEST_F(ControlAuthorityManagerTest, - ConditionalSafetyBarrierDoesNotPreemptSuccessorForStaleToken) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto old = - manager.tryAcquire("right_arm", "move-session", 100ms); - ASSERT_TRUE(old.acquired); - const auto direct_stop = manager.preemptAcquire( - "right_arm", "direct-stop", 100ms); - ASSERT_TRUE(direct_stop.acquired) << direct_stop.detail; - manager.release(direct_stop.token); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "move-session", 100ms).acquired); - manager.release(old.token); - const auto successor = - manager.tryAcquire("right_arm", "move-session", 100ms); - ASSERT_TRUE(successor.acquired); - ASSERT_NE(old.token.generation, successor.token.generation); - - const auto barrier = manager.preemptAcquireIfCurrent( - old.token, "delayed-stop", 100ms); - EXPECT_FALSE(barrier.acquired); - EXPECT_FALSE(barrier.token.valid()); - EXPECT_TRUE(manager.validate(successor.token)); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "competing-move", 100ms) - .acquired); - - manager.release(successor.token); - EXPECT_FALSE(manager.isLeased("right_arm")); -} - -TEST_F(ControlAuthorityManagerTest, - ConditionalSafetyBarrierDoesNotJoinExistingSafetyBarrier) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 100ms); - ASSERT_TRUE(control.acquired); - const auto existing_barrier = manager.preemptAcquire( - "right_arm", "direct-stop", 100ms); - ASSERT_TRUE(existing_barrier.acquired) << existing_barrier.detail; - - const auto delayed_barrier = manager.preemptAcquireIfCurrent( - control.token, "delayed-action-stop", 100ms); - EXPECT_FALSE(delayed_barrier.acquired); - EXPECT_FALSE(delayed_barrier.token.valid()); - EXPECT_TRUE(manager.validate(existing_barrier.token)); - - manager.release(existing_barrier.token); - EXPECT_TRUE(manager.isLeased("right_arm")); - manager.release(control.token); - EXPECT_FALSE(manager.isLeased("right_arm")); - EXPECT_TRUE( - manager.tryAcquire("right_arm", "new-move", 100ms) - .acquired); -} - -TEST_F(ControlAuthorityManagerTest, - QuarantineSurvivesNormalAndTemporarySafetyTokenRelease) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 20ms); - ASSERT_TRUE(control.acquired); - - ASSERT_TRUE(manager.quarantineIfCurrent(control.token)); - EXPECT_FALSE(manager.validate(control.token)); - EXPECT_TRUE(manager.isLeased("right_arm")); - - manager.release(control.token); - std::this_thread::sleep_for(30ms); - EXPECT_TRUE(manager.isLeased("right_arm")); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "new-move", 100ms) - .acquired); - - const auto temporary_stop = manager.preemptAcquire( - "right_arm", "temporary-stop", 100ms); - ASSERT_TRUE(temporary_stop.acquired) << temporary_stop.detail; - EXPECT_TRUE(manager.validate(temporary_stop.token)); - manager.release(temporary_stop.token); - - EXPECT_TRUE(manager.isLeased("right_arm")); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "new-move", 100ms) - .acquired); - - manager.revoke("right_arm"); - EXPECT_FALSE(manager.isLeased("right_arm")); -} - -TEST_F(ControlAuthorityManagerTest, - QuarantineWithStaleTokenDoesNotAffectSuccessor) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto old = - manager.tryAcquire("right_arm", "move-session", 100ms); - ASSERT_TRUE(old.acquired); - manager.release(old.token); - const auto successor = - manager.tryAcquire("right_arm", "move-session", 100ms); - ASSERT_TRUE(successor.acquired); - ASSERT_NE(old.token.generation, successor.token.generation); - - EXPECT_FALSE(manager.quarantineIfCurrent(old.token)); - EXPECT_TRUE(manager.validate(successor.token)); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "competing-move", 100ms) - .acquired); - - manager.release(successor.token); - EXPECT_FALSE(manager.isLeased("right_arm")); -} - -TEST_F(ControlAuthorityManagerTest, - RetiredSafetyHolderStaysFailClosedUntilConfirmedRecovery) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - const auto failed_stop = manager.preemptAcquire( - "right_arm", "failed-stop", 1s); - ASSERT_TRUE(failed_stop.acquired) << failed_stop.detail; - - manager.release(control.token); - ASSERT_TRUE(manager.waitForPreemptedRelease( - failed_stop.token, 0ms)); - ASSERT_TRUE(manager.retireSafetyHolder(failed_stop.token)); - EXPECT_FALSE(manager.validate(failed_stop.token)); - - // A delayed destructor release cannot undo the retained fail-closed state. - manager.release(failed_stop.token); - EXPECT_TRUE(manager.isLeased("right_arm")); - EXPECT_FALSE( - manager.tryAcquire("right_arm", "new-move", 1s).acquired); - - const auto recovery = manager.preemptAcquire( - "right_arm", "confirmed-recovery", 1s); - ASSERT_TRUE(recovery.acquired) << recovery.detail; - ASSERT_TRUE(manager.waitForPreemptedRelease(recovery.token, 0ms)); - ASSERT_TRUE(manager.recoverRetiredSafetyHolders(recovery.token)); - EXPECT_TRUE(manager.validate(recovery.token)); - - manager.release(recovery.token); - EXPECT_FALSE(manager.isLeased("right_arm")); -} - -TEST_F(ControlAuthorityManagerTest, - RecoveryWaitsForPreemptedNormalHandlerToRelease) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - const auto failed_stop = manager.preemptAcquire( - "right_arm", "failed-stop", 1s); - ASSERT_TRUE(failed_stop.acquired) << failed_stop.detail; - ASSERT_TRUE(manager.retireSafetyHolder(failed_stop.token)); - - const auto recovery = manager.preemptAcquire( - "right_arm", "confirmed-recovery", 1s); - ASSERT_TRUE(recovery.acquired) << recovery.detail; - EXPECT_FALSE(manager.recoverRetiredSafetyHolders(recovery.token)); - EXPECT_FALSE(manager.waitForPreemptedRelease(recovery.token, 10ms)); - - manager.release(control.token); - ASSERT_TRUE(manager.waitForPreemptedRelease(recovery.token, 0ms)); - ASSERT_TRUE(manager.recoverRetiredSafetyHolders(recovery.token)); - manager.release(recovery.token); - EXPECT_FALSE(manager.isLeased("right_arm")); -} - -TEST_F(ControlAuthorityManagerTest, - RecoveryPreservesEveryOtherActiveSafetyHolder) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto retired = manager.preemptAcquire( - "right_arm", "failed-stop", 1s); - ASSERT_TRUE(retired.acquired) << retired.detail; - ASSERT_TRUE(manager.retireSafetyHolder(retired.token)); - - const auto independent_stop = manager.preemptAcquire( - "right_arm", "independent-stop", 1s); - const auto recovery = manager.preemptAcquire( - "right_arm", "confirmed-recovery", 1s); - ASSERT_TRUE(independent_stop.acquired) << independent_stop.detail; - ASSERT_TRUE(recovery.acquired) << recovery.detail; - - ASSERT_TRUE(manager.recoverRetiredSafetyHolders(recovery.token)); - EXPECT_TRUE(manager.validate(independent_stop.token)); - EXPECT_TRUE(manager.validate(recovery.token)); - EXPECT_FALSE(manager.validate(retired.token)); - - manager.release(recovery.token); - EXPECT_TRUE(manager.isLeased("right_arm")); - EXPECT_TRUE(manager.validate(independent_stop.token)); - manager.release(independent_stop.token); - EXPECT_FALSE(manager.isLeased("right_arm")); -} - -TEST_F(ControlAuthorityManagerTest, - RetiredOrForgedSafetyTokenCannotAuthorizeRecovery) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto retired = manager.preemptAcquire( - "right_arm", "failed-stop", 1s); - ASSERT_TRUE(retired.acquired) << retired.detail; - ASSERT_TRUE(manager.retireSafetyHolder(retired.token)); - EXPECT_FALSE(manager.recoverRetiredSafetyHolders(retired.token)); - - const auto recovery = manager.preemptAcquire( - "right_arm", "confirmed-recovery", 1s); - ASSERT_TRUE(recovery.acquired) << recovery.detail; - auto forged = recovery.token; - forged.owner_id = "different-owner"; - EXPECT_FALSE(manager.recoverRetiredSafetyHolders(forged)); - EXPECT_TRUE(manager.isLeased("right_arm")); - - ASSERT_TRUE(manager.recoverRetiredSafetyHolders(recovery.token)); - manager.release(recovery.token); - EXPECT_FALSE(manager.isLeased("right_arm")); -} - -TEST_F(ControlAuthorityManagerTest, - ConfirmedRecoveryCanClearTokenlessQuarantine) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto control = - manager.tryAcquire("right_arm", "move-session", 1s); - ASSERT_TRUE(control.acquired); - ASSERT_TRUE(manager.quarantineIfCurrent(control.token)); - - const auto recovery = manager.preemptAcquire( - "right_arm", "confirmed-recovery", 1s); - ASSERT_TRUE(recovery.acquired) << recovery.detail; - EXPECT_FALSE(manager.recoverRetiredSafetyHolders(recovery.token)); - - manager.release(control.token); - ASSERT_TRUE(manager.waitForPreemptedRelease(recovery.token, 0ms)); - ASSERT_TRUE(manager.recoverRetiredSafetyHolders(recovery.token)); - manager.release(recovery.token); - EXPECT_FALSE(manager.isLeased("right_arm")); -} - -TEST_F(ControlAuthorityManagerTest, ExpiryAndRenewUseMonotonicLocalTime) -{ - auto& manager = ControlAuthorityManager::instance(); - const auto lease = - manager.tryAcquire("right_arm", "session-a", 20ms); - ASSERT_TRUE(lease.acquired); - std::this_thread::sleep_for(10ms); - ASSERT_TRUE(manager.renew(lease.token, 30ms)); - std::this_thread::sleep_for(20ms); - EXPECT_TRUE(manager.validate(lease.token)); - std::this_thread::sleep_for(20ms); - EXPECT_FALSE(manager.validate(lease.token)); - EXPECT_FALSE(manager.isLeased("right_arm")); -} - -TEST_F(ControlAuthorityManagerTest, DifferentArmsCanBeLeasedIndependently) -{ - auto& manager = ControlAuthorityManager::instance(); - EXPECT_TRUE( - manager.tryAcquire("right_arm", "session-a", 100ms) - .acquired); - EXPECT_TRUE( - manager.tryAcquire("left_arm", "session-b", 100ms) - .acquired); -} - -} // namespace -} // namespace cmvr::control diff --git a/cmvr-es/manager/device_manager/CMakeLists.txt b/cmvr-es/manager/device_manager/CMakeLists.txt index 5183fced..195be88f 100644 --- a/cmvr-es/manager/device_manager/CMakeLists.txt +++ b/cmvr-es/manager/device_manager/CMakeLists.txt @@ -56,27 +56,4 @@ if(BUILD_TESTING) ) endif() - add_executable(device_manager_lifecycle_test - tests/device_manager_lifecycle_test.cpp - ) - target_link_libraries(device_manager_lifecycle_test PRIVATE - cmvr_es::device_manager - gtest - gtest_main - pthread - ) - add_test( - NAME device_manager_lifecycle_test - COMMAND device_manager_lifecycle_test - ) - set(_device_manager_lifecycle_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}") - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _device_manager_lifecycle_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(device_manager_lifecycle_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_device_manager_lifecycle_test_environment}" - ) endif() diff --git a/cmvr-es/manager/device_manager/tests/device_manager_lifecycle_test.cpp b/cmvr-es/manager/device_manager/tests/device_manager_lifecycle_test.cpp deleted file mode 100644 index 4149a835..00000000 --- a/cmvr-es/manager/device_manager/tests/device_manager_lifecycle_test.cpp +++ /dev/null @@ -1,153 +0,0 @@ -#include "manager/device_manager/include/device_manager.h" - -#include - -#include - -namespace { - -class LifecycleDevice final : public cmvr::device::AbstractDevice { -public: - explicit LifecycleDevice(const std::string& id) - : AbstractDevice(id) - { - } - - cmvr::device::DeviceKind kind() const noexcept override - { - return cmvr::device::DeviceKind::Camera; - } - - std::string typeName() const override { return "LifecycleDevice"; } - - bool start() override - { - ++start_calls; - if (throw_on_start) { - throw std::runtime_error("start failure"); - } - return start_result; - } - - bool stop() override - { - ++stop_calls; - return true; - } - - bool start_result{true}; - bool throw_on_start{false}; - int start_calls{0}; - int stop_calls{0}; -}; - -class DeviceManagerLifecycleTest : public ::testing::Test { -protected: - void SetUp() override - { - cmvr::device::DeviceManager::destroyInstance(); - } - - void TearDown() override - { - cmvr::device::DeviceManager::destroyInstance(); - } -}; - -TEST_F(DeviceManagerLifecycleTest, - EnabledDeviceCreationFailureMarksInitializationFailed) -{ - cmvr::config::DeviceManagerConfig config; - auto* entry = config.add_devices(); - entry->set_id("unsupported"); - entry->set_type( - cmvr::config::DeviceConfigEntry::DEVICE_TYPE_UNKNOWN); - entry->set_enable(true); - - auto& manager = - cmvr::device::DeviceManager::getInstance(config); - EXPECT_FALSE(manager.initialized()); - EXPECT_FALSE(manager.start()); -} - -TEST_F(DeviceManagerLifecycleTest, DisabledInvalidDeviceIsIgnored) -{ - cmvr::config::DeviceManagerConfig config; - auto* entry = config.add_devices(); - entry->set_id("disabled"); - entry->set_type( - cmvr::config::DeviceConfigEntry::DEVICE_TYPE_UNKNOWN); - entry->set_enable(false); - - auto& manager = - cmvr::device::DeviceManager::getInstance(config); - EXPECT_TRUE(manager.initialized()); - EXPECT_TRUE(manager.start()); -} - -TEST_F(DeviceManagerLifecycleTest, - DeviceStartFailureIsReturnedAndTriggersStop) -{ - cmvr::config::DeviceManagerConfig config; - auto& manager = - cmvr::device::DeviceManager::getInstance(config); - ASSERT_TRUE(manager.initialized()); - - auto device = - std::make_shared("start_failure"); - device->start_result = false; - manager.registerDevice(device); - - EXPECT_FALSE(manager.start()); - EXPECT_EQ(device->start_calls, 1); - EXPECT_EQ(device->stop_calls, 1); -} - -TEST_F(DeviceManagerLifecycleTest, - DeviceStartExceptionIsReturnedAndTriggersStop) -{ - cmvr::config::DeviceManagerConfig config; - auto& manager = - cmvr::device::DeviceManager::getInstance(config); - ASSERT_TRUE(manager.initialized()); - - auto device = - std::make_shared("start_exception"); - device->throw_on_start = true; - manager.registerDevice(device); - - EXPECT_FALSE(manager.start()); - EXPECT_EQ(device->start_calls, 1); - EXPECT_EQ(device->stop_calls, 1); -} - -TEST_F(DeviceManagerLifecycleTest, - EnforceSelectedCannotStartWithMissingConfiguredTarget) -{ - cmvr::config::DeviceManagerConfig config; - auto* safety = config.mutable_safety(); - safety->set_mode( - cmvr::config::SafetyManagerConfig::ENFORCE_SELECTED); - safety->add_enforced_device_ids("missing-arm"); - - auto& manager = cmvr::device::DeviceManager::getInstance(config); - ASSERT_TRUE(manager.initialized()); - EXPECT_FALSE(manager.start()); - EXPECT_EQ( - manager.safetyManager().snapshot().system_state, - cmvr::safety::SystemAdmissionState::Starting); -} - -TEST_F(DeviceManagerLifecycleTest, - EnforceSelectedCannotSilentlyCoverNoDevices) -{ - cmvr::config::DeviceManagerConfig config; - config.mutable_safety()->set_mode( - cmvr::config::SafetyManagerConfig::ENFORCE_SELECTED); - - auto& manager = cmvr::device::DeviceManager::getInstance(config); - ASSERT_TRUE(manager.initialized()); - EXPECT_FALSE(manager.start()); -} - -} // namespace diff --git a/cmvr-es/manager/media_source_manager/CMakeLists.txt b/cmvr-es/manager/media_source_manager/CMakeLists.txt index b5369f7c..4d80215a 100644 --- a/cmvr-es/manager/media_source_manager/CMakeLists.txt +++ b/cmvr-es/manager/media_source_manager/CMakeLists.txt @@ -1,7 +1,6 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) cmake_minimum_required(VERSION 3.22) project(cmvr_media_source_manager LANGUAGES CXX) - enable_testing() add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../../service/grpc/stop_all ${CMAKE_CURRENT_BINARY_DIR}/stop_all @@ -43,55 +42,4 @@ if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) ) add_library(cmvr_es::device_media_source_adapter ALIAS device_media_source_adapter) - if(BUILD_TESTING) - add_executable(device_media_source_adapter_test - tests/device_media_source_adapter_test.cpp - ) - target_compile_features(device_media_source_adapter_test PRIVATE cxx_std_17) - target_link_libraries(device_media_source_adapter_test - PRIVATE - cmvr_es::device_media_source_adapter - gtest - gtest_main - ) - add_test( - NAME device_media_source_adapter_test - COMMAND device_media_source_adapter_test - ) - set(_device_media_source_adapter_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}") - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _device_media_source_adapter_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(device_media_source_adapter_test PROPERTIES - ENVIRONMENT - "${_device_media_source_adapter_test_environment}" - ) - endif() -endif() - -option(CMVR_MEDIA_SOURCE_MANAGER_BUILD_TESTS - "Build the standalone MediaSourceManager self-test" - ${PROJECT_IS_TOP_LEVEL}) - -if(CMVR_MEDIA_SOURCE_MANAGER_BUILD_TESTS) - find_package(Threads REQUIRED) - add_executable(media_source_manager_test - tests/media_source_manager_test.cpp - ) - target_compile_features(media_source_manager_test PRIVATE cxx_std_17) - target_link_libraries(media_source_manager_test - PRIVATE - cmvr_es::media_source_manager - Threads::Threads - ) - # This self-test only links the static Hub and pthreads. In the root build, - # the project-wide third-party RUNPATH can otherwise make the loader pick up - # a vendor libstdc++.so (for example from the AUBO SDK), even though the test - # has no dependency on that SDK. - set_target_properties(media_source_manager_test PROPERTIES - SKIP_BUILD_RPATH TRUE - ) - add_test(NAME media_source_manager_test COMMAND media_source_manager_test) endif() diff --git a/cmvr-es/manager/media_source_manager/tests/device_media_source_adapter_test.cpp b/cmvr-es/manager/media_source_manager/tests/device_media_source_adapter_test.cpp deleted file mode 100644 index 0c007166..00000000 --- a/cmvr-es/manager/media_source_manager/tests/device_media_source_adapter_test.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "manager/media_source_manager/include/device_media_source_adapter.h" - -#include -#include -#include -#include - -#include - -#include "manager/safety_manager/include/device_safety_endpoint.h" - -namespace cmvr::media { -namespace { - -class FakeSensorEndpoint final : public safety::DeviceSafetyEndpoint { -public: - explicit FakeSensorEndpoint(std::string device_id) - { - descriptor_.device_id = std::move(device_id); - descriptor_.kind = device::DeviceKind::Camera; - descriptor_.default_policy = safety::SafetyPolicyFamily::Sensor; - descriptor_.maximum_snapshot_age = std::chrono::seconds(1); - descriptor_.supports_active_refresh = true; - } - - safety::DeviceSafetyDescriptor descriptor() const override - { - return descriptor_; - } - - void bindPublisher(safety::SafetySnapshotPublisher publisher) override - { - publisher_ = std::move(publisher); - } - - void requestSafetyRefresh() noexcept override - { - if (!publisher_) { - return; - } - safety::DeviceSafetySnapshot snapshot; - snapshot.device_id = descriptor_.device_id; - snapshot.condition = safety::SafetyCondition::Nominal; - snapshot.device_generation = 1; - snapshot.sample_sequence = ++sequence_; - snapshot.observed_at = safety::SafetyClock::now(); - snapshot.connected = safety::TriState::True; - snapshot.operational_ready = safety::TriState::True; - snapshot.quiescent = safety::TriState::True; - snapshot.motion_active = safety::TriState::False; - snapshot.actuator_enabled = safety::TriState::False; - snapshot.emergency_stop_active = safety::TriState::False; - snapshot.protective_stop_active = safety::TriState::False; - snapshot.fault_active = safety::TriState::False; - (void)publisher_(std::move(snapshot)); - } - - safety::HardwareCheckResult validateBeforeDispatch( - const safety::AdmissionPermit& permit) override - { - ++hardware_checks; - last_intent = permit.intent; - return {true, safety::SafetyReason::None, {}}; - } - - safety::RecoveryCheckResult reconcileAdmissionState( - const safety::RecoveryContext&) override - { - return {true, safety::SafetyReason::None, {}}; - } - - std::atomic hardware_checks{0}; - safety::CommandIntent last_intent{safety::CommandIntent::Observe}; - -private: - safety::DeviceSafetyDescriptor descriptor_; - safety::SafetySnapshotPublisher publisher_; - std::atomic sequence_{0}; -}; - -TEST(DeviceMediaSourceAdapterTest, - SensorStartUsesFinalCheckAndQuarantineRejectsRestart) -{ - safety::SafetyManagerConfig config; - config.enforcement_mode = safety::EnforcementMode::EnforceAll; - safety::SafetyManager coordinator(config); - auto endpoint = std::make_shared("camera"); - ASSERT_TRUE(coordinator.registerDevice( - {endpoint->descriptor(), endpoint, {}})); - endpoint->requestSafetyRefresh(); - coordinator.updateDeviceRuntimeState( - "camera", - device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - - { - auto dispatch = beginMediaSourceStartDispatch(coordinator, "camera"); - ASSERT_TRUE(dispatch.acquired()); - EXPECT_EQ(endpoint->hardware_checks.load(), 1); - EXPECT_EQ(endpoint->last_intent, safety::CommandIntent::StartActivity); - } - - coordinator.quarantineDevice( - "camera", safety::SafetyReason::OutcomeUnknown, - "uncertain-media-start"); - auto rejected = beginMediaSourceStartDispatch(coordinator, "camera"); - EXPECT_FALSE(rejected.acquired()); - EXPECT_EQ(endpoint->hardware_checks.load(), 1); -} - -} // namespace -} // namespace cmvr::media diff --git a/cmvr-es/manager/media_source_manager/tests/media_source_manager_test.cpp b/cmvr-es/manager/media_source_manager/tests/media_source_manager_test.cpp deleted file mode 100644 index a7fd3907..00000000 --- a/cmvr-es/manager/media_source_manager/tests/media_source_manager_test.cpp +++ /dev/null @@ -1,1338 +0,0 @@ -#include "manager/media_source_manager/include/media_source_manager.h" -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace { - -using namespace std::chrono_literals; -using cmvr::media::Codec; -using cmvr::media::MediaFrame; -using cmvr::media::MediaFramePtr; -using cmvr::media::MediaKind; -using cmvr::media::MediaSourceManager; -using cmvr::media::PayloadFormat; -using cmvr::media::Rational; -using cmvr::media::TrackDescriptor; -using cmvr::media::TrackDescriptorPtr; - -static_assert(!std::is_copy_assignable::value, "MediaFrame must be immutable"); -static_assert(!std::is_copy_assignable::value, "TrackDescriptor must be immutable"); -static_assert(std::is_same::value, - "MediaFramePtr must share const frames"); - -int failures = 0; - -#define CHECK_TRUE(expression) \ - do { \ - if (!(expression)) { \ - std::cerr << __FILE__ << ':' << __LINE__ << " check failed: " #expression << '\n'; \ - ++failures; \ - } \ - } while (false) - -TrackDescriptorPtr makeVideoDescriptor( - const Codec codec, - const uint64_t generation, - std::vector codec_config = {}, - std::string track_id = "camera.front.video", - std::string source_id = "camera.front") { - TrackDescriptor::Config config; - config.id = std::move(track_id); - config.source_id = std::move(source_id); - config.kind = MediaKind::VIDEO; - config.codec = codec; - config.payload_format = codec == Codec::UNKNOWN ? PayloadFormat::UNKNOWN : PayloadFormat::ANNEX_B; - config.time_base = Rational{1, 90000}; - config.width = 640; - config.height = 360; - config.nominal_rate = 30; - config.generation = generation; - config.codec_config = std::move(codec_config); - return cmvr::media::makeTrackDescriptor(std::move(config)); -} - -MediaFramePtr makeFrame( - TrackDescriptorPtr descriptor, - const uint64_t sequence, - const uint8_t marker) { - MediaFrame::Config config; - config.descriptor = std::move(descriptor); - config.payload = {marker, static_cast(marker + 1)}; - config.sequence = sequence; - config.pts = static_cast(sequence * 3000); - config.dts = config.pts; - config.duration = 3000; - config.capture_time_ns = sequence * 1000000; - config.capture_utc_ns = 1700000000000000000LL + static_cast(sequence); - config.key_frame = sequence == 0; - return cmvr::media::makeMediaFrame(std::move(config)); -} - -void testMediaMetadataValidation() { - TrackDescriptor::Config invalid; - invalid.id = "invalid.video"; - invalid.source_id = "invalid"; - invalid.kind = MediaKind::VIDEO; - invalid.time_base = Rational{0, 1}; - bool rejected = false; - try { - (void)cmvr::media::makeTrackDescriptor(std::move(invalid)); - } catch (const std::invalid_argument&) { - rejected = true; - } - CHECK_TRUE(rejected); - - const auto frame = makeFrame(makeVideoDescriptor(Codec::H264, 1), 7, 1); - CHECK_TRUE(frame->capture_time_ns == 7000000); - CHECK_TRUE(frame->capture_utc_ns == 1700000000000000007LL); - CHECK_TRUE(frame->duration == 3000); -} - -void testLegacySpmcCompatibility() { - bool ring_zero_capacity_rejected = false; - try { - RingBuffer invalid_ring(0); - } catch (const std::invalid_argument&) { - ring_zero_capacity_rejected = true; - } - CHECK_TRUE(ring_zero_capacity_rejected); - - bool spmc_zero_capacity_rejected = false; - try { - SPMCRingBuffer invalid_ring(0); - } catch (const std::invalid_argument&) { - spmc_zero_capacity_rejected = true; - } - CHECK_TRUE(spmc_zero_capacity_rejected); - - SPMCRingBuffer ring(2); - ring.push(10); - ring.push(20); - CHECK_TRUE(ring.size() == 2); - CHECK_TRUE(ring.getHead() == 2); - CHECK_TRUE(ring.getTail() == 0); - CHECK_TRUE(ring.getLast().has_value() && *ring.getLast() == 20); - - size_t reader = 0; - CHECK_TRUE(ring.pop(reader).has_value()); - ring.push(30); - ring.push(40); - CHECK_TRUE(!ring.pop(reader).has_value()); - CHECK_TRUE(reader == ring.getTail()); - CHECK_TRUE(ring.pop(reader).has_value()); - - ring.clear(); - CHECK_TRUE(ring.empty()); - CHECK_TRUE(ring.getHead() == 4); - ring.push(50); - CHECK_TRUE(!ring.pop(reader).has_value()); - const auto after_clear = ring.pop(reader); - CHECK_TRUE(after_clear.has_value() && *after_clear == 50); -} - -void testBroadcastFrameRing() { - using Ring = BroadcastFrameRing; - Ring ring(2); - const auto descriptor = makeVideoDescriptor(Codec::H264, 1, {1, 2, 3}); - auto cursor = ring.makeCursor(Ring::StartPosition::OLDEST_AVAILABLE); - - CHECK_TRUE(ring.publish(makeFrame(descriptor, 0, 10)).value() == 0); - CHECK_TRUE(ring.publish(makeFrame(descriptor, 1, 20)).value() == 1); - CHECK_TRUE(ring.publish(makeFrame(descriptor, 2, 30)).value() == 2); - - const auto first = ring.tryRead(cursor); - CHECK_TRUE(first.has_value()); - CHECK_TRUE(first->sequence == 1); - CHECK_TRUE(first->value->sequence == 1); - CHECK_TRUE(first->dropped_count == 1); - CHECK_TRUE(first->dropped_since_last_read == 1); - CHECK_TRUE(ring.stats().dropped_count == 1); - - const auto second = ring.tryRead(cursor); - CHECK_TRUE(second.has_value() && second->sequence == 2); - CHECK_TRUE(second->dropped_since_last_read == 0); - - auto waiting_cursor = ring.makeCursor(Ring::StartPosition::NEXT_PUBLISHED); - auto waiting_read = std::async(std::launch::async, [&ring, &waiting_cursor] { - return ring.waitRead(waiting_cursor, 1s); - }); - std::this_thread::sleep_for(10ms); - ring.publish(makeFrame(descriptor, 3, 40)); - CHECK_TRUE(waiting_read.wait_for(500ms) == std::future_status::ready); - CHECK_TRUE(waiting_read.get().has_value()); - - const uint64_t next_generation = ring.reset(); - CHECK_TRUE(next_generation == 2); - ring.publish(makeFrame(descriptor, 4, 50)); - const auto after_reset = ring.tryRead(cursor); - CHECK_TRUE(after_reset.has_value()); - CHECK_TRUE(after_reset->generation == 2); - CHECK_TRUE(after_reset->sequence == 0); - CHECK_TRUE(after_reset->generation_changed); - - auto close_cursor = ring.makeCursor(Ring::StartPosition::NEXT_PUBLISHED); - auto close_wait = std::async(std::launch::async, [&ring, &close_cursor] { - return ring.waitRead(close_cursor, 2s); - }); - ring.close(); - CHECK_TRUE(close_wait.wait_for(500ms) == std::future_status::ready); - CHECK_TRUE(!close_wait.get().has_value()); - CHECK_TRUE(!ring.publish(makeFrame(descriptor, 5, 60)).has_value()); -} - -void testBroadcastDiscardPending() { - using Ring = BroadcastFrameRing; - const auto descriptor = makeVideoDescriptor(Codec::H264, 1, {1, 2, 3}); - - { - Ring ring(8); - auto cursor = ring.makeCursor(Ring::StartPosition::OLDEST_AVAILABLE); - ring.publish(makeFrame(descriptor, 0, 10)); - ring.publish(makeFrame(descriptor, 1, 20)); - - CHECK_TRUE(ring.discardPendingIfExceeds(cursor, 2) == 0); - const auto first = ring.tryRead(cursor); - CHECK_TRUE(first.has_value()); - CHECK_TRUE(first->sequence == 0); - CHECK_TRUE(first->dropped_since_last_read == 0); - } - - { - Ring ring(8); - auto cursor = ring.makeCursor(Ring::StartPosition::OLDEST_AVAILABLE); - ring.publish(makeFrame(descriptor, 0, 10)); - ring.publish(makeFrame(descriptor, 1, 20)); - ring.publish(makeFrame(descriptor, 2, 30)); - - CHECK_TRUE(ring.discardPendingIfExceeds(cursor, 2) == 3); - CHECK_TRUE(!ring.tryRead(cursor).has_value()); - - ring.publish(makeFrame(descriptor, 3, 40)); - const auto after_discard = ring.tryRead(cursor); - CHECK_TRUE(after_discard.has_value()); - CHECK_TRUE(after_discard->sequence == 3); - CHECK_TRUE(after_discard->dropped_count == 3); - CHECK_TRUE(after_discard->dropped_since_last_read == 3); - } - - { - // Two frames are overwritten before the explicit three-frame discard. - // Both kinds of loss must be reported by the next successful read. - Ring ring(3); - auto cursor = ring.makeCursor(Ring::StartPosition::OLDEST_AVAILABLE); - for (uint64_t sequence = 0; sequence < 5; ++sequence) { - ring.publish(makeFrame( - descriptor, - sequence, - static_cast(sequence))); - } - - CHECK_TRUE(ring.discardPendingIfExceeds(cursor, 2) == 3); - CHECK_TRUE(cursor.dropped_count == 5); - ring.publish(makeFrame(descriptor, 5, 50)); - const auto after_overwrite_and_discard = ring.tryRead(cursor); - CHECK_TRUE(after_overwrite_and_discard.has_value()); - CHECK_TRUE(after_overwrite_and_discard->sequence == 5); - CHECK_TRUE(after_overwrite_and_discard->dropped_count == 5); - CHECK_TRUE(after_overwrite_and_discard->dropped_since_last_read == 5); - } - - { - // An old-generation OLDEST_AVAILABLE cursor adopts the reset generation - // before deciding whether that generation's pending frames are excessive. - Ring ring(4); - auto cursor = ring.makeCursor(Ring::StartPosition::OLDEST_AVAILABLE); - ring.publish(makeFrame(descriptor, 0, 10)); - ring.reset(); - ring.publish(makeFrame(descriptor, 1, 20)); - ring.publish(makeFrame(descriptor, 2, 30)); - - CHECK_TRUE(ring.discardPendingIfExceeds(cursor, 1) == 2); - ring.publish(makeFrame(descriptor, 3, 40)); - const auto after_reset = ring.tryRead(cursor); - CHECK_TRUE(after_reset.has_value()); - CHECK_TRUE(after_reset->generation == 2); - CHECK_TRUE(after_reset->sequence == 2); - CHECK_TRUE(after_reset->generation_changed); - CHECK_TRUE(after_reset->dropped_since_last_read == 2); - } -} - -void testBroadcastDiscardConcurrentPublish() { - using Ring = BroadcastFrameRing; - constexpr uint64_t frame_count = 4000; - Ring ring(64); - auto cursor = ring.makeCursor(Ring::StartPosition::NEXT_PUBLISHED); - std::atomic start{false}; - std::atomic publisher_done{false}; - - std::thread publisher([&] { - while (!start.load(std::memory_order_acquire)) { - std::this_thread::yield(); - } - for (uint64_t sequence = 0; sequence < frame_count; ++sequence) { - ring.publish(std::make_shared(static_cast(sequence))); - if ((sequence & 7U) == 0U) { - std::this_thread::yield(); - } - } - publisher_done.store(true, std::memory_order_release); - }); - - uint64_t read_count = 0; - uint64_t actively_discarded = 0; - start.store(true, std::memory_order_release); - while (true) { - actively_discarded += ring.discardPendingIfExceeds(cursor, 8); - if (ring.tryRead(cursor)) { - ++read_count; - continue; - } - if (publisher_done.load(std::memory_order_acquire)) { - actively_discarded += ring.discardPendingIfExceeds(cursor, 8); - if (ring.tryRead(cursor)) { - ++read_count; - continue; - } - break; - } - std::this_thread::yield(); - } - publisher.join(); - - CHECK_TRUE(read_count + cursor.dropped_count == frame_count); - CHECK_TRUE(actively_discarded <= cursor.dropped_count); -} - -void testBroadcastConcurrency() { - using Ring = BroadcastFrameRing; - constexpr uint64_t frame_count = 500; - Ring ring(frame_count); - const auto descriptor = makeVideoDescriptor(Codec::H264, 1, {1, 2, 3}); - auto first_cursor = ring.makeCursor(Ring::StartPosition::OLDEST_AVAILABLE); - auto second_cursor = ring.makeCursor(Ring::StartPosition::OLDEST_AVAILABLE); - - auto consume = [&ring](Ring::Cursor& cursor) { - uint64_t expected = 0; - while (expected < frame_count) { - const auto result = ring.waitRead(cursor, 1s); - if (!result || result->sequence != expected || result->value->sequence != expected) { - return false; - } - ++expected; - } - return cursor.dropped_count == 0; - }; - - auto first_consumer = std::async(std::launch::async, consume, std::ref(first_cursor)); - auto second_consumer = std::async(std::launch::async, consume, std::ref(second_cursor)); - std::thread producer([&ring, &descriptor] { - for (uint64_t sequence = 0; sequence < frame_count; ++sequence) { - ring.publish(makeFrame(descriptor, sequence, static_cast(sequence))); - } - }); - - producer.join(); - CHECK_TRUE(first_consumer.get()); - CHECK_TRUE(second_consumer.get()); -} - -void testHubLifecycleAndDescriptorRefresh() { - MediaSourceManager hub; - const auto initial_descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1); - std::atomic start_count{0}; - std::atomic stop_count{0}; - std::atomic key_frame_requests{0}; - std::mutex sink_mutex; - MediaSourceManager::FrameSink sink; - - MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = [&](const MediaSourceManager::FrameSink& callback_sink, - const MediaSourceManager::CancelPredicate&) { - { - std::lock_guard lock(sink_mutex); - sink = callback_sink; - } - ++start_count; - return true; - }; - callbacks.stop = [&] { - ++stop_count; - std::lock_guard lock(sink_mutex); - sink = {}; - }; - callbacks.request_key_frame = [&] { - ++key_frame_requests; - return true; - }; - - CHECK_TRUE(hub.registerSource(initial_descriptor, callbacks, 4)); - CHECK_TRUE(!hub.registerSource(initial_descriptor, callbacks, 4)); - CHECK_TRUE(hub.hasSource(initial_descriptor->id)); - CHECK_TRUE(hub.listTracks().size() == 1); - - auto first = hub.subscribe(initial_descriptor->id); - auto second = hub.subscribe(initial_descriptor->id); - CHECK_TRUE(first.valid() && second.valid()); - CHECK_TRUE(hub.requestKeyFrame(initial_descriptor->id)); - CHECK_TRUE(key_frame_requests == 1); - CHECK_TRUE(start_count == 1); - CHECK_TRUE(hub.subscriberCount(initial_descriptor->id) == 2); - CHECK_TRUE(first.descriptor()->codec == Codec::UNKNOWN); - CHECK_TRUE(!hub.unregisterSource(initial_descriptor->id)); - - // Content changes at the same generation must atomically replace the initial descriptor. - const auto actual_descriptor = makeVideoDescriptor(Codec::H264, 1, {0, 0, 0, 1, 0x67}); - MediaSourceManager::FrameSink producer; - { - std::lock_guard lock(sink_mutex); - producer = sink; - } - CHECK_TRUE(static_cast(producer)); - const auto shared_frame = makeFrame(actual_descriptor, 0, 70); - producer(shared_frame); - - const auto first_read = first.waitRead(500ms); - const auto second_read = second.waitRead(500ms); - CHECK_TRUE(first_read.has_value() && first_read->value == shared_frame); - CHECK_TRUE(second_read.has_value() && second_read->value == shared_frame); - CHECK_TRUE(first.descriptor() == actual_descriptor); - CHECK_TRUE(second.descriptor()->codec_config == actual_descriptor->codec_config); - - first.reset(); - CHECK_TRUE(stop_count == 0); - CHECK_TRUE(hub.subscriberCount(initial_descriptor->id) == 1); - second.reset(); - CHECK_TRUE(stop_count == 1); - CHECK_TRUE(!hub.requestKeyFrame(initial_descriptor->id)); - CHECK_TRUE(hub.subscriberCount(initial_descriptor->id) == 0); - - { - auto restarted = hub.subscribe(initial_descriptor->id); - CHECK_TRUE(restarted.valid()); - CHECK_TRUE(start_count == 2); - } - CHECK_TRUE(stop_count == 2); - CHECK_TRUE(hub.unregisterSource(initial_descriptor->id)); - CHECK_TRUE(!hub.hasSource(initial_descriptor->id)); -} - -void testSubscriptionDiscardPending() { - MediaSourceManager hub; - const auto descriptor = makeVideoDescriptor(Codec::H264, 1); - std::mutex sink_mutex; - MediaSourceManager::FrameSink sink; - - MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = [&](const MediaSourceManager::FrameSink& callback_sink, - const MediaSourceManager::CancelPredicate&) { - std::lock_guard lock(sink_mutex); - sink = callback_sink; - return true; - }; - callbacks.stop = [&] { - std::lock_guard lock(sink_mutex); - sink = {}; - }; - - CHECK_TRUE(hub.registerSource(descriptor, std::move(callbacks), 8)); - auto subscription = hub.subscribe(descriptor->id); - CHECK_TRUE(subscription.valid()); - - MediaSourceManager::FrameSink producer; - { - std::lock_guard lock(sink_mutex); - producer = sink; - } - CHECK_TRUE(static_cast(producer)); - producer(makeFrame(descriptor, 0, 10)); - producer(makeFrame(descriptor, 1, 20)); - producer(makeFrame(descriptor, 2, 30)); - - CHECK_TRUE(subscription.discardPendingIfExceeds(2) == 3); - CHECK_TRUE(!subscription.tryRead().has_value()); - producer(makeFrame(descriptor, 3, 40)); - const auto next = subscription.tryRead(); - CHECK_TRUE(next.has_value()); - CHECK_TRUE(next->value->sequence == 3); - CHECK_TRUE(next->dropped_since_last_read == 3); - CHECK_TRUE(subscription.droppedCount() == 3); -} - -void testHubFailedStartAndShutdown() { - MediaSourceManager hub; - const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1); - std::atomic start_attempts{0}; - std::atomic retry_stop_count{0}; - MediaSourceManager::SourceCallbacks failed_callbacks; - failed_callbacks.start = [&](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - return ++start_attempts >= 2; - }; - failed_callbacks.stop = [&] { ++retry_stop_count; }; - CHECK_TRUE(hub.registerSource(descriptor, std::move(failed_callbacks), 2)); - auto failed = hub.subscribe(descriptor->id); - CHECK_TRUE(!failed.valid()); - auto retry = hub.subscribe(descriptor->id); - CHECK_TRUE(retry.valid()); - retry.reset(); - CHECK_TRUE(start_attempts == 2); - CHECK_TRUE(retry_stop_count == 1); - CHECK_TRUE(hub.unregisterSource(descriptor->id)); - - std::atomic stop_count{0}; - MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = [](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - return true; - }; - callbacks.stop = [&] { ++stop_count; }; - CHECK_TRUE(hub.registerSource(descriptor, std::move(callbacks), 2)); - auto live = hub.subscribe(descriptor->id); - CHECK_TRUE(live.valid()); - hub.shutdown(); - CHECK_TRUE(stop_count == 1); - CHECK_TRUE(!live.valid()); - CHECK_TRUE(!live.waitRead(50ms).has_value()); -} - -void testHubStopAllSourcesAllowsReregistration() { - MediaSourceManager hub; - const auto first_descriptor = makeVideoDescriptor(Codec::H264, 1); - std::atomic first_stop_count{0}; - - MediaSourceManager::SourceCallbacks first_callbacks; - first_callbacks.start = [](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - return true; - }; - first_callbacks.stop = [&] { ++first_stop_count; }; - CHECK_TRUE(hub.registerSource(first_descriptor, std::move(first_callbacks), 2)); - auto old_subscription = hub.subscribe(first_descriptor->id); - CHECK_TRUE(old_subscription.valid()); - - auto blocked_read = std::async(std::launch::async, [&] { - return old_subscription.waitRead(2s); - }); - CHECK_TRUE(hub.stopAllSources()); - - CHECK_TRUE(first_stop_count.load(std::memory_order_acquire) == 1); - CHECK_TRUE(!hub.hasSource(first_descriptor->id)); - CHECK_TRUE(!old_subscription.valid()); - CHECK_TRUE(blocked_read.wait_for(500ms) == std::future_status::ready); - if (blocked_read.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(!blocked_read.get().has_value()); - } - - const auto second_descriptor = makeVideoDescriptor(Codec::H264, 2); - std::atomic second_start_count{0}; - std::atomic second_stop_count{0}; - MediaSourceManager::SourceCallbacks second_callbacks; - second_callbacks.start = [&](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - ++second_start_count; - return true; - }; - second_callbacks.stop = [&] { ++second_stop_count; }; - - CHECK_TRUE(hub.registerSource(second_descriptor, std::move(second_callbacks), 2)); - auto new_subscription = hub.subscribe(second_descriptor->id); - CHECK_TRUE(new_subscription.valid()); - CHECK_TRUE(new_subscription.descriptor()->generation == 2); - CHECK_TRUE(second_start_count.load(std::memory_order_acquire) == 1); - - old_subscription.reset(); - CHECK_TRUE(second_stop_count.load(std::memory_order_acquire) == 0); - new_subscription.reset(); - CHECK_TRUE(second_stop_count.load(std::memory_order_acquire) == 1); -} - -void testStopAllSourcesReportsAndRetriesUnconfirmedStop() { - MediaSourceManager hub; - const auto descriptor = makeVideoDescriptor(Codec::H264, 1); - std::atomic stop_attempts{0}; - - MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = [](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - return true; - }; - callbacks.stop_confirmed = [&] { - return ++stop_attempts >= 2; - }; - CHECK_TRUE(hub.registerSource(descriptor, std::move(callbacks), 2)); - auto subscription = hub.subscribe(descriptor->id); - CHECK_TRUE(subscription.valid()); - - std::vector stop_failures; - CHECK_TRUE(!hub.stopAllSources(&stop_failures)); - CHECK_TRUE(stop_failures.size() == 1); - CHECK_TRUE(stop_failures.front() == descriptor->id); - CHECK_TRUE(hub.hasSource(descriptor->id)); - CHECK_TRUE(!subscription.valid()); - - stop_failures.clear(); - CHECK_TRUE(hub.stopAllSources(&stop_failures)); - CHECK_TRUE(stop_failures.empty()); - CHECK_TRUE(!hub.hasSource(descriptor->id)); - CHECK_TRUE(stop_attempts.load(std::memory_order_acquire) == 2); -} - -void testStopSourcesForDeviceIsSelectiveAndRetriesFailures() { - MediaSourceManager hub; - const auto front_video = makeVideoDescriptor( - Codec::H264, 1, {}, "front.video", "camera.front"); - const auto front_depth = makeVideoDescriptor( - Codec::H264, 1, {}, "front.depth", "camera.front"); - const auto rear_video = makeVideoDescriptor( - Codec::H264, 1, {}, "rear.video", "camera.rear"); - - std::atomic front_video_stops{0}; - std::atomic front_depth_stops{0}; - std::atomic rear_stops{0}; - auto register_source = [&]( - const TrackDescriptorPtr& descriptor, - std::function stop_confirmed) { - MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = []( - const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { return true; }; - callbacks.stop_confirmed = std::move(stop_confirmed); - return hub.registerSource(descriptor, std::move(callbacks), 2); - }; - - CHECK_TRUE(register_source(front_video, [&] { - return ++front_video_stops >= 2; - })); - CHECK_TRUE(register_source(front_depth, [&] { - ++front_depth_stops; - return true; - })); - CHECK_TRUE(register_source(rear_video, [&] { - ++rear_stops; - return true; - })); - CHECK_TRUE( - hub.trackedSourceIds() == - (std::vector{"camera.front", "camera.rear"})); - - auto front_video_subscription = hub.subscribe(front_video->id); - auto front_depth_subscription = hub.subscribe(front_depth->id); - auto rear_subscription = hub.subscribe(rear_video->id); - CHECK_TRUE(front_video_subscription.valid()); - CHECK_TRUE(front_depth_subscription.valid()); - CHECK_TRUE(rear_subscription.valid()); - - std::vector stop_failures; - CHECK_TRUE(!hub.stopSourcesForDevice("camera.front", &stop_failures)); - CHECK_TRUE(stop_failures.size() == 1U); - CHECK_TRUE(stop_failures.front() == front_video->id); - CHECK_TRUE(hub.hasSource(front_video->id)); - CHECK_TRUE(!hub.hasSource(front_depth->id)); - CHECK_TRUE(hub.hasSource(rear_video->id)); - CHECK_TRUE( - hub.trackedSourceIds() == - (std::vector{"camera.front", "camera.rear"})); - CHECK_TRUE(!front_video_subscription.valid()); - CHECK_TRUE(!front_depth_subscription.valid()); - CHECK_TRUE(rear_subscription.valid()); - CHECK_TRUE(rear_stops.load(std::memory_order_acquire) == 0); - - CHECK_TRUE(hub.stopSourcesForDevice("camera.front", &stop_failures)); - CHECK_TRUE(stop_failures.empty()); - CHECK_TRUE(!hub.hasSource(front_video->id)); - CHECK_TRUE(hub.hasSource(rear_video->id)); - CHECK_TRUE( - hub.trackedSourceIds() == - (std::vector{"camera.rear"})); - CHECK_TRUE(front_video_stops.load(std::memory_order_acquire) == 2); - CHECK_TRUE(front_depth_stops.load(std::memory_order_acquire) == 1); - CHECK_TRUE(rear_stops.load(std::memory_order_acquire) == 0); - - rear_subscription.reset(); - CHECK_TRUE(rear_stops.load(std::memory_order_acquire) == 1); -} - -void testDeviceStopsRunConcurrentlyAndSerializeMatchingRegistration() { - MediaSourceManager hub; - const auto first = makeVideoDescriptor( - Codec::H264, 1, {}, "first.video", "camera.first"); - const auto second = makeVideoDescriptor( - Codec::H264, 1, {}, "second.video", "camera.second"); - - std::atomic first_stop_entered{false}; - std::atomic second_stop_entered{false}; - std::atomic release_stops{false}; - auto register_blocking_source = [&]( - const TrackDescriptorPtr& descriptor, - std::atomic& entered) { - MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = []( - const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { return true; }; - callbacks.stop = [&entered, &release_stops] { - entered.store(true, std::memory_order_release); - while (!release_stops.load(std::memory_order_acquire)) { - std::this_thread::sleep_for(1ms); - } - }; - return hub.registerSource(descriptor, std::move(callbacks), 2); - }; - - CHECK_TRUE(register_blocking_source(first, first_stop_entered)); - CHECK_TRUE(register_blocking_source(second, second_stop_entered)); - auto first_subscription = hub.subscribe(first->id); - auto second_subscription = hub.subscribe(second->id); - CHECK_TRUE(first_subscription.valid()); - CHECK_TRUE(second_subscription.valid()); - - auto first_stop = std::async(std::launch::async, [&] { - return hub.stopSourcesForDevice(first->source_id); - }); - const auto first_deadline = std::chrono::steady_clock::now() + 500ms; - while (!first_stop_entered.load(std::memory_order_acquire) && - std::chrono::steady_clock::now() < first_deadline) { - std::this_thread::sleep_for(1ms); - } - CHECK_TRUE(first_stop_entered.load(std::memory_order_acquire)); - CHECK_TRUE( - hub.trackedSourceIds() == - (std::vector{"camera.first", "camera.second"})); - - auto second_stop = std::async(std::launch::async, [&] { - return hub.stopSourcesForDevice(second->source_id); - }); - const auto second_deadline = std::chrono::steady_clock::now() + 500ms; - while (!second_stop_entered.load(std::memory_order_acquire) && - std::chrono::steady_clock::now() < second_deadline) { - std::this_thread::sleep_for(1ms); - } - CHECK_TRUE(second_stop_entered.load(std::memory_order_acquire)); - - MediaSourceManager::SourceCallbacks replacement_callbacks; - replacement_callbacks.start = []( - const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { return true; }; - replacement_callbacks.stop = [] {}; - auto matching_registration = std::async(std::launch::async, [&] { - return hub.registerSource( - makeVideoDescriptor( - Codec::H264, - 2, - {}, - "first.replacement", - "camera.first"), - std::move(replacement_callbacks), - 2); - }); - CHECK_TRUE( - matching_registration.wait_for(20ms) == std::future_status::timeout); - - release_stops.store(true, std::memory_order_release); - CHECK_TRUE(first_stop.wait_for(500ms) == std::future_status::ready); - CHECK_TRUE(second_stop.wait_for(500ms) == std::future_status::ready); - if (first_stop.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(first_stop.get()); - } - if (second_stop.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(second_stop.get()); - } - CHECK_TRUE( - matching_registration.wait_for(500ms) == std::future_status::ready); - if (matching_registration.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(matching_registration.get()); - } - CHECK_TRUE(hub.hasSource("first.replacement")); - CHECK_TRUE( - hub.trackedSourceIds() == - (std::vector{"camera.first"})); -} - -void testStopAllWaitsForDeviceStopAndRetainsItsConcurrentRegistrationRule() { - MediaSourceManager hub; - const auto first = makeVideoDescriptor( - Codec::H264, 1, {}, "first.video", "camera.first"); - const auto other = makeVideoDescriptor( - Codec::H264, 1, {}, "other.video", "camera.other"); - std::atomic first_stop_entered{false}; - std::atomic release_first_stop{false}; - std::atomic other_stops{0}; - - MediaSourceManager::SourceCallbacks first_callbacks; - first_callbacks.start = []( - const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { return true; }; - first_callbacks.stop = [&] { - first_stop_entered.store(true, std::memory_order_release); - while (!release_first_stop.load(std::memory_order_acquire)) { - std::this_thread::sleep_for(1ms); - } - }; - CHECK_TRUE(hub.registerSource(first, std::move(first_callbacks), 2)); - auto first_subscription = hub.subscribe(first->id); - CHECK_TRUE(first_subscription.valid()); - - auto device_stop = std::async(std::launch::async, [&] { - return hub.stopSourcesForDevice(first->source_id); - }); - const auto stop_deadline = std::chrono::steady_clock::now() + 500ms; - while (!first_stop_entered.load(std::memory_order_acquire) && - std::chrono::steady_clock::now() < stop_deadline) { - std::this_thread::sleep_for(1ms); - } - CHECK_TRUE(first_stop_entered.load(std::memory_order_acquire)); - - auto stop_all = std::async(std::launch::async, [&] { - return hub.stopAllSources(); - }); - CHECK_TRUE(stop_all.wait_for(20ms) == std::future_status::timeout); - - MediaSourceManager::SourceCallbacks other_callbacks; - other_callbacks.start = []( - const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { return true; }; - other_callbacks.stop = [&] { ++other_stops; }; - CHECK_TRUE(hub.registerSource(other, std::move(other_callbacks), 2)); - auto other_subscription = hub.subscribe(other->id); - CHECK_TRUE(other_subscription.valid()); - - release_first_stop.store(true, std::memory_order_release); - CHECK_TRUE(device_stop.wait_for(500ms) == std::future_status::ready); - if (device_stop.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(device_stop.get()); - } - CHECK_TRUE(stop_all.wait_for(500ms) == std::future_status::ready); - if (stop_all.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(stop_all.get()); - } - CHECK_TRUE(!hub.hasSource(first->id)); - CHECK_TRUE(!hub.hasSource(other->id)); - CHECK_TRUE(hub.trackedSourceIds().empty()); - CHECK_TRUE(!other_subscription.valid()); - CHECK_TRUE(other_stops.load(std::memory_order_acquire) == 1); -} - -void testConcurrentRegistrationWaitsForStopAllSources() { - MediaSourceManager hub; - const auto descriptor = makeVideoDescriptor(Codec::H264, 1); - std::atomic stop_entered{false}; - std::atomic release_stop{false}; - std::atomic old_stop_count{0}; - - MediaSourceManager::SourceCallbacks old_callbacks; - old_callbacks.start = [](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - return true; - }; - old_callbacks.stop = [&] { - stop_entered.store(true, std::memory_order_release); - while (!release_stop.load(std::memory_order_acquire)) { - std::this_thread::sleep_for(1ms); - } - ++old_stop_count; - }; - CHECK_TRUE(hub.registerSource(descriptor, std::move(old_callbacks), 2)); - auto old_subscription = hub.subscribe(descriptor->id); - CHECK_TRUE(old_subscription.valid()); - - auto stop_all = std::async( - std::launch::async, [&] { return hub.stopAllSources(); }); - const auto stop_deadline = std::chrono::steady_clock::now() + 500ms; - while (!stop_entered.load(std::memory_order_acquire) && - std::chrono::steady_clock::now() < stop_deadline) { - std::this_thread::sleep_for(1ms); - } - CHECK_TRUE(stop_entered.load(std::memory_order_acquire)); - - std::atomic new_start_count{0}; - MediaSourceManager::SourceCallbacks new_callbacks; - new_callbacks.start = [&](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - ++new_start_count; - return true; - }; - new_callbacks.stop = [] {}; - auto registration = std::async(std::launch::async, [&] { - return hub.registerSource( - makeVideoDescriptor(Codec::H264, 2), std::move(new_callbacks), 2); - }); - - CHECK_TRUE(registration.wait_for(20ms) == std::future_status::timeout); - release_stop.store(true, std::memory_order_release); - CHECK_TRUE(stop_all.wait_for(500ms) == std::future_status::ready); - if (stop_all.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(stop_all.get()); - } - CHECK_TRUE(registration.wait_for(500ms) == std::future_status::ready); - const bool registered = registration.wait_for(0ms) == std::future_status::ready && - registration.get(); - CHECK_TRUE(registered); - CHECK_TRUE(old_stop_count.load(std::memory_order_acquire) == 1); - CHECK_TRUE(hub.hasSource(descriptor->id)); - - auto new_subscription = hub.subscribe(descriptor->id); - CHECK_TRUE(new_subscription.valid()); - CHECK_TRUE(new_subscription.descriptor()->generation == 2); - CHECK_TRUE(new_start_count.load(std::memory_order_acquire) == 1); -} - -void testSystemStopAllAdmissionFencesRegistrationAndStartup() { - cmvr::service::StopAllAdmissionGate admission_gate; - MediaSourceManager hub(&admission_gate); - const auto dormant = makeVideoDescriptor( - Codec::H264, 1, {}, "dormant.video", "camera.dormant"); - const auto new_source = makeVideoDescriptor( - Codec::H264, 1, {}, "new.video", "camera.new"); - std::atomic dormant_starts{0}; - std::atomic new_starts{0}; - - MediaSourceManager::SourceCallbacks dormant_callbacks; - dormant_callbacks.start = [&]( - const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - ++dormant_starts; - return true; - }; - dormant_callbacks.stop = [] {}; - CHECK_TRUE(hub.registerSource( - dormant, std::move(dormant_callbacks), 2)); - - const auto stop_ticket = admission_gate.beginStopAll(); - CHECK_TRUE(stop_ticket.valid()); - - MediaSourceManager::SourceCallbacks rejected_callbacks; - rejected_callbacks.start = [&]( - const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - ++new_starts; - return true; - }; - rejected_callbacks.stop = [] {}; - CHECK_TRUE(!hub.registerSource( - new_source, std::move(rejected_callbacks), 2)); - auto rejected_subscription = hub.subscribe(dormant->id); - CHECK_TRUE(!rejected_subscription.valid()); - CHECK_TRUE(dormant_starts.load(std::memory_order_acquire) == 0); - CHECK_TRUE(new_starts.load(std::memory_order_acquire) == 0); - - CHECK_TRUE(admission_gate.finishStopAll(stop_ticket, true)); - - MediaSourceManager::SourceCallbacks recovered_callbacks; - recovered_callbacks.start = [&]( - const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - ++new_starts; - return true; - }; - recovered_callbacks.stop = [] {}; - CHECK_TRUE(hub.registerSource( - new_source, std::move(recovered_callbacks), 2)); - - auto dormant_subscription = hub.subscribe(dormant->id); - auto new_subscription = hub.subscribe(new_source->id); - CHECK_TRUE(dormant_subscription.valid()); - CHECK_TRUE(new_subscription.valid()); - CHECK_TRUE(dormant_starts.load(std::memory_order_acquire) == 1); - CHECK_TRUE(new_starts.load(std::memory_order_acquire) == 1); -} - -void testSystemStopAllRejectsRegistrationWaitingForLocalStop() { - cmvr::service::StopAllAdmissionGate admission_gate; - MediaSourceManager hub(&admission_gate); - const auto old_source = makeVideoDescriptor( - Codec::H264, 1, {}, "old.video", "camera.shared"); - const auto replacement = makeVideoDescriptor( - Codec::H264, 2, {}, "replacement.video", "camera.shared"); - std::atomic stop_entered{false}; - std::atomic release_stop{false}; - - MediaSourceManager::SourceCallbacks old_callbacks; - old_callbacks.start = []( - const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { return true; }; - old_callbacks.stop = [&] { - stop_entered.store(true, std::memory_order_release); - while (!release_stop.load(std::memory_order_acquire)) { - std::this_thread::sleep_for(1ms); - } - }; - CHECK_TRUE(hub.registerSource( - old_source, std::move(old_callbacks), 2)); - auto old_subscription = hub.subscribe(old_source->id); - CHECK_TRUE(old_subscription.valid()); - - auto local_stop = std::async(std::launch::async, [&] { - return hub.stopSourcesForDevice(old_source->source_id); - }); - const auto stop_deadline = std::chrono::steady_clock::now() + 500ms; - while (!stop_entered.load(std::memory_order_acquire) && - std::chrono::steady_clock::now() < stop_deadline) { - std::this_thread::sleep_for(1ms); - } - CHECK_TRUE(stop_entered.load(std::memory_order_acquire)); - - auto make_replacement_callbacks = [] { - MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = []( - const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { return true; }; - callbacks.stop = [] {}; - return callbacks; - }; - auto waiting_registration = std::async(std::launch::async, [&] { - return hub.registerSource( - replacement, make_replacement_callbacks(), 2); - }); - CHECK_TRUE( - waiting_registration.wait_for(20ms) == - std::future_status::timeout); - - const auto stop_ticket = admission_gate.beginStopAll(); - release_stop.store(true, std::memory_order_release); - CHECK_TRUE(local_stop.wait_for(500ms) == std::future_status::ready); - if (local_stop.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(local_stop.get()); - } - CHECK_TRUE( - waiting_registration.wait_for(500ms) == - std::future_status::ready); - if (waiting_registration.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(!waiting_registration.get()); - } - CHECK_TRUE(!hub.hasSource(replacement->id)); - - CHECK_TRUE(admission_gate.finishStopAll(stop_ticket, true)); - CHECK_TRUE(hub.registerSource( - replacement, make_replacement_callbacks(), 2)); - auto recovered = hub.subscribe(replacement->id); - CHECK_TRUE(recovered.valid()); -} - -void testSystemStopAllRejectsSubscriptionWaitingForLocalStop() { - cmvr::service::StopAllAdmissionGate admission_gate; - MediaSourceManager hub(&admission_gate); - const auto descriptor = makeVideoDescriptor( - Codec::H264, 1, {}, "waiting.video", "camera.waiting"); - std::atomic stop_entered{false}; - std::atomic release_stop{false}; - std::atomic starts{0}; - - MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = [&]( - const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - ++starts; - return true; - }; - callbacks.stop = [&] { - stop_entered.store(true, std::memory_order_release); - while (!release_stop.load(std::memory_order_acquire)) { - std::this_thread::sleep_for(1ms); - } - }; - CHECK_TRUE(hub.registerSource( - descriptor, std::move(callbacks), 2)); - auto active = hub.subscribe(descriptor->id); - CHECK_TRUE(active.valid()); - - auto local_stop = std::async(std::launch::async, [&] { - active.reset(); - }); - const auto stop_deadline = std::chrono::steady_clock::now() + 500ms; - while (!stop_entered.load(std::memory_order_acquire) && - std::chrono::steady_clock::now() < stop_deadline) { - std::this_thread::sleep_for(1ms); - } - CHECK_TRUE(stop_entered.load(std::memory_order_acquire)); - - auto waiting_subscription = std::async(std::launch::async, [&] { - return hub.subscribe(descriptor->id); - }); - CHECK_TRUE( - waiting_subscription.wait_for(20ms) == - std::future_status::timeout); - - const auto stop_ticket = admission_gate.beginStopAll(); - release_stop.store(true, std::memory_order_release); - CHECK_TRUE(local_stop.wait_for(500ms) == std::future_status::ready); - if (local_stop.wait_for(0ms) == std::future_status::ready) { - local_stop.get(); - } - CHECK_TRUE( - waiting_subscription.wait_for(500ms) == - std::future_status::ready); - if (waiting_subscription.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(!waiting_subscription.get().valid()); - } - CHECK_TRUE(starts.load(std::memory_order_acquire) == 1); - - CHECK_TRUE(admission_gate.finishStopAll(stop_ticket, true)); - auto recovered = hub.subscribe(descriptor->id); - CHECK_TRUE(recovered.valid()); - CHECK_TRUE(starts.load(std::memory_order_acquire) == 2); -} - -void testStopAllSourcesCancelsStartingSourceBeforeReuse() { - MediaSourceManager hub; - const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1); - std::atomic old_start_entered{false}; - std::atomic release_old_start{false}; - std::atomic old_stop_count{0}; - - MediaSourceManager::SourceCallbacks old_callbacks; - old_callbacks.start = [&](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate& cancelled) { - old_start_entered.store(true, std::memory_order_release); - while (!release_old_start.load(std::memory_order_acquire)) { - if (cancelled()) { - break; - } - std::this_thread::sleep_for(1ms); - } - // Deliberately report a late success to exercise the abandoned-start - // stop path after stopAllSources has unregistered this source. - return true; - }; - old_callbacks.stop = [&] { ++old_stop_count; }; - CHECK_TRUE(hub.registerSource(descriptor, std::move(old_callbacks), 2)); - - auto old_subscription = std::async(std::launch::async, [&] { - return hub.subscribe(descriptor->id); - }); - const auto start_deadline = std::chrono::steady_clock::now() + 500ms; - while (!old_start_entered.load(std::memory_order_acquire) && - std::chrono::steady_clock::now() < start_deadline) { - std::this_thread::sleep_for(1ms); - } - CHECK_TRUE(old_start_entered.load(std::memory_order_acquire)); - - CHECK_TRUE(!hub.stopAllSources()); - CHECK_TRUE(hub.hasSource(descriptor->id)); - CHECK_TRUE(old_subscription.wait_for(500ms) == std::future_status::ready); - if (old_subscription.wait_for(0ms) == std::future_status::ready) { - CHECK_TRUE(!old_subscription.get().valid()); - } - - release_old_start.store(true, std::memory_order_release); - const auto old_stop_deadline = std::chrono::steady_clock::now() + 500ms; - while (old_stop_count.load(std::memory_order_acquire) != 1 && - std::chrono::steady_clock::now() < old_stop_deadline) { - std::this_thread::sleep_for(1ms); - } - CHECK_TRUE(old_stop_count.load(std::memory_order_acquire) == 1); - CHECK_TRUE(hub.stopAllSources()); - - std::atomic new_start_count{0}; - MediaSourceManager::SourceCallbacks new_callbacks; - new_callbacks.start = [&](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - ++new_start_count; - return true; - }; - new_callbacks.stop = [] {}; - CHECK_TRUE(hub.registerSource( - makeVideoDescriptor(Codec::H264, 2), std::move(new_callbacks), 2)); - auto new_subscription = hub.subscribe(descriptor->id); - CHECK_TRUE(new_subscription.valid()); - CHECK_TRUE(new_start_count.load(std::memory_order_acquire) == 1); - CHECK_TRUE(new_subscription.valid()); -} - -void testKeyFrameRequestIsOrderedBeforeStop() { - MediaSourceManager hub; - const auto descriptor = makeVideoDescriptor(Codec::H264, 1); - std::atomic key_frame_entered{false}; - std::atomic release_key_frame{false}; - std::atomic stop_count{0}; - - MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = [](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - return true; - }; - callbacks.stop = [&] { ++stop_count; }; - callbacks.request_key_frame = [&] { - key_frame_entered.store(true, std::memory_order_release); - while (!release_key_frame.load(std::memory_order_acquire)) { - std::this_thread::sleep_for(1ms); - } - return true; - }; - CHECK_TRUE(hub.registerSource(descriptor, std::move(callbacks), 2)); - auto subscription = hub.subscribe(descriptor->id); - CHECK_TRUE(subscription.valid()); - - auto key_frame = std::async(std::launch::async, [&] { - return hub.requestKeyFrame(descriptor->id); - }); - const auto enter_deadline = std::chrono::steady_clock::now() + 500ms; - while (!key_frame_entered.load(std::memory_order_acquire) && - std::chrono::steady_clock::now() < enter_deadline) { - std::this_thread::sleep_for(1ms); - } - CHECK_TRUE(key_frame_entered.load(std::memory_order_acquire)); - - auto stop = std::async(std::launch::async, [&] { subscription.reset(); }); - CHECK_TRUE(stop.wait_for(20ms) == std::future_status::timeout); - CHECK_TRUE(stop_count.load(std::memory_order_acquire) == 0); - - release_key_frame.store(true, std::memory_order_release); - CHECK_TRUE(key_frame.get()); - CHECK_TRUE(stop.wait_for(500ms) == std::future_status::ready); - stop.get(); - CHECK_TRUE(stop_count.load(std::memory_order_acquire) == 1); - CHECK_TRUE(!hub.requestKeyFrame(descriptor->id)); -} - -void testHubCancelsBlockedStartWithoutBlockingShutdown() { - MediaSourceManager hub; - const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1); - std::atomic start_entered{false}; - std::atomic start_exited{false}; - - MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = [&](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate& cancelled) { - start_entered.store(true, std::memory_order_release); - while (!cancelled()) { - std::this_thread::sleep_for(2ms); - } - start_exited.store(true, std::memory_order_release); - return false; - }; - CHECK_TRUE(hub.registerSource(descriptor, std::move(callbacks), 2)); - - auto subscription_future = std::async(std::launch::async, [&] { - return hub.subscribe(descriptor->id); - }); - const auto start_deadline = std::chrono::steady_clock::now() + 500ms; - while (!start_entered.load(std::memory_order_acquire) && - std::chrono::steady_clock::now() < start_deadline) { - std::this_thread::sleep_for(2ms); - } - - auto shutdown_future = std::async(std::launch::async, [&] { hub.shutdown(); }); - const bool shutdown_completed = shutdown_future.wait_for(500ms) == - std::future_status::ready; - if (shutdown_completed) shutdown_future.get(); - const bool subscribe_completed = subscription_future.wait_for(500ms) == - std::future_status::ready; - bool invalid_subscription = false; - if (subscribe_completed) { - invalid_subscription = !subscription_future.get().valid(); - } - const auto exit_deadline = std::chrono::steady_clock::now() + 500ms; - while (!start_exited.load(std::memory_order_acquire) && - std::chrono::steady_clock::now() < exit_deadline) { - std::this_thread::sleep_for(2ms); - } - - CHECK_TRUE(start_entered.load(std::memory_order_acquire)); - CHECK_TRUE(shutdown_completed); - CHECK_TRUE(subscribe_completed); - CHECK_TRUE(invalid_subscription); - CHECK_TRUE(start_exited.load(std::memory_order_acquire)); -} - -void testHubQuarantinesNonCooperativeStart() { - MediaSourceManager hub; - const auto descriptor = makeVideoDescriptor(Codec::UNKNOWN, 1); - std::atomic start_entered{false}; - std::atomic release_start{false}; - std::atomic start_exited{false}; - std::atomic stop_count{0}; - - MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = [&](const MediaSourceManager::FrameSink&, - const MediaSourceManager::CancelPredicate&) { - start_entered.store(true, std::memory_order_release); - while (!release_start.load(std::memory_order_acquire)) { - std::this_thread::sleep_for(2ms); - } - start_exited.store(true, std::memory_order_release); - return true; - }; - callbacks.stop = [&] { ++stop_count; }; - CHECK_TRUE(hub.registerSource(descriptor, std::move(callbacks), 2)); - - auto subscription_future = std::async(std::launch::async, [&] { - return hub.subscribe(descriptor->id); - }); - const auto start_deadline = std::chrono::steady_clock::now() + 500ms; - while (!start_entered.load(std::memory_order_acquire) && - std::chrono::steady_clock::now() < start_deadline) { - std::this_thread::sleep_for(2ms); - } - - const auto shutdown_started = std::chrono::steady_clock::now(); - hub.shutdown(); - const bool shutdown_was_bounded = - std::chrono::steady_clock::now() - shutdown_started < 500ms; - const bool subscribe_completed = subscription_future.wait_for(500ms) == - std::future_status::ready; - bool invalid_subscription = false; - if (subscribe_completed) { - invalid_subscription = !subscription_future.get().valid(); - } - - // Release the deliberately non-cooperative test callback before its stack - // captures go out of scope. Late successful startup must be stopped once. - release_start.store(true, std::memory_order_release); - const auto exit_deadline = std::chrono::steady_clock::now() + 500ms; - while ((!start_exited.load(std::memory_order_acquire) || stop_count.load() != 1) && - std::chrono::steady_clock::now() < exit_deadline) { - std::this_thread::sleep_for(2ms); - } - - CHECK_TRUE(start_entered.load(std::memory_order_acquire)); - CHECK_TRUE(shutdown_was_bounded); - CHECK_TRUE(subscribe_completed); - CHECK_TRUE(invalid_subscription); - CHECK_TRUE(start_exited.load(std::memory_order_acquire)); - CHECK_TRUE(stop_count.load() == 1); -} - -} // namespace - -int main() { - testMediaMetadataValidation(); - testLegacySpmcCompatibility(); - testBroadcastFrameRing(); - testBroadcastDiscardPending(); - testBroadcastDiscardConcurrentPublish(); - testBroadcastConcurrency(); - testHubLifecycleAndDescriptorRefresh(); - testSubscriptionDiscardPending(); - testHubFailedStartAndShutdown(); - testHubStopAllSourcesAllowsReregistration(); - testStopAllSourcesReportsAndRetriesUnconfirmedStop(); - testStopSourcesForDeviceIsSelectiveAndRetriesFailures(); - testDeviceStopsRunConcurrentlyAndSerializeMatchingRegistration(); - testStopAllWaitsForDeviceStopAndRetainsItsConcurrentRegistrationRule(); - testConcurrentRegistrationWaitsForStopAllSources(); - testSystemStopAllAdmissionFencesRegistrationAndStartup(); - testSystemStopAllRejectsRegistrationWaitingForLocalStop(); - testSystemStopAllRejectsSubscriptionWaitingForLocalStop(); - testStopAllSourcesCancelsStartingSourceBeforeReuse(); - testKeyFrameRequestIsOrderedBeforeStop(); - testHubCancelsBlockedStartWithoutBlockingShutdown(); - testHubQuarantinesNonCooperativeStart(); - - if (failures != 0) { - std::cerr << failures << " media_source_manager checks failed\n"; - return 1; - } - std::cout << "media_source_manager self-test passed\n"; - return 0; -} diff --git a/cmvr-es/manager/safety_manager/CMakeLists.txt b/cmvr-es/manager/safety_manager/CMakeLists.txt index f647fb1e..2c704db1 100644 --- a/cmvr-es/manager/safety_manager/CMakeLists.txt +++ b/cmvr-es/manager/safety_manager/CMakeLists.txt @@ -16,50 +16,3 @@ target_link_libraries(safety_manager PUBLIC add_library(cmvr_es::safety_manager ALIAS safety_manager) install(TARGETS safety_manager LIBRARY DESTINATION lib) - -if(BUILD_TESTING) - add_executable(safety_snapshot_store_test - tests/safety_snapshot_store_test.cpp - ) - target_link_libraries(safety_snapshot_store_test PRIVATE - cmvr_es::safety_manager - gtest - gtest_main - pthread - ) - add_test( - NAME safety_snapshot_store_test - COMMAND safety_snapshot_store_test - ) - set_tests_properties(safety_snapshot_store_test PROPERTIES TIMEOUT 10) - - add_executable(command_ledger_test - tests/command_ledger_test.cpp - ) - target_link_libraries(command_ledger_test PRIVATE - cmvr_es::safety_manager - gtest - gtest_main - pthread - ) - add_test( - NAME command_ledger_test - COMMAND command_ledger_test - ) - set_tests_properties(command_ledger_test PROPERTIES TIMEOUT 10) - - add_executable(safety_manager_test - tests/safety_manager_test.cpp - ) - target_link_libraries(safety_manager_test PRIVATE - cmvr_es::safety_manager - gtest - gtest_main - pthread - ) - add_test( - NAME safety_manager_test - COMMAND safety_manager_test - ) - set_tests_properties(safety_manager_test PROPERTIES TIMEOUT 15) -endif() diff --git a/cmvr-es/manager/safety_manager/include/safety_manager.h b/cmvr-es/manager/safety_manager/include/safety_manager.h index 20661939..9c0fa3da 100644 --- a/cmvr-es/manager/safety_manager/include/safety_manager.h +++ b/cmvr-es/manager/safety_manager/include/safety_manager.h @@ -13,7 +13,6 @@ #include "manager/safety_manager/include/command_ledger.h" #include "manager/safety_manager/include/device_safety_endpoint.h" #include "manager/safety_manager/include/safety_participant.h" -#include "manager/safety_manager/include/safety_snapshot_store.h" namespace cmvr::safety { @@ -174,7 +173,6 @@ public: SafetyManager& operator=(const SafetyManager&) = delete; bool registerDevice(DeviceSafetyRegistration registration); - bool unregisterDevice(const std::string& device_id); bool registerParticipant(std::shared_ptr participant); bool unregisterParticipant(const std::string& participant_id); @@ -182,15 +180,12 @@ public: const std::string& device_id, device::ManagedDeviceState lifecycle, device::DeviceHealthSnapshot health = {}); - bool publishSafetySnapshot(DeviceSafetySnapshot snapshot); std::optional advanceDeviceGeneration( const std::string& device_id); StartupCoverageResult validateStartupCoverage( SafetyClock::time_point deadline); void markStartupComplete(); - void beginShutdown() noexcept; - AdmissionDecision evaluate(const AdmissionRequest& request) const; AdmissionResult admit(const AdmissionRequest& request); // Lightweight session check. This validates the coordinator-owned epoch, // generation, freshness, and admission state without calling the device @@ -208,16 +203,16 @@ public: RecoveryResult recover(const RecoveryRequest& request); SafetyManagerSnapshot snapshot() const; - SafetySnapshotStore& snapshotStore() noexcept; - const SafetySnapshotStore& snapshotStore() const noexcept; CommandLedger& commandLedger() noexcept; - const CommandLedger& commandLedger() const noexcept; const std::string& serviceInstanceId() const noexcept; const SafetyManagerConfig& config() const noexcept; private: friend class DispatchGuard; struct Impl; + bool publishSafetySnapshot(DeviceSafetySnapshot snapshot); + void beginShutdown() noexcept; + AdmissionDecision evaluate(const AdmissionRequest& request) const; void endDispatch_(const std::string& device_id) noexcept; std::unique_ptr impl_; }; diff --git a/cmvr-es/manager/safety_manager/src/safety_manager.cpp b/cmvr-es/manager/safety_manager/src/safety_manager.cpp index 10d3c42e..69e1e917 100644 --- a/cmvr-es/manager/safety_manager/src/safety_manager.cpp +++ b/cmvr-es/manager/safety_manager/src/safety_manager.cpp @@ -1,4 +1,5 @@ #include "manager/safety_manager/include/safety_manager.h" +#include "manager/safety_manager/include/safety_snapshot_store.h" #include #include @@ -531,51 +532,6 @@ bool SafetyManager::registerDevice(DeviceSafetyRegistration registration) return true; } -bool SafetyManager::unregisterDevice(const std::string& device_id) -{ - std::shared_ptr endpoint; - std::string participant_id; - { - std::lock_guard lock(impl_->mutex); - const auto found = impl_->devices.find(device_id); - if (found == impl_->devices.end()) { - return false; - } - if (found->second.in_flight_dispatches != 0) { - return false; - } - found->second.publisher_binding->active.store( - false, std::memory_order_release); - endpoint = found->second.endpoint; - if (found->second.participant) { - participant_id = - found->second.participant->descriptor().participant_id; - impl_->participants.erase(participant_id); - const auto runtime = - impl_->participant_runtime.find(participant_id); - if (runtime != impl_->participant_runtime.end()) { - runtime->second.registered = false; - if (!runtime->second.barrier_active && - impl_->retained_barriers.count(participant_id) == 0U) { - impl_->participant_runtime.erase(runtime); - } - } - } - found->second.admission_state = DeviceAdmissionState::Removed; - impl_->devices.erase(found); - impl_->addEventLocked( - SafetyReason::DeviceUnavailable, - device_id, - {}, - "device safety capability unregistered"); - } - if (endpoint) { - endpoint->bindPublisher({}); - } - impl_->snapshots.unregisterDevice(device_id); - return true; -} - bool SafetyManager::registerParticipant( std::shared_ptr participant) { @@ -2529,26 +2485,11 @@ SafetyManagerSnapshot SafetyManager::snapshot() const return result; } -SafetySnapshotStore& SafetyManager::snapshotStore() noexcept -{ - return impl_->snapshots; -} - -const SafetySnapshotStore& SafetyManager::snapshotStore() const noexcept -{ - return impl_->snapshots; -} - CommandLedger& SafetyManager::commandLedger() noexcept { return impl_->ledger; } -const CommandLedger& SafetyManager::commandLedger() const noexcept -{ - return impl_->ledger; -} - const std::string& SafetyManager::serviceInstanceId() const noexcept { return impl_->service_instance_id; diff --git a/cmvr-es/manager/safety_manager/tests/command_ledger_test.cpp b/cmvr-es/manager/safety_manager/tests/command_ledger_test.cpp deleted file mode 100644 index bad8e503..00000000 --- a/cmvr-es/manager/safety_manager/tests/command_ledger_test.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "manager/safety_manager/include/command_ledger.h" - -#include -#include -#include -#include - -#include - -namespace cmvr::safety { -namespace { - -CommandKey key(const std::string& id) -{ - return {"anonymous", id}; -} - -CommandOutcome completedOutcome() -{ - CommandOutcome outcome; - outcome.lifecycle = CommandLifecycle::Completed; - outcome.reason = SafetyReason::None; - outcome.serialized_response = "done"; - return outcome; -} - -TEST(CommandLedgerTest, SameIdJoinsAndDifferentPayloadConflicts) -{ - CommandLedger ledger; - const auto first = ledger.reserve(key("command-1"), "payload-a"); - ASSERT_EQ(first.status, CommandReservationStatus::AcceptedNew); - EXPECT_EQ( - ledger.reserve(key("command-1"), "payload-a").status, - CommandReservationStatus::JoinedInFlight); - EXPECT_EQ( - ledger.reserve(key("command-1"), "payload-b").status, - CommandReservationStatus::CommandIdConflict); - - ASSERT_TRUE(ledger.complete(first.ticket, completedOutcome())); - const auto cached = ledger.reserve(key("command-1"), "payload-a"); - ASSERT_EQ(cached.status, CommandReservationStatus::CachedResult); - ASSERT_TRUE(cached.cached_outcome.has_value()); - EXPECT_EQ(cached.cached_outcome->serialized_response, "done"); -} - -TEST(CommandLedgerTest, ConcurrentCallersNeverCreateASecondReservation) -{ - CommandLedger ledger; - std::atomic accepted{0}; - std::vector workers; - for (int index = 0; index < 16; ++index) { - workers.emplace_back([&] { - const auto result = ledger.reserve(key("shared"), "payload"); - if (result.status == CommandReservationStatus::AcceptedNew) { - accepted.fetch_add(1); - } - }); - } - for (auto& worker : workers) { - worker.join(); - } - EXPECT_EQ(accepted.load(), 1); - EXPECT_EQ(ledger.acceptedIdCount(), 1U); -} - -TEST(CommandLedgerTest, OutcomeUnknownIsCachedAndNeverReservedAgain) -{ - CommandLedger ledger; - const auto first = ledger.reserve(key("uncertain"), "payload"); - ASSERT_EQ(first.status, CommandReservationStatus::AcceptedNew); - - CommandOutcome outcome; - outcome.lifecycle = CommandLifecycle::OutcomeUnknown; - outcome.reason = SafetyReason::OutcomeUnknown; - outcome.hardware_submission_possible = true; - ASSERT_TRUE(ledger.complete(first.ticket, outcome)); - - const auto retry = ledger.reserve(key("uncertain"), "payload"); - ASSERT_EQ(retry.status, CommandReservationStatus::CachedResult); - ASSERT_TRUE(retry.cached_outcome.has_value()); - EXPECT_EQ( - retry.cached_outcome->lifecycle, CommandLifecycle::OutcomeUnknown); - EXPECT_TRUE(retry.cached_outcome->hardware_submission_possible); -} - -TEST(CommandLedgerTest, EvictedResultLeavesAnExactTombstone) -{ - CommandLedger ledger({1, 3}); - auto first = ledger.reserve(key("first"), "payload-1"); - ASSERT_TRUE(ledger.complete(first.ticket, completedOutcome())); - auto second = ledger.reserve(key("second"), "payload-2"); - ASSERT_TRUE(ledger.complete(second.ticket, completedOutcome())); - - EXPECT_EQ( - ledger.reserve(key("first"), "payload-1").status, - CommandReservationStatus::ResultEvicted); - EXPECT_EQ( - ledger.reserve(key("first"), "different").status, - CommandReservationStatus::CommandIdConflict); - - auto third = ledger.reserve(key("third"), "payload-3"); - ASSERT_EQ(third.status, CommandReservationStatus::AcceptedNew); - EXPECT_EQ( - ledger.reserve(key("fourth"), "payload-4").status, - CommandReservationStatus::LedgerExhausted); -} - -TEST(CommandLedgerTest, WaitTimesOutWithoutChangingExecution) -{ - CommandLedger ledger; - const auto reservation = ledger.reserve(key("slow"), "payload"); - ASSERT_EQ(reservation.status, CommandReservationStatus::AcceptedNew); - EXPECT_FALSE(ledger.wait( - reservation.ticket, - SafetyClock::now() + std::chrono::milliseconds(5)).has_value()); - EXPECT_EQ( - ledger.reserve(key("slow"), "payload").status, - CommandReservationStatus::JoinedInFlight); -} - -} // namespace -} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/tests/safety_manager_test.cpp b/cmvr-es/manager/safety_manager/tests/safety_manager_test.cpp deleted file mode 100644 index 04fd32c2..00000000 --- a/cmvr-es/manager/safety_manager/tests/safety_manager_test.cpp +++ /dev/null @@ -1,782 +0,0 @@ -#include "manager/safety_manager/include/safety_manager.h" - -#include -#include -#include -#include - -#include - -namespace cmvr::safety { -namespace { - -DeviceSafetyDescriptor controlDescriptor(std::string device_id = "arm") -{ - DeviceSafetyDescriptor descriptor; - descriptor.device_id = std::move(device_id); - descriptor.kind = device::DeviceKind::Arm; - descriptor.default_policy = SafetyPolicyFamily::Control; - descriptor.maximum_snapshot_age = std::chrono::seconds(1); - descriptor.requires_safe_stop = true; - descriptor.supports_active_refresh = true; - return descriptor; -} - -class FakeEndpoint final : public DeviceSafetyEndpoint { -public: - explicit FakeEndpoint(DeviceSafetyDescriptor descriptor) - : descriptor_(std::move(descriptor)) - { - } - - DeviceSafetyDescriptor descriptor() const override - { - return descriptor_; - } - - void bindPublisher(SafetySnapshotPublisher publisher) override - { - publisher_ = std::move(publisher); - } - - void requestSafetyRefresh() noexcept override - { - if (!publisher_ || !publish_on_refresh) { - return; - } - DeviceSafetySnapshot snapshot; - snapshot.device_id = descriptor_.device_id; - snapshot.condition = condition; - snapshot.device_generation = generation; - snapshot.sample_sequence = ++sequence; - snapshot.observed_at = SafetyClock::now(); - snapshot.connected = connected; - snapshot.operational_ready = ready; - snapshot.quiescent = quiescent; - snapshot.motion_active = - quiescent == TriState::True ? TriState::False : TriState::Unknown; - snapshot.emergency_stop_active = emergency_stop; - snapshot.protective_stop_active = protective_stop; - snapshot.fault_active = fault; - (void)publisher_(std::move(snapshot)); - } - - HardwareCheckResult validateBeforeDispatch( - const AdmissionPermit&) override - { - ++hardware_checks; - return final_check; - } - - RecoveryCheckResult reconcileAdmissionState( - const RecoveryContext&) override - { - ++recoveries; - return recovery_check; - } - - RecoveryCheckResult restoreOperationalState( - const RecoveryContext&) override - { - ++operational_restores; - if (operational_restore_check.reconciled && - restore_to_nominal_on_success) { - condition = SafetyCondition::Nominal; - connected = TriState::True; - ready = TriState::True; - quiescent = TriState::True; - emergency_stop = TriState::False; - protective_stop = TriState::False; - fault = TriState::False; - } - return operational_restore_check; - } - - DeviceSafetyDescriptor descriptor_; - SafetySnapshotPublisher publisher_; - SafetyCondition condition{SafetyCondition::Nominal}; - TriState connected{TriState::True}; - TriState ready{TriState::True}; - TriState quiescent{TriState::True}; - TriState emergency_stop{TriState::False}; - TriState protective_stop{TriState::False}; - TriState fault{TriState::False}; - HardwareCheckResult final_check{true, SafetyReason::None, {}}; - RecoveryCheckResult recovery_check{true, SafetyReason::None, {}}; - RecoveryCheckResult operational_restore_check{ - true, SafetyReason::None, {}}; - std::uint64_t generation{1}; - std::uint64_t sequence{0}; - bool publish_on_refresh{true}; - std::atomic hardware_checks{0}; - std::atomic recoveries{0}; - std::atomic operational_restores{0}; - bool restore_to_nominal_on_success{true}; -}; - -class FakeParticipant final : public SafetyParticipant { -public: - ParticipantDescriptor descriptor() const override - { - return {"arm", ParticipantPhase::Actuator, true, - std::chrono::milliseconds(100)}; - } - - BarrierToken beginBarrier( - const SafetyOperationContext& context) override - { - ++barriers; - return {"arm", context.operation_id, context.safety_epoch, - static_cast(barriers.load())}; - } - - ParticipantResult requestQuiesce( - const BarrierToken&, - const SafetyOperationContext&) override - { - ++stop_requests; - return stop_result; - } - - ParticipantResult verifyQuiescent( - const BarrierToken&, - const SafetyOperationContext&) override - { - ++verifications; - return verify_result; - } - - RecoveryCheckResult recoverAdmission( - const BarrierToken&, - const RecoveryContext&) override - { - ++recoveries; - return recovery_result; - } - - ParticipantResult releaseBarrier( - const BarrierToken&) noexcept override - { - ++releases; - return release_result; - } - - ParticipantResult stop_result{true, SafetyReason::None, {}}; - ParticipantResult verify_result{true, SafetyReason::None, {}}; - RecoveryCheckResult recovery_result{true, SafetyReason::None, {}}; - ParticipantResult release_result{true, SafetyReason::None, {}}; - std::atomic barriers{0}; - std::atomic stop_requests{0}; - std::atomic verifications{0}; - std::atomic recoveries{0}; - std::atomic releases{0}; -}; - -AdmissionRequest actuateRequest() -{ - AdmissionRequest request; - request.command = { - "/cmvr.api.ArmService/moveJ", - CommandIntent::Actuate, - SafetyPolicyFamily::Control, - true, - false}; - request.device_id = "arm"; - request.command_id = "command-1"; - request.deadline = SafetyClock::now() + std::chrono::seconds(1); - return request; -} - -TEST(SafetyManagerTest, ShadowReportsDenyWithoutChangingLegacyBehavior) -{ - SafetyManager coordinator; - ASSERT_TRUE(coordinator.registerDevice({controlDescriptor(), {}, {}})); - coordinator.markStartupComplete(); - - const auto result = coordinator.admit(actuateRequest()); - EXPECT_TRUE(result.decision.allowed); - EXPECT_FALSE(result.decision.policy_allowed); - EXPECT_FALSE(result.decision.enforced); - EXPECT_EQ(result.decision.reason, SafetyReason::SafetyStateMissing); - EXPECT_TRUE(result.permit.has_value()); -} - -TEST(SafetyManagerTest, - EnforceSelectedStartupRejectsEmptyOrUnknownCoverage) -{ - SafetyManagerConfig empty_config; - empty_config.enforcement_mode = EnforcementMode::EnforceSelected; - SafetyManager empty(empty_config); - const auto empty_result = empty.validateStartupCoverage( - SafetyClock::now() + std::chrono::milliseconds(10)); - ASSERT_FALSE(empty_result.ready); - ASSERT_EQ(empty_result.issues.size(), 1U); - EXPECT_EQ(empty_result.issues.front().reason, SafetyReason::InvalidArgument); - - SafetyManagerConfig missing_config; - missing_config.enforcement_mode = EnforcementMode::EnforceSelected; - missing_config.enforced_device_ids.insert("missing-arm"); - SafetyManager missing(missing_config); - const auto missing_result = missing.validateStartupCoverage( - SafetyClock::now() + std::chrono::milliseconds(10)); - ASSERT_FALSE(missing_result.ready); - ASSERT_EQ(missing_result.issues.size(), 1U); - EXPECT_EQ(missing_result.issues.front().target_id, "missing-arm"); - EXPECT_EQ(missing_result.issues.front().reason, SafetyReason::DeviceNotFound); -} - -TEST(SafetyManagerTest, - EnforceAllStartupRequiresEndpointParticipantAndFreshSnapshot) -{ - SafetyManagerConfig config; - config.enforcement_mode = EnforcementMode::EnforceAll; - - SafetyManager missing_capability(config); - ASSERT_TRUE(missing_capability.registerDevice( - {controlDescriptor(), {}, {}})); - const auto structural = missing_capability.validateStartupCoverage( - SafetyClock::now() + std::chrono::milliseconds(10)); - EXPECT_FALSE(structural.ready); - EXPECT_EQ(structural.issues.size(), 2U); - - SafetyManager missing_sample(config); - auto silent_endpoint = - std::make_shared(controlDescriptor()); - silent_endpoint->publish_on_refresh = false; - ASSERT_TRUE(missing_sample.registerDevice({ - controlDescriptor(), - silent_endpoint, - std::make_shared()})); - const auto stale = missing_sample.validateStartupCoverage( - SafetyClock::now() + std::chrono::milliseconds(10)); - ASSERT_FALSE(stale.ready); - ASSERT_EQ(stale.issues.size(), 1U); - EXPECT_EQ(stale.issues.front().reason, SafetyReason::SafetyStateMissing); -} - -TEST(SafetyManagerTest, - HardwareUnsafeSnapshotBlocksAdmissionButNotStructuralStartup) -{ - SafetyManagerConfig config; - config.enforcement_mode = EnforcementMode::EnforceAll; - SafetyManager coordinator(config); - auto endpoint = std::make_shared(controlDescriptor()); - endpoint->condition = SafetyCondition::Unsafe; - endpoint->emergency_stop = TriState::True; - ASSERT_TRUE(coordinator.registerDevice({ - controlDescriptor(), endpoint, std::make_shared()})); - coordinator.updateDeviceRuntimeState( - "arm", device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - - const auto coverage = coordinator.validateStartupCoverage( - SafetyClock::now() + std::chrono::milliseconds(50)); - EXPECT_TRUE(coverage.ready); - coordinator.markStartupComplete(); - const auto admission = coordinator.admit(actuateRequest()); - EXPECT_FALSE(admission.decision.allowed); - EXPECT_EQ( - admission.decision.reason, SafetyReason::EmergencyStopActive); -} - -TEST(SafetyManagerTest, EnforceAllFailsClosedOnUnknownControlState) -{ - SafetyManagerConfig config; - config.enforcement_mode = EnforcementMode::EnforceAll; - SafetyManager coordinator(config); - ASSERT_TRUE(coordinator.registerDevice({controlDescriptor(), {}, {}})); - coordinator.markStartupComplete(); - - const auto result = coordinator.admit(actuateRequest()); - EXPECT_FALSE(result.decision.allowed); - EXPECT_FALSE(result.decision.policy_allowed); - EXPECT_TRUE(result.decision.enforced); - EXPECT_FALSE(result.permit.has_value()); -} - -TEST(SafetyManagerTest, ControlSafetyBitsMustBeExplicitlyFalse) -{ - SafetyManagerConfig config; - config.enforcement_mode = EnforcementMode::EnforceAll; - SafetyManager coordinator(config); - auto endpoint = std::make_shared(controlDescriptor()); - endpoint->protective_stop = TriState::Unknown; - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, {}})); - coordinator.updateDeviceRuntimeState( - "arm", device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - - const auto result = coordinator.admit(actuateRequest()); - EXPECT_FALSE(result.decision.allowed); - EXPECT_EQ(result.decision.reason, SafetyReason::ProtectiveStopActive); - ASSERT_EQ(coordinator.snapshot().devices.size(), 1U); - EXPECT_EQ( - coordinator.snapshot().devices.front().admission_state, - DeviceAdmissionState::Blocked); -} - -TEST(SafetyManagerTest, EnforcedDispatchRunsFinalHardwareCheck) -{ - SafetyManagerConfig config; - config.enforcement_mode = EnforcementMode::EnforceAll; - SafetyManager coordinator(config); - auto endpoint = std::make_shared(controlDescriptor()); - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, {}})); - coordinator.updateDeviceRuntimeState( - "arm", device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - - auto admission = coordinator.admit(actuateRequest()); - ASSERT_TRUE(admission.decision.allowed) << admission.decision.detail; - ASSERT_TRUE(admission.permit.has_value()); - auto dispatch = coordinator.beginDispatch(*admission.permit); - EXPECT_TRUE(dispatch.acquired()); - EXPECT_EQ(endpoint->hardware_checks.load(), 1); -} - -TEST(SafetyManagerTest, - StartActivityMayEnterFromRestrictedButActuationMayNot) -{ - SafetyManagerConfig config; - config.enforcement_mode = EnforcementMode::EnforceAll; - SafetyManager coordinator(config); - auto endpoint = std::make_shared(controlDescriptor()); - endpoint->condition = SafetyCondition::Restricted; - endpoint->ready = TriState::False; - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, {}})); - coordinator.updateDeviceRuntimeState( - "arm", device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - - auto start = actuateRequest(); - start.command.intent = CommandIntent::StartActivity; - const auto start_result = coordinator.admit(start); - ASSERT_TRUE(start_result.decision.allowed) - << start_result.decision.detail; - ASSERT_TRUE(start_result.permit.has_value()); - EXPECT_TRUE(coordinator.beginDispatch(*start_result.permit).acquired()); - - const auto actuation = coordinator.admit(actuateRequest()); - EXPECT_FALSE(actuation.decision.allowed); - EXPECT_EQ(actuation.decision.reason, SafetyReason::HardwareUnsafe); -} - -TEST(SafetyManagerTest, SuccessfulStopInvalidatesOldPermitAndReopens) -{ - SafetyManagerConfig config; - config.enforcement_mode = EnforcementMode::EnforceAll; - SafetyManager coordinator(config); - auto endpoint = std::make_shared(controlDescriptor()); - auto participant = std::make_shared(); - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, participant})); - coordinator.updateDeviceRuntimeState( - "arm", device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - - auto admission = coordinator.admit(actuateRequest()); - ASSERT_TRUE(admission.permit.has_value()); - const auto old_epoch = admission.permit->safety_epoch; - const auto stopped = coordinator.stopAll( - "stop-1", SafetyClock::now() + std::chrono::seconds(1)); - ASSERT_TRUE(stopped.success); - EXPECT_EQ(stopped.system_state, SystemAdmissionState::Open); - EXPECT_GT(stopped.current_safety_epoch, old_epoch); - const auto revalidated = - coordinator.revalidatePermit(*admission.permit); - EXPECT_FALSE(revalidated.safe); - EXPECT_EQ(revalidated.reason, SafetyReason::SafetyLatched); - EXPECT_FALSE(coordinator.beginDispatch(*admission.permit).acquired()); - EXPECT_EQ(participant->stop_requests.load(), 1); - EXPECT_EQ(participant->verifications.load(), 1); - const auto snapshot = coordinator.snapshot(); - ASSERT_EQ(snapshot.participants.size(), 1U); - EXPECT_EQ(snapshot.participants.front().descriptor.participant_id, "arm"); - EXPECT_FALSE(snapshot.participants.front().barrier_active); - EXPECT_FALSE(snapshot.participants.front().barrier_retained); - EXPECT_TRUE(snapshot.participants.front().last_request.recorded); - EXPECT_TRUE(snapshot.participants.front().last_request.success); - EXPECT_TRUE(snapshot.participants.front().last_verify.recorded); - EXPECT_TRUE(snapshot.participants.front().last_verify.success); - EXPECT_TRUE(snapshot.participants.front().last_release.recorded); - EXPECT_TRUE(snapshot.participants.front().last_release.success); -} - -TEST(SafetyManagerTest, FailedStopRequiresVerifiedRecovery) -{ - SafetyManagerConfig config; - config.enforcement_mode = EnforcementMode::EnforceAll; - SafetyManager coordinator(config); - auto endpoint = std::make_shared(controlDescriptor()); - auto participant = std::make_shared(); - participant->verify_result = { - false, SafetyReason::StopUnconfirmed, "motion not confirmed"}; - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, participant})); - coordinator.updateDeviceRuntimeState( - "arm", device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - - const auto stopped = coordinator.stopAll( - "stop-failed", SafetyClock::now() + std::chrono::seconds(1)); - ASSERT_FALSE(stopped.success); - ASSERT_EQ(stopped.system_state, SystemAdmissionState::Latched); - const auto latched = coordinator.snapshot(); - ASSERT_EQ(latched.participants.size(), 1U); - EXPECT_TRUE(latched.participants.front().barrier_active); - EXPECT_TRUE(latched.participants.front().barrier_retained); - EXPECT_TRUE(latched.participants.front().last_verify.recorded); - EXPECT_FALSE(latched.participants.front().last_verify.success); - EXPECT_FALSE(latched.participants.front().last_release.recorded); - - participant->verify_result = {true, SafetyReason::None, {}}; - RecoveryRequest request; - request.recovery_id = "recovery-1"; - request.all_devices = true; - request.expected_safety_epoch = stopped.current_safety_epoch; - request.verify_only = false; - request.reason = "operator confirmed work cell is clear"; - request.deadline = SafetyClock::now() + std::chrono::seconds(1); - const auto recovered = coordinator.recover(request); - EXPECT_EQ(recovered.result, RecoveryResultCode::Recovered); - EXPECT_EQ(recovered.system_state, SystemAdmissionState::Open); - EXPECT_EQ(endpoint->recoveries.load(), 1); - EXPECT_EQ(participant->recoveries.load(), 1); - const auto reopened = coordinator.snapshot(); - ASSERT_EQ(reopened.participants.size(), 1U); - EXPECT_FALSE(reopened.participants.front().barrier_active); - EXPECT_FALSE(reopened.participants.front().barrier_retained); - EXPECT_TRUE(reopened.participants.front().last_release.recorded); - EXPECT_TRUE(reopened.participants.front().last_release.success); -} - -TEST(SafetyManagerTest, RecoveryCannotIgnoreEmergencyStop) -{ - SafetyManager coordinator; - auto endpoint = std::make_shared(controlDescriptor()); - auto participant = std::make_shared(); - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, participant})); - coordinator.markStartupComplete(); - coordinator.quarantineDevice("arm", SafetyReason::OutcomeUnknown); - const auto before = coordinator.snapshot(); - - endpoint->emergency_stop = TriState::True; - RecoveryRequest request; - request.recovery_id = "recovery-estop"; - request.all_devices = true; - request.expected_safety_epoch = before.safety_epoch; - request.verify_only = false; - request.reason = "test"; - request.deadline = SafetyClock::now() + std::chrono::seconds(1); - const auto recovered = coordinator.recover(request); - EXPECT_EQ(recovered.result, RecoveryResultCode::BlockerRemains); - EXPECT_EQ(recovered.system_state, SystemAdmissionState::Latched); - ASSERT_FALSE(recovered.targets.empty()); - EXPECT_EQ( - recovered.targets.front().reason, - SafetyReason::EmergencyStopActive); - EXPECT_EQ(endpoint->recoveries.load(), 0); -} - -TEST(SafetyManagerTest, - OperationalRestoreClearsRecoverableHardwareAndSoftwareState) -{ - SafetyManager coordinator; - auto endpoint = std::make_shared(controlDescriptor()); - endpoint->condition = SafetyCondition::Unsafe; - endpoint->ready = TriState::False; - endpoint->protective_stop = TriState::True; - endpoint->quiescent = TriState::True; - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, {}})); - coordinator.markStartupComplete(); - coordinator.quarantineDevice("arm", SafetyReason::OutcomeUnknown); - const auto before = coordinator.snapshot(); - - RecoveryRequest request; - request.recovery_id = "restore-operational"; - request.all_devices = true; - request.expected_safety_epoch = before.safety_epoch; - request.verify_only = false; - request.restore_operational_state = true; - request.reason = "operator confirmed the work cell is clear"; - request.deadline = SafetyClock::now() + std::chrono::seconds(1); - request.authorize_clear = [] { return true; }; - - const auto restored = coordinator.recover(request); - - EXPECT_EQ(restored.result, RecoveryResultCode::Recovered); - EXPECT_EQ(restored.system_state, SystemAdmissionState::Open); - ASSERT_EQ(restored.targets.size(), 1U); - EXPECT_TRUE(restored.targets.front().success) - << restored.targets.front().detail; - EXPECT_EQ(endpoint->operational_restores.load(), 1); - EXPECT_EQ(endpoint->recoveries.load(), 1); - EXPECT_EQ( - coordinator.snapshot().devices.front().admission_state, - DeviceAdmissionState::Open); -} - -TEST(SafetyManagerTest, OperationalRestoreFailsClosedOnActiveEmergencyStop) -{ - SafetyManager coordinator; - auto endpoint = std::make_shared(controlDescriptor()); - endpoint->condition = SafetyCondition::Unsafe; - endpoint->ready = TriState::False; - endpoint->emergency_stop = TriState::True; - endpoint->quiescent = TriState::True; - endpoint->operational_restore_check = { - false, - SafetyReason::EmergencyStopActive, - "hardware emergency-stop input is still active"}; - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, {}})); - coordinator.markStartupComplete(); - coordinator.quarantineDevice("arm", SafetyReason::OutcomeUnknown); - const auto before = coordinator.snapshot(); - - RecoveryRequest request; - request.recovery_id = "restore-active-estop"; - request.all_devices = true; - request.expected_safety_epoch = before.safety_epoch; - request.verify_only = false; - request.restore_operational_state = true; - request.reason = "operator requested recovery"; - request.deadline = SafetyClock::now() + std::chrono::seconds(1); - request.authorize_clear = [] { return true; }; - - const auto restored = coordinator.recover(request); - - EXPECT_EQ(restored.result, RecoveryResultCode::BlockerRemains); - EXPECT_EQ(restored.system_state, SystemAdmissionState::Latched); - ASSERT_EQ(restored.targets.size(), 1U); - EXPECT_FALSE(restored.targets.front().success); - EXPECT_EQ( - restored.targets.front().reason, - SafetyReason::EmergencyStopActive); - EXPECT_EQ(endpoint->operational_restores.load(), 0); - EXPECT_EQ(endpoint->recoveries.load(), 0); -} - -TEST(SafetyManagerTest, OperationalRestoreDoesNotRecoverAnActiveDevice) -{ - SafetyManager coordinator; - auto endpoint = std::make_shared(controlDescriptor()); - endpoint->condition = SafetyCondition::Unsafe; - endpoint->ready = TriState::False; - endpoint->quiescent = TriState::False; - endpoint->fault = TriState::True; - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, {}})); - coordinator.markStartupComplete(); - coordinator.quarantineDevice("arm", SafetyReason::OutcomeUnknown); - - RecoveryRequest request; - request.recovery_id = "restore-active-device"; - request.all_devices = true; - request.expected_safety_epoch = coordinator.snapshot().safety_epoch; - request.verify_only = false; - request.restore_operational_state = true; - request.reason = "operator requested recovery"; - request.deadline = SafetyClock::now() + std::chrono::seconds(1); - request.authorize_clear = [] { return true; }; - - const auto restored = coordinator.recover(request); - - EXPECT_EQ(restored.result, RecoveryResultCode::BlockerRemains); - ASSERT_EQ(restored.targets.size(), 1U); - EXPECT_EQ( - restored.targets.front().reason, - SafetyReason::DeviceStillMoving); - EXPECT_EQ(endpoint->operational_restores.load(), 0); - EXPECT_EQ(endpoint->recoveries.load(), 0); -} - -TEST(SafetyManagerTest, OperationalRestoreAuditFailurePreventsDeviceRecovery) -{ - SafetyManager coordinator; - auto endpoint = std::make_shared(controlDescriptor()); - endpoint->condition = SafetyCondition::Unsafe; - endpoint->ready = TriState::False; - endpoint->protective_stop = TriState::True; - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, {}})); - coordinator.markStartupComplete(); - coordinator.quarantineDevice("arm", SafetyReason::OutcomeUnknown); - - RecoveryRequest request; - request.recovery_id = "restore-audit-failure"; - request.all_devices = true; - request.expected_safety_epoch = coordinator.snapshot().safety_epoch; - request.verify_only = false; - request.restore_operational_state = true; - request.reason = "operator requested recovery"; - request.deadline = SafetyClock::now() + std::chrono::seconds(1); - request.authorize_clear = [] { return false; }; - - const auto restored = coordinator.recover(request); - - EXPECT_EQ(restored.result, RecoveryResultCode::BlockerRemains); - ASSERT_EQ(restored.targets.size(), 1U); - EXPECT_EQ( - restored.targets.front().reason, - SafetyReason::RecoveryAuditFailed); - EXPECT_EQ(endpoint->operational_restores.load(), 0); - EXPECT_EQ(endpoint->recoveries.load(), 0); -} - -TEST(SafetyManagerTest, OperationalRestoreRequiresExplicitAuthorization) -{ - SafetyManager coordinator; - auto endpoint = std::make_shared(controlDescriptor()); - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, {}})); - coordinator.markStartupComplete(); - - RecoveryRequest request; - request.recovery_id = "restore-without-authorization"; - request.all_devices = true; - request.expected_safety_epoch = coordinator.snapshot().safety_epoch; - request.verify_only = false; - request.restore_operational_state = true; - request.reason = "operator requested recovery"; - - const auto restored = coordinator.recover(request); - - EXPECT_EQ(restored.result, RecoveryResultCode::Failed); - ASSERT_EQ(restored.targets.size(), 1U); - EXPECT_EQ( - restored.targets.front().reason, - SafetyReason::InvalidArgument); - EXPECT_EQ(endpoint->operational_restores.load(), 0); -} - -TEST(SafetyManagerTest, - OperationalRestoreAuditFailureWithNoDevicesRemainsLatched) -{ - SafetyManager coordinator; - coordinator.markStartupComplete(); - - RecoveryRequest request; - request.recovery_id = "empty-restore-audit-failure"; - request.all_devices = true; - request.expected_safety_epoch = coordinator.snapshot().safety_epoch; - request.verify_only = false; - request.restore_operational_state = true; - request.reason = "operator requested recovery"; - request.deadline = SafetyClock::now() + std::chrono::seconds(1); - request.authorize_clear = [] { return false; }; - - const auto restored = coordinator.recover(request); - - EXPECT_EQ(restored.result, RecoveryResultCode::BlockerRemains); - EXPECT_EQ(restored.system_state, SystemAdmissionState::Latched); - ASSERT_EQ(restored.targets.size(), 1U); - EXPECT_EQ(restored.targets.front().target_id, "system"); - EXPECT_EQ( - restored.targets.front().reason, - SafetyReason::RecoveryAuditFailed); -} - -TEST(SafetyManagerTest, - OperationalRestoreDoesNotPartiallyReleaseSoftwareAdmission) -{ - SafetyManager coordinator; - auto first = std::make_shared( - controlDescriptor("arm-first")); - first->condition = SafetyCondition::Unsafe; - first->ready = TriState::False; - first->protective_stop = TriState::True; - auto second = std::make_shared( - controlDescriptor("arm-second")); - second->condition = SafetyCondition::Unsafe; - second->ready = TriState::False; - second->fault = TriState::True; - second->operational_restore_check = { - false, SafetyReason::DeviceFault, "fault reset failed"}; - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor("arm-first"), first, {}})); - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor("arm-second"), second, {}})); - coordinator.markStartupComplete(); - coordinator.quarantineDevice( - "arm-first", SafetyReason::OutcomeUnknown); - coordinator.quarantineDevice( - "arm-second", SafetyReason::OutcomeUnknown); - - RecoveryRequest request; - request.recovery_id = "restore-partial-failure"; - request.all_devices = true; - request.expected_safety_epoch = coordinator.snapshot().safety_epoch; - request.verify_only = false; - request.restore_operational_state = true; - request.reason = "operator requested recovery"; - request.deadline = SafetyClock::now() + std::chrono::seconds(1); - request.authorize_clear = [] { return true; }; - - const auto restored = coordinator.recover(request); - - EXPECT_EQ(restored.result, RecoveryResultCode::BlockerRemains); - EXPECT_EQ(restored.system_state, SystemAdmissionState::Latched); - EXPECT_EQ(first->operational_restores.load(), 1); - EXPECT_EQ(second->operational_restores.load(), 1); - EXPECT_EQ(first->recoveries.load(), 0); - EXPECT_EQ(second->recoveries.load(), 0); - const auto snapshot = coordinator.snapshot(); - ASSERT_EQ(snapshot.devices.size(), 2U); - for (const auto& device : snapshot.devices) { - EXPECT_EQ( - device.admission_state, - DeviceAdmissionState::Quarantined) - << device.descriptor.device_id; - } -} - -TEST(SafetyManagerTest, RecoveryAuditFailureCannotReleaseLatch) -{ - SafetyManager coordinator; - auto endpoint = std::make_shared(controlDescriptor()); - auto participant = std::make_shared(); - participant->verify_result = { - false, SafetyReason::StopUnconfirmed, "motion not confirmed"}; - ASSERT_TRUE(coordinator.registerDevice( - {controlDescriptor(), endpoint, participant})); - coordinator.markStartupComplete(); - - const auto stopped = coordinator.stopAll( - "stop-audit", SafetyClock::now() + std::chrono::seconds(1)); - ASSERT_FALSE(stopped.success); - participant->verify_result = {true, SafetyReason::None, {}}; - - RecoveryRequest request; - request.recovery_id = "recovery-audit"; - request.all_devices = true; - request.expected_safety_epoch = stopped.current_safety_epoch; - request.verify_only = false; - request.reason = "operator inspected the work cell"; - request.deadline = SafetyClock::now() + std::chrono::seconds(1); - request.authorize_clear = [] { return false; }; - const auto recovered = coordinator.recover(request); - - EXPECT_EQ(recovered.result, RecoveryResultCode::BlockerRemains); - EXPECT_EQ(recovered.system_state, SystemAdmissionState::Latched); - ASSERT_FALSE(recovered.targets.empty()); - EXPECT_EQ( - recovered.targets.front().reason, - SafetyReason::RecoveryAuditFailed); - EXPECT_EQ(endpoint->recoveries.load(), 0); - EXPECT_EQ(participant->recoveries.load(), 0); - EXPECT_EQ(participant->releases.load(), 0); -} - -} // namespace -} // namespace cmvr::safety diff --git a/cmvr-es/manager/safety_manager/tests/safety_snapshot_store_test.cpp b/cmvr-es/manager/safety_manager/tests/safety_snapshot_store_test.cpp deleted file mode 100644 index 7d2c93d6..00000000 --- a/cmvr-es/manager/safety_manager/tests/safety_snapshot_store_test.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "manager/safety_manager/include/safety_snapshot_store.h" - -#include -#include -#include - -#include - -namespace cmvr::safety { -namespace { - -DeviceSafetyDescriptor descriptor() -{ - DeviceSafetyDescriptor result; - result.device_id = "arm"; - result.kind = device::DeviceKind::Arm; - result.default_policy = SafetyPolicyFamily::Control; - result.maximum_snapshot_age = std::chrono::milliseconds(50); - result.requires_safe_stop = true; - return result; -} - -DeviceSafetySnapshot sample( - const std::uint64_t generation, - const std::uint64_t sequence, - const SafetyClock::time_point observed_at = SafetyClock::now()) -{ - DeviceSafetySnapshot result; - result.device_id = "arm"; - result.condition = SafetyCondition::Nominal; - result.device_generation = generation; - result.sample_sequence = sequence; - result.observed_at = observed_at; - result.connected = TriState::True; - result.operational_ready = TriState::True; - result.quiescent = TriState::True; - result.motion_active = TriState::False; - result.emergency_stop_active = TriState::False; - result.protective_stop_active = TriState::False; - result.fault_active = TriState::False; - return result; -} - -TEST(SafetySnapshotStoreTest, RejectsOldGenerationAndSequence) -{ - SafetySnapshotStore store; - ASSERT_TRUE(store.registerDevice(descriptor(), 3)); - EXPECT_FALSE(store.publish(sample(2, 1))); - ASSERT_TRUE(store.publish(sample(3, 2))); - EXPECT_FALSE(store.publish(sample(3, 2))); - EXPECT_FALSE(store.publish(sample(3, 1))); - EXPECT_TRUE(store.publish(sample(4, 1))); - - const auto view = store.get("arm"); - ASSERT_TRUE(view.registered); - EXPECT_EQ(view.snapshot.device_generation, 4U); - EXPECT_EQ(view.snapshot.sample_sequence, 1U); -} - -TEST(SafetySnapshotStoreTest, FreshnessUsesMonotonicObservationTime) -{ - SafetySnapshotStore store; - ASSERT_TRUE(store.registerDevice(descriptor())); - const auto observed = SafetyClock::now(); - ASSERT_TRUE(store.publish(sample(1, 1, observed))); - - EXPECT_TRUE(store.get( - "arm", observed + std::chrono::milliseconds(49)).fresh); - const auto stale = store.get( - "arm", observed + std::chrono::milliseconds(51)); - EXPECT_FALSE(stale.fresh); - EXPECT_EQ(stale.sample_age, std::chrono::milliseconds(51)); -} - -TEST(SafetySnapshotStoreTest, BumpGenerationRequiresANewSample) -{ - SafetySnapshotStore store; - ASSERT_TRUE(store.registerDevice(descriptor())); - ASSERT_TRUE(store.publish(sample(1, 8))); - ASSERT_EQ(store.bumpGeneration("arm"), 2U); - - const auto view = store.get("arm"); - EXPECT_FALSE(view.has_sample); - EXPECT_FALSE(view.fresh); - EXPECT_EQ(view.snapshot.device_generation, 2U); - EXPECT_FALSE(store.publish(sample(1, 9))); - EXPECT_TRUE(store.publish(sample(2, 1))); -} - -TEST(SafetySnapshotStoreTest, WaiterObservesOnlyANewerSample) -{ - SafetySnapshotStore store; - ASSERT_TRUE(store.registerDevice(descriptor())); - ASSERT_TRUE(store.publish(sample(1, 1))); - - std::atomic published{false}; - std::thread writer([&] { - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - published.store(store.publish(sample(1, 2))); - }); - - SafetySnapshotView view; - EXPECT_TRUE(store.waitForNewerSample( - "arm", 1, SafetyClock::now() + std::chrono::seconds(1), view)); - writer.join(); - EXPECT_TRUE(published.load()); - EXPECT_EQ(view.snapshot.sample_sequence, 2U); -} - -} // namespace -} // namespace cmvr::safety diff --git a/cmvr-es/manager/task_manager/CMakeLists.txt b/cmvr-es/manager/task_manager/CMakeLists.txt index 6f4185a8..bbc08858 100644 --- a/cmvr-es/manager/task_manager/CMakeLists.txt +++ b/cmvr-es/manager/task_manager/CMakeLists.txt @@ -16,30 +16,3 @@ target_link_libraries(task_manager add_library(cmvr_es::task_manager ALIAS task_manager) install(TARGETS task_manager LIBRARY DESTINATION lib) - -if(BUILD_TESTING) - add_executable(task_manager_lifecycle_test - tests/task_manager_lifecycle_test.cpp - ) - target_link_libraries(task_manager_lifecycle_test PRIVATE - cmvr_es::task_manager - cmvr_es::stop_all_admission_gate - gtest - gtest_main - pthread - ) - add_test( - NAME task_manager_lifecycle_test - COMMAND task_manager_lifecycle_test - ) - set(_task_manager_lifecycle_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}") - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _task_manager_lifecycle_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(task_manager_lifecycle_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_task_manager_lifecycle_test_environment}" - ) -endif() diff --git a/cmvr-es/manager/task_manager/tests/task_manager_lifecycle_test.cpp b/cmvr-es/manager/task_manager/tests/task_manager_lifecycle_test.cpp deleted file mode 100644 index bc7a4bf8..00000000 --- a/cmvr-es/manager/task_manager/tests/task_manager_lifecycle_test.cpp +++ /dev/null @@ -1,428 +0,0 @@ -#include "manager/task_manager/include/task_manager.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" -#include "task/task_factory.h" - -namespace { - -struct TaskBehavior { - bool init_result{true}; - bool start_result{true}; - bool throw_on_start{false}; - bool stop_activity_result{true}; - bool block_start{false}; - bool query_snapshot_on_stop{false}; -}; - -TaskBehavior task_behavior; -std::vector stop_order; - -class LifecycleTask final : public cmvr::task::Task { -public: - explicit LifecycleTask( - std::string id, - const cmvr::task::TaskShutdownPhase shutdown_phase = - cmvr::task::TaskShutdownPhase::DEPENDENT_ACTIVITY) - : id_(std::move(id)), - shutdown_phase_(shutdown_phase) - { - } - - const std::string& id() const override { return id_; } - cmvr::task::TaskRunMode runMode() const override - { - return cmvr::task::TaskRunMode::BLOCKING_SERVICE; - } - cmvr::task::TaskShutdownPhase shutdownPhase() const override - { - return shutdown_phase_; - } - - bool init() override - { - ++init_calls; - state_ = task_behavior.init_result - ? cmvr::task::TaskState::IDLE - : cmvr::task::TaskState::FAILED; - return task_behavior.init_result; - } - - bool start() override - { - ++start_calls; - { - std::unique_lock lock(start_mutex); - start_entered = true; - start_condition.notify_all(); - start_condition.wait(lock, [] { - return !task_behavior.block_start; - }); - } - if (task_behavior.throw_on_start) { - throw std::runtime_error("start failure"); - } - state_ = task_behavior.start_result - ? cmvr::task::TaskState::RUNNING - : cmvr::task::TaskState::FAILED; - return task_behavior.start_result; - } - - bool step(double) override { return true; } - - void stop() override - { - ++stop_calls; - if (task_behavior.query_snapshot_on_stop) { - (void)cmvr::task::TaskManager::activitySnapshotIfInitialized(); - } - stop_order.push_back(id_); - state_ = cmvr::task::TaskState::STOPPED; - } - - bool stopActivity() override - { - ++stop_activity_calls; - return task_behavior.stop_activity_result; - } - - cmvr::task::TaskState state() const override { return state_; } - bool isBusy() const override - { - return state_ == cmvr::task::TaskState::RUNNING; - } - bool isFinished() const override - { - return state_ == cmvr::task::TaskState::STOPPED; - } - bool isFailed() const override - { - return state_ == cmvr::task::TaskState::FAILED; - } - std::string stateString() const override - { - return cmvr::task::taskStateToString(state_); - } - std::string detailStatusString() const override - { - return stateString(); - } - - int init_calls{0}; - int start_calls{0}; - int stop_calls{0}; - int stop_activity_calls{0}; - std::mutex start_mutex; - std::condition_variable start_condition; - bool start_entered{false}; - -private: - std::string id_; - cmvr::task::TaskShutdownPhase shutdown_phase_; - cmvr::task::TaskState state_{ - cmvr::task::TaskState::UNINITIALIZED}; -}; - -std::shared_ptr created_task; -std::shared_ptr created_ingress_task; - -cmvr::config::TaskManagerConfig enabledTaskConfig() -{ - cmvr::config::TaskManagerConfig config; - auto* entry = config.add_tasks(); - entry->set_id("lifecycle_task"); - entry->set_type( - cmvr::config::TaskConfigEntry::TASK_TYPE_UME_TELEOP); - entry->set_enable(true); - entry->set_run_mode( - cmvr::config::TaskConfigEntry:: - TASK_RUN_MODE_BLOCKING_SERVICE); - return config; -} - -class TaskManagerLifecycleTest : public ::testing::Test { -protected: - void SetUp() override - { - cmvr::task::TaskManager::destroyInstance(); - cmvr::service::globalStopAllAdmissionGate().clearForTesting(); - task_behavior = {}; - created_task.reset(); - created_ingress_task.reset(); - stop_order.clear(); - cmvr::task::TaskFactory::registerCreator( - cmvr::config::TaskConfigEntry::TASK_TYPE_UME_TELEOP, - [](const cmvr::config::TaskConfigEntry& entry) { - created_task = - std::make_shared(entry.id()); - return created_task; - }); - } - - void TearDown() override - { - if (created_task) { - { - std::lock_guard lock(created_task->start_mutex); - task_behavior.block_start = false; - } - created_task->start_condition.notify_all(); - } - cmvr::task::TaskManager::destroyInstance(); - cmvr::service::globalStopAllAdmissionGate().clearForTesting(); - created_task.reset(); - created_ingress_task.reset(); - stop_order.clear(); - } -}; - -TEST_F(TaskManagerLifecycleTest, - EnabledTaskInitFailureMarksInitializationFailed) -{ - task_behavior.init_result = false; - auto& manager = - cmvr::task::TaskManager::getInstance(enabledTaskConfig()); - - ASSERT_NE(created_task, nullptr); - EXPECT_FALSE(manager.initialized()); - EXPECT_FALSE(manager.startRunTask()); - EXPECT_FALSE(manager.running()); - EXPECT_EQ(created_task->init_calls, 1); - EXPECT_EQ(created_task->start_calls, 0); - EXPECT_EQ(created_task->stop_calls, 1); -} - -TEST_F(TaskManagerLifecycleTest, - TaskStartFailureIsReturnedAndRunningRemainsFalse) -{ - task_behavior.start_result = false; - auto& manager = - cmvr::task::TaskManager::getInstance(enabledTaskConfig()); - - ASSERT_TRUE(manager.initialized()); - ASSERT_NE(created_task, nullptr); - EXPECT_FALSE(manager.startRunTask()); - EXPECT_FALSE(manager.running()); - EXPECT_EQ(created_task->start_calls, 1); - EXPECT_EQ(created_task->stop_calls, 1); -} - -TEST_F(TaskManagerLifecycleTest, - TaskStartExceptionIsReturnedAndRunningRemainsFalse) -{ - task_behavior.throw_on_start = true; - auto& manager = - cmvr::task::TaskManager::getInstance(enabledTaskConfig()); - - ASSERT_TRUE(manager.initialized()); - ASSERT_NE(created_task, nullptr); - EXPECT_FALSE(manager.startRunTask()); - EXPECT_FALSE(manager.running()); - EXPECT_EQ(created_task->start_calls, 1); - EXPECT_EQ(created_task->stop_calls, 1); -} - -TEST_F(TaskManagerLifecycleTest, SuccessfulStartAndStopAreReported) -{ - auto& manager = - cmvr::task::TaskManager::getInstance(enabledTaskConfig()); - - ASSERT_TRUE(manager.initialized()); - ASSERT_NE(created_task, nullptr); - EXPECT_TRUE(manager.startRunTask()); - EXPECT_TRUE(manager.running()); - manager.stopRunTask(); - EXPECT_FALSE(manager.running()); - EXPECT_EQ(created_task->start_calls, 1); - EXPECT_EQ(created_task->stop_calls, 1); -} - -TEST_F(TaskManagerLifecycleTest, - CommandIngressStopsBeforeDependentTaskActivity) -{ - cmvr::task::TaskFactory::registerCreator( - cmvr::config::TaskConfigEntry::TASK_TYPE_GRPC_SERVER, - [](const cmvr::config::TaskConfigEntry& entry) { - created_ingress_task = std::make_shared( - entry.id(), - cmvr::task::TaskShutdownPhase::COMMAND_INGRESS); - return created_ingress_task; - }); - - auto config = enabledTaskConfig(); - auto* ingress = config.add_tasks(); - ingress->set_id("control_ingress"); - ingress->set_type( - cmvr::config::TaskConfigEntry::TASK_TYPE_GRPC_SERVER); - ingress->set_enable(true); - ingress->set_run_mode( - cmvr::config::TaskConfigEntry::TASK_RUN_MODE_BLOCKING_SERVICE); - - auto& manager = cmvr::task::TaskManager::getInstance(config); - ASSERT_TRUE(manager.initialized()); - ASSERT_TRUE(manager.startRunTask()); - manager.stopRunTask(); - - ASSERT_EQ(stop_order.size(), 2U); - EXPECT_EQ(stop_order[0], "control_ingress"); - EXPECT_EQ(stop_order[1], "lifecycle_task"); -} - -TEST_F(TaskManagerLifecycleTest, - DestroyDoesNotHoldSingletonLockWhileStoppingTasks) -{ - task_behavior.query_snapshot_on_stop = true; - auto& manager = - cmvr::task::TaskManager::getInstance(enabledTaskConfig()); - ASSERT_TRUE(manager.initialized()); - ASSERT_TRUE(manager.startRunTask()); - - auto destroy = std::async(std::launch::async, [] { - cmvr::task::TaskManager::destroyInstance(); - }); - ASSERT_EQ( - destroy.wait_for(std::chrono::seconds(1)), - std::future_status::ready); - destroy.get(); - - ASSERT_NE(created_task, nullptr); - EXPECT_EQ(created_task->stop_calls, 1); -} - -TEST_F(TaskManagerLifecycleTest, - StopAllActivitiesDoesNotStopSchedulerOrTaskLifecycle) -{ - auto& manager = - cmvr::task::TaskManager::getInstance(enabledTaskConfig()); - - ASSERT_TRUE(manager.initialized()); - ASSERT_TRUE(manager.startRunTask()); - ASSERT_NE(created_task, nullptr); - EXPECT_TRUE(manager.stopAllActivities()); - EXPECT_TRUE(manager.running()); - EXPECT_EQ(created_task->stop_activity_calls, 1); - EXPECT_EQ(created_task->stop_calls, 0); - - manager.stopRunTask(); - EXPECT_EQ(created_task->stop_calls, 1); -} - -TEST_F(TaskManagerLifecycleTest, - StopAllActivitiesReportsUnconfirmedOperationalStop) -{ - task_behavior.stop_activity_result = false; - auto& manager = - cmvr::task::TaskManager::getInstance(enabledTaskConfig()); - - std::vector failures; - EXPECT_FALSE(manager.stopAllActivities(&failures)); - ASSERT_EQ(failures.size(), 1U); - EXPECT_NE(failures.front().find("lifecycle_task"), std::string::npos); - EXPECT_EQ(created_task->stop_calls, 0); -} - -TEST_F(TaskManagerLifecycleTest, - StopAllActivitiesIsSuccessfulWhenManagerIsNotInitialized) -{ - cmvr::task::TaskManager::destroyInstance(); - std::vector failures; - EXPECT_TRUE( - cmvr::task::TaskManager::stopAllActivitiesIfInitialized(&failures)); - EXPECT_TRUE(failures.empty()); -} - -TEST_F(TaskManagerLifecycleTest, StartIsRejectedWhileStopAllAdmissionIsClosed) -{ - auto& manager = - cmvr::task::TaskManager::getInstance(enabledTaskConfig()); - auto& gate = cmvr::service::globalStopAllAdmissionGate(); - const auto ticket = gate.beginStopAll(); - - EXPECT_FALSE(manager.startRunTask()); - EXPECT_FALSE(manager.running()); - ASSERT_NE(created_task, nullptr); - EXPECT_EQ(created_task->start_calls, 0); - - EXPECT_TRUE(gate.finishStopAll(ticket, true)); - EXPECT_TRUE(manager.startRunTask()); - EXPECT_TRUE(manager.running()); -} - -TEST_F(TaskManagerLifecycleTest, - StartCrossingStopAllGenerationRollsBackStartedTasks) -{ - task_behavior.block_start = true; - auto& manager = - cmvr::task::TaskManager::getInstance(enabledTaskConfig()); - ASSERT_NE(created_task, nullptr); - - std::atomic start_result{true}; - std::thread starter([&] { - start_result.store(manager.startRunTask()); - }); - bool start_entered = false; - { - std::unique_lock lock(created_task->start_mutex); - start_entered = created_task->start_condition.wait_for( - lock, std::chrono::seconds(2), [&] { - return created_task->start_entered; - }); - } - if (!start_entered) { - { - std::lock_guard lock(created_task->start_mutex); - task_behavior.block_start = false; - } - created_task->start_condition.notify_all(); - starter.join(); - FAIL() << "task start did not reach the generation-race barrier"; - } - - auto& gate = cmvr::service::globalStopAllAdmissionGate(); - const auto ticket = gate.beginStopAll(); - { - std::lock_guard lock(created_task->start_mutex); - task_behavior.block_start = false; - } - created_task->start_condition.notify_all(); - starter.join(); - - EXPECT_FALSE(start_result.load()); - EXPECT_FALSE(manager.running()); - EXPECT_EQ(created_task->start_calls, 1); - EXPECT_EQ(created_task->stop_calls, 1); - - EXPECT_TRUE(gate.finishStopAll(ticket, true)); - EXPECT_TRUE(manager.startRunTask()); -} - -TEST_F(TaskManagerLifecycleTest, - FailedStopAllKeepsTaskStartupRejectedUntilSuccessfulRound) -{ - auto& manager = - cmvr::task::TaskManager::getInstance(enabledTaskConfig()); - auto& gate = cmvr::service::globalStopAllAdmissionGate(); - auto ticket = gate.beginStopAll(); - EXPECT_FALSE(gate.finishStopAll(ticket, false)); - - EXPECT_FALSE(manager.startRunTask()); - ASSERT_NE(created_task, nullptr); - EXPECT_EQ(created_task->start_calls, 0); - - ticket = gate.beginStopAll(); - EXPECT_TRUE(gate.finishStopAll(ticket, true)); - EXPECT_TRUE(manager.startRunTask()); -} - -} // namespace diff --git a/cmvr-es/runtime/CMakeLists.txt b/cmvr-es/runtime/CMakeLists.txt index 91c68a2c..b9bb492c 100644 --- a/cmvr-es/runtime/CMakeLists.txt +++ b/cmvr-es/runtime/CMakeLists.txt @@ -19,33 +19,3 @@ target_link_libraries(cmvr_runtime PUBLIC add_library(cmvr_es::runtime ALIAS cmvr_runtime) install(TARGETS cmvr_runtime LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) - -if(BUILD_TESTING) - add_executable(runtime_lifecycle_test - tests/runtime_lifecycle_test.cpp - ) - target_compile_features(runtime_lifecycle_test PRIVATE cxx_std_17) - target_include_directories(runtime_lifecycle_test PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(runtime_lifecycle_test PRIVATE - cmvr_es::runtime - gtest - gtest_main - pthread - ) - add_test( - NAME runtime_lifecycle_test - COMMAND runtime_lifecycle_test - ) - set(_runtime_lifecycle_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}") - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _runtime_lifecycle_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(runtime_lifecycle_test PROPERTIES - TIMEOUT 20 - ENVIRONMENT "${_runtime_lifecycle_test_environment}" - ) -endif() diff --git a/cmvr-es/runtime/tests/runtime_lifecycle_test.cpp b/cmvr-es/runtime/tests/runtime_lifecycle_test.cpp deleted file mode 100644 index 60f8d7ca..00000000 --- a/cmvr-es/runtime/tests/runtime_lifecycle_test.cpp +++ /dev/null @@ -1,266 +0,0 @@ -#include "runtime/include/cmvr_runtime.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include "cmvr/config/cmvr_es_config/cmvr_es_config.pb.h" -#include "cmvr/config/device_manager_config/device_manager_config.pb.h" -#include "cmvr/config/grpc_server_config/grpc_server_config.pb.h" -#include "cmvr/config/logger_config/logger_config.pb.h" -#include "cmvr/config/task_manager_config/task_manager_config.pb.h" -#include "common/io/proto_file_io.h" - -namespace { - -class TempConfigTree { -public: - TempConfigTree() - { - std::array pattern{}; - const std::string value = - "/tmp/cmvr-runtime-lifecycle-XXXXXX"; - std::copy(value.begin(), value.end(), pattern.begin()); - char* created = ::mkdtemp(pattern.data()); - if (created) { - root_ = created; - } - } - - ~TempConfigTree() - { - if (root_.empty()) { - return; - } - std::error_code error; - std::filesystem::remove_all(root_, error); - } - - bool valid() const { return !root_.empty(); } - - template - bool write(const std::string& name, const Message& message) const - { - return ProtoMessageIo::setProtoToAsciiFile( - message, (root_ / name).string()); - } - - std::string path(const std::string& name) const - { - return (root_ / name).string(); - } - - bool writeLogger() const - { - cmvr::config::LoggerRootConfig root; - auto* logger = root.mutable_logger(); - logger->set_minimum_level( - cmvr::config::LOG_LEVEL_INFO); - auto* route = logger->add_routes(); - route->set_level(cmvr::config::LOG_LEVEL_INFO); - route->set_terminal(false); - route->set_file(false); - return write("logger.pb.txt", root); - } - - bool writeRoot() const - { - cmvr::config::CMVRESRootConfig root; - auto* config = root.mutable_cmvr_es(); - config->set_logger_config_file("logger.pb.txt"); - config->set_device_manager_config_file( - "device_manager.pb.txt"); - config->set_task_manager_config_file( - "task_manager.pb.txt"); - return write("cmvr_es.pb.txt", root); - } - -private: - std::filesystem::path root_; -}; - -class OccupiedTcpPort { -public: - OccupiedTcpPort() - { - fd_ = ::socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0); - if (fd_ < 0) { - return; - } - - sockaddr_in address{}; - address.sin_family = AF_INET; - address.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - address.sin_port = 0; - if (::bind(fd_, reinterpret_cast(&address), - sizeof(address)) != 0 || - ::listen(fd_, 1) != 0) { - ::close(fd_); - fd_ = -1; - return; - } - - socklen_t length = sizeof(address); - if (::getsockname(fd_, - reinterpret_cast(&address), - &length) != 0) { - ::close(fd_); - fd_ = -1; - return; - } - port_ = ntohs(address.sin_port); - } - - ~OccupiedTcpPort() - { - if (fd_ >= 0) { - ::close(fd_); - } - } - - bool valid() const { return fd_ >= 0 && port_ != 0; } - std::string port() const { return std::to_string(port_); } - -private: - int fd_{-1}; - unsigned short port_{0}; -}; - -TEST(RuntimeLifecycleTest, EnabledDeviceInitFailureFailsRuntimeInit) -{ - TempConfigTree tree; - ASSERT_TRUE(tree.valid()); - ASSERT_TRUE(tree.writeLogger()); - ASSERT_TRUE(tree.writeRoot()); - - cmvr::config::DeviceManagerRootConfig devices; - auto* entry = - devices.mutable_device_manager()->add_devices(); - entry->set_id("unsupported"); - entry->set_type( - cmvr::config::DeviceConfigEntry::DEVICE_TYPE_UNKNOWN); - entry->set_enable(true); - ASSERT_TRUE(tree.write("device_manager.pb.txt", devices)); - - cmvr::config::TaskManagerRootConfig tasks; - ASSERT_TRUE(tree.write("task_manager.pb.txt", tasks)); - - cmvr::Runtime runtime; - EXPECT_FALSE(runtime.init(tree.path("cmvr_es.pb.txt"))); - EXPECT_FALSE(runtime.initialized()); - EXPECT_FALSE(runtime.tasksStarted()); -} - -TEST(RuntimeLifecycleTest, EnabledTaskInitFailureFailsRuntimeInit) -{ - TempConfigTree tree; - ASSERT_TRUE(tree.valid()); - ASSERT_TRUE(tree.writeLogger()); - ASSERT_TRUE(tree.writeRoot()); - - cmvr::config::DeviceManagerRootConfig devices; - ASSERT_TRUE(tree.write("device_manager.pb.txt", devices)); - - cmvr::config::TaskManagerRootConfig tasks; - auto* entry = tasks.mutable_task_manager()->add_tasks(); - entry->set_id("unsupported"); - entry->set_type( - cmvr::config::TaskConfigEntry::TASK_TYPE_UNKNOWN); - entry->set_enable(true); - entry->set_run_mode( - cmvr::config::TaskConfigEntry:: - TASK_RUN_MODE_BLOCKING_SERVICE); - ASSERT_TRUE(tree.write("task_manager.pb.txt", tasks)); - - cmvr::Runtime runtime; - EXPECT_FALSE(runtime.init(tree.path("cmvr_es.pb.txt"))); - EXPECT_FALSE(runtime.initialized()); - EXPECT_FALSE(runtime.tasksStarted()); -} - -TEST(RuntimeLifecycleTest, - TaskConfigLoadFailureRollsBackDeviceManagerSingleton) -{ - TempConfigTree first_tree; - ASSERT_TRUE(first_tree.valid()); - ASSERT_TRUE(first_tree.writeLogger()); - ASSERT_TRUE(first_tree.writeRoot()); - - cmvr::config::DeviceManagerRootConfig first_devices; - first_devices.mutable_device_manager()->set_name("first"); - ASSERT_TRUE(first_tree.write( - "device_manager.pb.txt", first_devices)); - // Deliberately do not create task_manager.pb.txt. - - cmvr::Runtime runtime; - ASSERT_FALSE( - runtime.init(first_tree.path("cmvr_es.pb.txt"))); - ASSERT_FALSE(runtime.initialized()); - - TempConfigTree second_tree; - ASSERT_TRUE(second_tree.valid()); - ASSERT_TRUE(second_tree.writeLogger()); - ASSERT_TRUE(second_tree.writeRoot()); - - cmvr::config::DeviceManagerRootConfig second_devices; - second_devices.mutable_device_manager()->set_name("second"); - ASSERT_TRUE(second_tree.write( - "device_manager.pb.txt", second_devices)); - cmvr::config::TaskManagerRootConfig second_tasks; - ASSERT_TRUE(second_tree.write( - "task_manager.pb.txt", second_tasks)); - - ASSERT_TRUE( - runtime.init(second_tree.path("cmvr_es.pb.txt"))); - EXPECT_EQ(runtime.deviceManager().name(), "second"); -} - -TEST(RuntimeLifecycleTest, GrpcBindFailureDoesNotMarkTasksStarted) -{ - OccupiedTcpPort occupied_port; - ASSERT_TRUE(occupied_port.valid()); - - TempConfigTree tree; - ASSERT_TRUE(tree.valid()); - ASSERT_TRUE(tree.writeLogger()); - ASSERT_TRUE(tree.writeRoot()); - - cmvr::config::DeviceManagerRootConfig devices; - ASSERT_TRUE(tree.write("device_manager.pb.txt", devices)); - - cmvr::config::GRPCServerRootConfig grpc; - auto* grpc_config = grpc.mutable_grpc_server(); - grpc_config->set_id("grpc_server"); - grpc_config->set_host("127.0.0.1"); - grpc_config->set_port(occupied_port.port()); - ASSERT_TRUE(tree.write("grpc.pb.txt", grpc)); - - cmvr::config::TaskManagerRootConfig tasks; - auto* entry = tasks.mutable_task_manager()->add_tasks(); - entry->set_id("grpc_server"); - entry->set_type( - cmvr::config::TaskConfigEntry::TASK_TYPE_GRPC_SERVER); - entry->set_enable(true); - entry->set_run_mode( - cmvr::config::TaskConfigEntry:: - TASK_RUN_MODE_BLOCKING_SERVICE); - entry->set_config_file("grpc.pb.txt"); - ASSERT_TRUE(tree.write("task_manager.pb.txt", tasks)); - - cmvr::Runtime runtime; - ASSERT_TRUE(runtime.init(tree.path("cmvr_es.pb.txt"))); - EXPECT_FALSE(runtime.startTasks()); - EXPECT_FALSE(runtime.tasksStarted()); - EXPECT_FALSE(runtime.taskManager().running()); -} - -} // namespace diff --git a/cmvr-es/service/README.md b/cmvr-es/service/README.md index 39a1ee13..5c7c8c53 100644 --- a/cmvr-es/service/README.md +++ b/cmvr-es/service/README.md @@ -121,7 +121,6 @@ ActionQueue 遵循以下执行语义: - 实现:[`grpc/server/include/grpc_motor_service.h`](grpc/server/include/grpc_motor_service.h) 和 [`grpc/server/src/grpc_motor_service.cpp`](grpc/server/src/grpc_motor_service.cpp) - 注册:[`../task/grpc_server_task/src/grpc_server_task.cpp`](../task/grpc_server_task/src/grpc_server_task.cpp) -- 单元测试:[`grpc/server/tests/grpc_motor_service_test.cpp`](grpc/server/tests/grpc_motor_service_test.cpp) 服务按单电机仲裁。同步 Profile 命令、Cyclic Position/Velocity 双向流、 `setEnabled`、状态读取和软件 `emergencyStop` 共用同一控制权状态: diff --git a/cmvr-es/service/grpc/CMakeLists.txt b/cmvr-es/service/grpc/CMakeLists.txt index cff56bd2..4214e37d 100644 --- a/cmvr-es/service/grpc/CMakeLists.txt +++ b/cmvr-es/service/grpc/CMakeLists.txt @@ -49,136 +49,6 @@ add_library(cmvr_es::service ALIAS service) install(TARGETS service LIBRARY DESTINATION lib) if(BUILD_TESTING) - add_executable(stop_all_admission_gate_test - stop_all/tests/stop_all_admission_gate_test.cpp - stop_all/src/stop_all_admission_gate.cpp - ) - target_include_directories(stop_all_admission_gate_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(stop_all_admission_gate_test PRIVATE - gtest - gtest_main - pthread - ) - add_test( - NAME stop_all_admission_gate_test - COMMAND stop_all_admission_gate_test - ) - set_tests_properties(stop_all_admission_gate_test PROPERTIES TIMEOUT 10) - - add_executable(stop_operation_dispatcher_test - stop_all/tests/stop_operation_dispatcher_test.cpp - stop_all/src/stop_operation_dispatcher.cpp - ) - target_include_directories(stop_operation_dispatcher_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(stop_operation_dispatcher_test PRIVATE - gtest - gtest_main - pthread - ) - add_test( - NAME stop_operation_dispatcher_test - COMMAND stop_operation_dispatcher_test - ) - set_tests_properties(stop_operation_dispatcher_test PROPERTIES TIMEOUT 10) - - add_executable(camera_operational_activity_registry_test - server/tests/camera_operational_activity_registry_test.cpp - ) - target_include_directories(camera_operational_activity_registry_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(camera_operational_activity_registry_test PRIVATE - cmvr_es::proto - cmvr_es::camera_operational_activity_registry - gtest - gtest_main - pthread - ) - add_test( - NAME camera_operational_activity_registry_test - COMMAND camera_operational_activity_registry_test - ) - set_tests_properties(camera_operational_activity_registry_test PROPERTIES - TIMEOUT 10) - - add_executable(camera_ptz_activity_registry_test - server/tests/camera_ptz_activity_registry_test.cpp - server/src/camera_ptz_activity_registry.cpp - stop_all/src/stop_all_admission_gate.cpp - ) - target_include_directories(camera_ptz_activity_registry_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(camera_ptz_activity_registry_test PRIVATE - cmvr_es::proto - gtest - gtest_main - pthread - ) - add_test( - NAME camera_ptz_activity_registry_test - COMMAND camera_ptz_activity_registry_test - ) - set_tests_properties(camera_ptz_activity_registry_test PROPERTIES TIMEOUT 10) - - add_executable(media_activity_coordinator_test - server/tests/media_activity_coordinator_test.cpp - server/src/media_activity_coordinator.cpp - stop_all/src/stop_all_admission_gate.cpp - ) - target_include_directories(media_activity_coordinator_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(media_activity_coordinator_test PRIVATE - cmvr_es::logging - pthread - ) - add_test( - NAME media_activity_coordinator_test - COMMAND media_activity_coordinator_test - ) - set(_grpc_media_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _grpc_media_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(media_activity_coordinator_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_grpc_media_test_environment}" - ) - - add_executable(motor_activity_coordinator_test - server/tests/motor_activity_coordinator_test.cpp - server/src/motor_activity_coordinator.cpp - ) - target_include_directories(motor_activity_coordinator_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(motor_activity_coordinator_test PRIVATE - cmvr_es::logging - pthread - ) - add_test( - NAME motor_activity_coordinator_test - COMMAND motor_activity_coordinator_test - ) - set_tests_properties(motor_activity_coordinator_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_grpc_media_test_environment}" - ) - add_executable(grpc_camera_stream_policy_test server/tests/grpc_camera_stream_policy_test.cpp ) @@ -191,306 +61,6 @@ if(BUILD_TESTING) COMMAND grpc_camera_stream_policy_test ) set_tests_properties(grpc_camera_stream_policy_test PROPERTIES TIMEOUT 10) - - add_executable(grpc_system_service_test - server/tests/grpc_system_service_test.cpp - ) - target_include_directories(grpc_system_service_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager - ) - target_link_libraries(grpc_system_service_test - PRIVATE - service - cmvr_es::proto - gtest - gtest_main - pthread - ) - add_test( - NAME grpc_system_service_test - COMMAND grpc_system_service_test - ) - set(_grpc_system_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _grpc_system_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(grpc_system_service_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_grpc_system_test_environment}" - ) - - add_executable(grpc_error_logging_interceptor_test - server/tests/grpc_error_logging_interceptor_test.cpp - server/src/grpc_error_logging_interceptor.cpp - ) - target_include_directories(grpc_error_logging_interceptor_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(grpc_error_logging_interceptor_test - PRIVATE - cmvr_es::logging - cmvr_es::proto - gtest - gtest_main - pthread - ) - add_test( - NAME grpc_error_logging_interceptor_test - COMMAND grpc_error_logging_interceptor_test - ) - set_tests_properties(grpc_error_logging_interceptor_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_grpc_system_test_environment}" - ) - - add_executable(grpc_security_test - server/tests/grpc_security_test.cpp - server/src/grpc_security.cpp - ) - target_include_directories(grpc_security_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(grpc_security_test - PRIVATE - cmvr_es::proto - gtest - gtest_main - pthread - ) - add_test( - NAME grpc_security_test - COMMAND grpc_security_test - ) - set_tests_properties(grpc_security_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_grpc_system_test_environment}" - ) - - add_executable(grpc_command_transaction_test - server/tests/grpc_command_transaction_test.cpp - server/src/grpc_command_transaction.cpp - server/src/grpc_safety_proto.cpp - server/src/grpc_security.cpp - ) - target_include_directories(grpc_command_transaction_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(grpc_command_transaction_test PRIVATE - cmvr_es::safety_manager - cmvr_es::proto - gtest - gtest_main - pthread - ) - add_test( - NAME grpc_command_transaction_test - COMMAND grpc_command_transaction_test - ) - set_tests_properties(grpc_command_transaction_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_grpc_system_test_environment}" - ) - - add_executable(grpc_arm_service_test - server/tests/grpc_arm_service_test.cpp - ) - target_include_directories(grpc_arm_service_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager - ) - target_link_libraries(grpc_arm_service_test - PRIVATE - service - cmvr_es::proto - gtest - gtest_main - pthread - ) - add_test( - NAME grpc_arm_service_test - COMMAND grpc_arm_service_test - ) - set_tests_properties(grpc_arm_service_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_grpc_system_test_environment}" - ) - - add_executable(grpc_arm_teleop_service_test - server/tests/grpc_arm_teleop_service_test.cpp - ) - target_include_directories(grpc_arm_teleop_service_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(grpc_arm_teleop_service_test - PRIVATE - service - cmvr_es::proto - gtest - gtest_main - pthread - ) - add_test( - NAME grpc_arm_teleop_service_test - COMMAND grpc_arm_teleop_service_test - ) - set(_grpc_arm_teleop_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _grpc_arm_teleop_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(grpc_arm_teleop_service_test PROPERTIES - TIMEOUT 20 - ENVIRONMENT "${_grpc_arm_teleop_test_environment}" - ) - - add_executable(grpc_robot_arm_teleop_backend_test - server/tests/grpc_robot_arm_teleop_backend_test.cpp - ) - target_include_directories(grpc_robot_arm_teleop_backend_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ) - target_link_libraries(grpc_robot_arm_teleop_backend_test - PRIVATE - service - cmvr_es::proto - gtest - gtest_main - pthread - ) - add_test( - NAME grpc_robot_arm_teleop_backend_test - COMMAND grpc_robot_arm_teleop_backend_test - ) - set_tests_properties(grpc_robot_arm_teleop_backend_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_grpc_arm_teleop_test_environment}" - ) - - add_executable(grpc_motor_service_test - server/tests/grpc_motor_service_test.cpp - ) - target_include_directories(grpc_motor_service_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager - ) - target_link_libraries(grpc_motor_service_test - PRIVATE - service - gtest - gtest_main - pthread - ) - add_test( - NAME grpc_motor_service_test - COMMAND grpc_motor_service_test - ) - set(_grpc_motor_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _grpc_motor_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(grpc_motor_service_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_grpc_motor_test_environment}" - ) - - add_executable(grpc_agv_service_test - server/tests/grpc_agv_service_test.cpp - ) - target_include_directories(grpc_agv_service_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager - ) - target_link_libraries(grpc_agv_service_test - PRIVATE - service - gtest - gtest_main - pthread - ) - add_test( - NAME grpc_agv_service_test - COMMAND grpc_agv_service_test - ) - set(_grpc_agv_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}" - ) - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _grpc_agv_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(grpc_agv_service_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_grpc_agv_test_environment}" - ) - - add_executable(grpc_head_service_test - server/tests/grpc_head_service_test.cpp - ) - target_include_directories(grpc_head_service_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager - ) - target_link_libraries(grpc_head_service_test - PRIVATE - service - cmvr_es::proto - gtest - gtest_main - pthread - ) - add_test( - NAME grpc_head_service_test - COMMAND grpc_head_service_test - ) - set_tests_properties(grpc_head_service_test PROPERTIES - TIMEOUT 15 - ENVIRONMENT "${_grpc_system_test_environment}" - ) - - add_executable(grpc_dexhand_service_test - server/tests/grpc_dexhand_service_test.cpp - ) - target_include_directories(grpc_dexhand_service_test - PRIVATE - ${CMAKE_SOURCE_DIR}/cmvr-es - ${CMAKE_SOURCE_DIR}/cmvr-es/manager/device_manager - ) - target_link_libraries(grpc_dexhand_service_test - PRIVATE - service - cmvr_es::proto - gtest - gtest_main - pthread - ) - add_test( - NAME grpc_dexhand_service_test - COMMAND grpc_dexhand_service_test - ) - set_tests_properties(grpc_dexhand_service_test PROPERTIES - TIMEOUT 15 - ENVIRONMENT "${_grpc_system_test_environment}" - ) - endif() # -------------------------------------------------------- diff --git a/cmvr-es/service/grpc/client/CMakeLists.txt b/cmvr-es/service/grpc/client/CMakeLists.txt index 8dd1b377..eac4e7e4 100644 --- a/cmvr-es/service/grpc/client/CMakeLists.txt +++ b/cmvr-es/service/grpc/client/CMakeLists.txt @@ -14,25 +14,3 @@ target_link_libraries(arm_teleop_client add_library(cmvr_es::arm_teleop_client ALIAS arm_teleop_client) install(TARGETS arm_teleop_client ARCHIVE DESTINATION lib) - -if(BUILD_TESTING) - add_executable(grpc_arm_teleop_client_test - tests/grpc_arm_teleop_client_test.cpp - ) - target_compile_features(grpc_arm_teleop_client_test PRIVATE cxx_std_17) - target_link_libraries(grpc_arm_teleop_client_test - PRIVATE - cmvr_es::arm_teleop_client - Threads::Threads - ) - add_test(NAME grpc_arm_teleop_client_test COMMAND grpc_arm_teleop_client_test) - set(_arm_teleop_client_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}") - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _arm_teleop_client_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(grpc_arm_teleop_client_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_arm_teleop_client_test_environment}") -endif() diff --git a/cmvr-es/service/grpc/client/tests/grpc_arm_teleop_client_test.cpp b/cmvr-es/service/grpc/client/tests/grpc_arm_teleop_client_test.cpp deleted file mode 100644 index 3e1caa7c..00000000 --- a/cmvr-es/service/grpc/client/tests/grpc_arm_teleop_client_test.cpp +++ /dev/null @@ -1,220 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "cmvr/api/arm_teleop_v1.grpc.pb.h" -#include "service/grpc/client/include/grpc_arm_teleop_client.h" - -namespace { - -using namespace std::chrono_literals; -namespace api = cmvr::api::armteleop::v1; - -class TestArmTeleopService final : public api::ArmTeleopService::Service { -public: - grpc::Status Teleoperate( - grpc::ServerContext*, - grpc::ServerReaderWriter* stream) override - { - api::ClientFrame frame; - if (!stream->Read(&frame) || !frame.has_open()) { - return grpc::Status( - grpc::StatusCode::INVALID_ARGUMENT, - "OpenSession must be first"); - } - - { - std::lock_guard lock(mutex_); - open_received_ = true; - } - condition_.notify_all(); - - api::ServerFrame opened; - opened.mutable_status()->set_session_id("client-test-session"); - opened.mutable_status()->set_phase(api::SESSION_PHASE_OPENED); - if (!stream->Write(opened)) { - return grpc::Status::OK; - } - - while (stream->Read(&frame)) { - if (frame.has_heartbeat()) { - heartbeat_received_.store(true); - condition_.notify_all(); - } - } - handler_finished_.store(true); - condition_.notify_all(); - return grpc::Status::OK; - } - - bool waitForOpen(const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return condition_.wait_for(lock, timeout, [this] { return open_received_; }); - } - - bool waitForHeartbeat(const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return condition_.wait_for( - lock, timeout, [this] { return heartbeat_received_.load(); }); - } - - bool waitForHandlerFinish(const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return condition_.wait_for( - lock, timeout, [this] { return handler_finished_.load(); }); - } - -private: - std::mutex mutex_; - std::condition_variable condition_; - bool open_received_{false}; - std::atomic heartbeat_received_{false}; - std::atomic handler_finished_{false}; -}; - -int fail(const std::string& detail) -{ - std::cerr << "grpc_arm_teleop_client_test: " << detail << '\n'; - return 1; -} - -} // namespace - -int main() -{ - TestArmTeleopService service; - const std::string socket_path = - "/tmp/cmvr_arm_teleop_client_test_" + - std::to_string(static_cast(::getpid())) + ".sock"; - std::remove(socket_path.c_str()); - const std::string endpoint = "unix:" + socket_path; - - grpc::ServerBuilder builder; - builder.AddListeningPort( - endpoint, - grpc::InsecureServerCredentials()); - builder.RegisterService(&service); - std::unique_ptr server = builder.BuildAndStart(); - if (!server) { - return fail("failed to start in-process gRPC server"); - } - - auto channel = grpc::CreateChannel( - endpoint, - grpc::InsecureChannelCredentials()); - cmvr::teleop::GrpcArmTeleopClient client(channel); - - api::OpenSession open; - open.set_protocol_major(1); - open.set_protocol_minor(0); - open.set_client_instance_id("grpc-client-test"); - open.mutable_expected_robot()->set_robot_id("test-arm"); - open.set_watchdog_timeout_ms(100); - open.set_requested_lease_ms(500); - - std::mutex frame_mutex; - std::condition_variable frame_condition; - bool opened_received = false; - grpc::Status session_status; - std::thread session_thread([&] { - session_status = client.runSession( - open, - [&](const api::ServerFrame& frame) { - if (frame.has_status() && - frame.status().phase() == api::SESSION_PHASE_OPENED) { - { - std::lock_guard lock(frame_mutex); - opened_received = true; - } - frame_condition.notify_all(); - } - }); - }); - - if (!service.waitForOpen(2s)) { - client.tryCancel(); - session_thread.join(); - server->Shutdown(); - return fail("server did not receive OpenSession"); - } - { - std::unique_lock lock(frame_mutex); - if (!frame_condition.wait_for(lock, 2s, [&] { return opened_received; })) { - client.tryCancel(); - session_thread.join(); - server->Shutdown(); - return fail("client did not receive OPENED status"); - } - } - if (!client.isSessionActive()) { - client.tryCancel(); - session_thread.join(); - server->Shutdown(); - return fail("client did not expose an active session"); - } - const std::uint64_t generation = - client.activeSessionGeneration(); - if (generation == 0) { - client.tryCancel(); - session_thread.join(); - server->Shutdown(); - return fail("active stream did not expose a session generation"); - } - - api::ClientHeartbeat heartbeat; - heartbeat.set_sequence(1); - if (client.sendHeartbeat(heartbeat, generation + 1)) { - client.tryCancel(); - session_thread.join(); - server->Shutdown(); - return fail("stale session generation was allowed to write"); - } - if (!client.sendHeartbeat(heartbeat, generation) || - !service.waitForHeartbeat(2s)) { - client.tryCancel(); - session_thread.join(); - server->Shutdown(); - return fail("heartbeat did not traverse the active stream"); - } - - const auto cancel_begin = std::chrono::steady_clock::now(); - client.tryCancel(); - session_thread.join(); - const auto cancel_elapsed = std::chrono::steady_clock::now() - cancel_begin; - - if (cancel_elapsed > 2s) { - server->Shutdown(); - return fail("TryCancel did not unblock and join the session promptly"); - } - if (session_status.error_code() != grpc::StatusCode::CANCELLED) { - server->Shutdown(); - return fail( - "cancelled session returned unexpected status: " + - std::to_string(session_status.error_code())); - } - if (client.isSessionActive()) { - server->Shutdown(); - return fail("client retained an active stream after cancellation"); - } - if (!service.waitForHandlerFinish(2s)) { - server->Shutdown(); - return fail("server handler did not observe client cancellation"); - } - - server->Shutdown(); - std::remove(socket_path.c_str()); - std::cout << "grpc_arm_teleop_client_test: PASS\n"; - return 0; -} diff --git a/cmvr-es/service/grpc/server/tests/camera_operational_activity_registry_test.cpp b/cmvr-es/service/grpc/server/tests/camera_operational_activity_registry_test.cpp deleted file mode 100644 index 973fdd9e..00000000 --- a/cmvr-es/service/grpc/server/tests/camera_operational_activity_registry_test.cpp +++ /dev/null @@ -1,491 +0,0 @@ -#include "service/grpc/server/include/camera_operational_activity_registry.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" - -namespace cmvr::service { -namespace { - -class TestCamera final : public device::AbstractCamera { -public: - explicit TestCamera(std::string id) - { - id_ = std::move(id); - state_.is_initialized = true; - } - - std::string typeName() const override { return "TestCamera"; } - - void getState(device::CameraState& state) override - { - std::lock_guard lock(mutex_); - state = state_; - } - - bool start() override - { - ++lifecycle_start_calls_; - return true; - } - - bool stop() override - { - ++lifecycle_stop_calls_; - std::lock_guard lock(mutex_); - operational_active_ = false; - state_.is_opened = false; - return !fail_lifecycle_stop_; - } - - bool startOperationalActivity() override - { - ++operational_start_calls_; - { - std::unique_lock lock(mutex_); - start_entered_ = true; - condition_.notify_all(); - condition_.wait(lock, [this] { return !block_start_; }); - if (fail_operational_start_) { - return false; - } - operational_active_ = true; - state_.is_opened = true; - } - return true; - } - - bool stopOperationalActivity() override - { - ++operational_stop_calls_; - std::unique_lock lock(mutex_); - stop_entered_ = true; - condition_.notify_all(); - condition_.wait(lock, [this] { return !block_stop_; }); - if (fail_operational_stop_) { - return false; - } - operational_active_ = false; - state_.is_opened = false; - return true; - } - - void setFailOperationalStart(const bool fail) - { - fail_operational_start_ = fail; - } - - void setFailOperationalStop(const bool fail) - { - fail_operational_stop_ = fail; - } - - void blockStop() - { - std::lock_guard lock(mutex_); - block_stop_ = true; - stop_entered_ = false; - } - - void waitForStopEntered() - { - std::unique_lock lock(mutex_); - condition_.wait(lock, [this] { return stop_entered_; }); - } - - void releaseStop() - { - { - std::lock_guard lock(mutex_); - block_stop_ = false; - } - condition_.notify_all(); - } - - void blockStart() - { - std::lock_guard lock(mutex_); - block_start_ = true; - start_entered_ = false; - } - - void waitForStartEntered() - { - std::unique_lock lock(mutex_); - condition_.wait(lock, [this] { return start_entered_; }); - } - - void releaseStart() - { - { - std::lock_guard lock(mutex_); - block_start_ = false; - } - condition_.notify_all(); - } - - bool operationalActive() const - { - std::lock_guard lock(mutex_); - return operational_active_; - } - - int lifecycleStartCalls() const { return lifecycle_start_calls_; } - int lifecycleStopCalls() const { return lifecycle_stop_calls_; } - int operationalStartCalls() const { return operational_start_calls_; } - int operationalStopCalls() const { return operational_stop_calls_; } - -private: - mutable std::mutex mutex_; - std::condition_variable condition_; - bool operational_active_{false}; - bool fail_operational_start_{false}; - bool fail_operational_stop_{false}; - bool fail_lifecycle_stop_{false}; - bool block_start_{false}; - bool start_entered_{false}; - bool block_stop_{false}; - bool stop_entered_{false}; - std::atomic lifecycle_start_calls_{0}; - std::atomic lifecycle_stop_calls_{0}; - std::atomic operational_start_calls_{0}; - std::atomic operational_stop_calls_{0}; -}; - -class CameraOperationalActivityRegistryTest : public ::testing::Test { -protected: - void SetUp() override - { - globalStopAllAdmissionGate().clearForTesting(); - } - - void TearDown() override - { - globalStopAllAdmissionGate().clearForTesting(); - } -}; - -TEST_F(CameraOperationalActivityRegistryTest, - StopAllStopsTrackedActivityWithoutLifecycleStopAndCanRestart) -{ - CameraOperationalActivityRegistry registry; - auto camera = std::make_shared("camera"); - - EXPECT_EQ( - registry.start(camera->id(), camera), - CameraOperationalActivityRegistry::DispatchResult::Success); - EXPECT_TRUE(camera->operationalActive()); - EXPECT_EQ(registry.activeCameraCount(), 1U); - - auto ticket = globalStopAllAdmissionGate().beginStopAll(); - ASSERT_TRUE(ticket.valid()); - EXPECT_TRUE(registry.stopAllActivities()); - EXPECT_FALSE(camera->operationalActive()); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); - EXPECT_EQ(camera->operationalStopCalls(), 1); - EXPECT_EQ(registry.activeCameraCount(), 0U); - ASSERT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); - - EXPECT_EQ( - registry.start(camera->id(), camera), - CameraOperationalActivityRegistry::DispatchResult::Success); - EXPECT_TRUE(camera->operationalActive()); - EXPECT_EQ(camera->operationalStartCalls(), 2); - EXPECT_EQ(camera->lifecycleStartCalls(), 0); -} - -TEST_F(CameraOperationalActivityRegistryTest, - FailedOperationalStopRemainsTrackedAndKeepsAdmissionClosed) -{ - CameraOperationalActivityRegistry registry; - auto camera = std::make_shared("camera"); - ASSERT_EQ( - registry.start(camera->id(), camera), - CameraOperationalActivityRegistry::DispatchResult::Success); - - camera->setFailOperationalStop(true); - auto ticket = globalStopAllAdmissionGate().beginStopAll(); - std::vector failures; - EXPECT_FALSE(registry.stopAllActivities(&failures)); - EXPECT_EQ(registry.activeCameraCount(), 1U); - ASSERT_EQ(failures.size(), 1U); - EXPECT_EQ( - registry.start(camera->id(), camera), - CameraOperationalActivityRegistry::DispatchResult::RejectedByStopAll); - EXPECT_FALSE(globalStopAllAdmissionGate().finishStopAll(ticket, false)); - - camera->setFailOperationalStop(false); - ticket = globalStopAllAdmissionGate().beginStopAll(); - EXPECT_TRUE(registry.stopAllActivities()); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); - EXPECT_EQ(registry.activeCameraCount(), 0U); -} - -TEST_F(CameraOperationalActivityRegistryTest, - StopAllWaitsForRacingStartThenStopsTheStartedActivity) -{ - CameraOperationalActivityRegistry registry; - auto camera = std::make_shared("camera"); - camera->blockStart(); - - CameraOperationalActivityRegistry::DispatchResult start_result = - CameraOperationalActivityRegistry::DispatchResult::DeviceFailure; - std::thread start_thread([&] { - start_result = registry.start(camera->id(), camera); - }); - camera->waitForStartEntered(); - - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - std::atomic stop_returned{false}; - bool stop_result = false; - std::thread stop_thread([&] { - stop_result = registry.stopAllActivities(); - stop_returned = true; - }); - - std::this_thread::yield(); - EXPECT_FALSE(stop_returned.load()); - camera->releaseStart(); - start_thread.join(); - stop_thread.join(); - - EXPECT_EQ( - start_result, - CameraOperationalActivityRegistry::DispatchResult::Success); - EXPECT_TRUE(stop_result); - EXPECT_FALSE(camera->operationalActive()); - EXPECT_EQ(camera->operationalStopCalls(), 1); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); -} - -TEST_F(CameraOperationalActivityRegistryTest, - TrackedIdsExposeAStartThatIsStillInsideDriverIo) -{ - CameraOperationalActivityRegistry registry; - auto camera = std::make_shared("camera.pending"); - camera->blockStart(); - - CameraOperationalActivityRegistry::DispatchResult start_result = - CameraOperationalActivityRegistry::DispatchResult::DeviceFailure; - std::thread start_thread([&] { - start_result = registry.start(camera->id(), camera); - }); - camera->waitForStartEntered(); - - const auto snapshot_started = std::chrono::steady_clock::now(); - EXPECT_EQ( - registry.trackedDeviceIds(), - (std::vector{"camera.pending"})); - EXPECT_LT( - std::chrono::steady_clock::now() - snapshot_started, - std::chrono::milliseconds(100)); - - camera->releaseStart(); - start_thread.join(); - EXPECT_EQ( - start_result, - CameraOperationalActivityRegistry::DispatchResult::Success); -} - -TEST_F(CameraOperationalActivityRegistryTest, - DefaultOperationalStopFailsClosed) -{ - class UnsupportedCamera final : public device::AbstractCamera { - public: - UnsupportedCamera() { id_ = "unsupported"; } - std::string typeName() const override { return "UnsupportedCamera"; } - void getState(device::CameraState& state) override { state = {}; } - }; - - CameraOperationalActivityRegistry registry; - auto camera = std::make_shared(); - ASSERT_EQ( - registry.start(camera->id(), camera), - CameraOperationalActivityRegistry::DispatchResult::Success); - - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - EXPECT_FALSE(registry.stopAllActivities()); - EXPECT_EQ(registry.activeCameraCount(), 1U); - EXPECT_FALSE(globalStopAllAdmissionGate().finishStopAll(ticket, false)); -} - -TEST_F(CameraOperationalActivityRegistryTest, - StopForDeviceIsSelectiveAndActiveIdsReflectFailures) -{ - CameraOperationalActivityRegistry registry; - auto first = std::make_shared("camera.first"); - auto second = std::make_shared("camera.second"); - ASSERT_EQ( - registry.start(first->id(), first), - CameraOperationalActivityRegistry::DispatchResult::Success); - ASSERT_EQ( - registry.start(second->id(), second), - CameraOperationalActivityRegistry::DispatchResult::Success); - EXPECT_EQ( - registry.activeDeviceIds(), - (std::vector{"camera.first", "camera.second"})); - EXPECT_EQ( - registry.trackedDeviceIds(), - (std::vector{"camera.first", "camera.second"})); - - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - first->setFailOperationalStop(true); - std::vector failures; - EXPECT_FALSE(registry.stopActivitiesForDevice(first->id(), &failures)); - EXPECT_EQ(failures.size(), 1U); - EXPECT_TRUE(first->operationalActive()); - EXPECT_TRUE(second->operationalActive()); - EXPECT_EQ(second->operationalStopCalls(), 0); - - first->setFailOperationalStop(false); - EXPECT_TRUE(registry.stopActivitiesForDevice(first->id())); - EXPECT_EQ( - registry.activeDeviceIds(), - (std::vector{"camera.second"})); - EXPECT_TRUE(registry.stopActivitiesForDevice("missing")); - EXPECT_TRUE(registry.stopAllActivities()); - EXPECT_TRUE(registry.activeDeviceIds().empty()); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); - EXPECT_EQ(first->lifecycleStopCalls(), 0); - EXPECT_EQ(second->lifecycleStopCalls(), 0); -} - -TEST_F(CameraOperationalActivityRegistryTest, - InventoryFallbackStopsOncePerStopAllRoundAndCanStopAgainLater) -{ - CameraOperationalActivityRegistry registry; - auto camera = std::make_shared("inventory-camera"); - ASSERT_TRUE(camera->startOperationalActivity()); - - auto ticket = globalStopAllAdmissionGate().beginStopAll(); - ASSERT_TRUE(ticket.valid()); - EXPECT_TRUE(registry.stopActivitiesForDevice(camera->id(), camera)); - EXPECT_TRUE(registry.stopActivitiesForDevice(camera->id(), camera)); - EXPECT_FALSE(camera->operationalActive()); - EXPECT_EQ(camera->operationalStopCalls(), 1); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); - ASSERT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); - - ASSERT_TRUE(camera->startOperationalActivity()); - ticket = globalStopAllAdmissionGate().beginStopAll(); - ASSERT_TRUE(ticket.valid()); - EXPECT_TRUE(registry.stopActivitiesForDevice(camera->id(), camera)); - EXPECT_FALSE(camera->operationalActive()); - EXPECT_EQ(camera->operationalStopCalls(), 2); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); -} - -TEST_F(CameraOperationalActivityRegistryTest, - TrackedCameraTakesPrecedenceOverInventoryFallback) -{ - CameraOperationalActivityRegistry registry; - auto tracked = std::make_shared("camera"); - auto fallback = std::make_shared("camera"); - ASSERT_EQ( - registry.start(tracked->id(), tracked), - CameraOperationalActivityRegistry::DispatchResult::Success); - ASSERT_TRUE(fallback->startOperationalActivity()); - - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - ASSERT_TRUE(ticket.valid()); - EXPECT_TRUE(registry.stopActivitiesForDevice( - tracked->id(), fallback)); - EXPECT_FALSE(tracked->operationalActive()); - EXPECT_EQ(tracked->operationalStopCalls(), 1); - EXPECT_TRUE(fallback->operationalActive()); - EXPECT_EQ(fallback->operationalStopCalls(), 0); - EXPECT_EQ(tracked->lifecycleStopCalls(), 0); - EXPECT_EQ(fallback->lifecycleStopCalls(), 0); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); -} - -TEST_F(CameraOperationalActivityRegistryTest, - ActiveDeviceIdCannotBeReboundToAnotherCameraInstance) -{ - CameraOperationalActivityRegistry registry; - auto original = std::make_shared("camera"); - auto replacement = std::make_shared("camera"); - ASSERT_EQ( - registry.start(original->id(), original), - CameraOperationalActivityRegistry::DispatchResult::Success); - - CameraOperationalActivityRegistry::ActivityToken replacement_token; - EXPECT_EQ( - registry.start( - replacement->id(), replacement, &replacement_token), - CameraOperationalActivityRegistry::DispatchResult::DeviceFailure); - EXPECT_FALSE(replacement_token.valid()); - EXPECT_TRUE(original->operationalActive()); - EXPECT_FALSE(replacement->operationalActive()); - EXPECT_EQ(replacement->operationalStartCalls(), 0); - - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - ASSERT_TRUE(ticket.valid()); - EXPECT_TRUE(registry.stopAllActivities()); - EXPECT_FALSE(original->operationalActive()); - EXPECT_EQ(original->operationalStopCalls(), 1); - EXPECT_EQ(replacement->operationalStopCalls(), 0); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); -} - -TEST_F(CameraOperationalActivityRegistryTest, - DifferentDevicesStopConcurrentlyAndSameDeviceStopIsSerialized) -{ - CameraOperationalActivityRegistry registry; - auto first = std::make_shared("camera.first"); - auto second = std::make_shared("camera.second"); - ASSERT_EQ( - registry.start(first->id(), first), - CameraOperationalActivityRegistry::DispatchResult::Success); - ASSERT_EQ( - registry.start(second->id(), second), - CameraOperationalActivityRegistry::DispatchResult::Success); - first->blockStop(); - second->blockStop(); - - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - std::thread first_stop([&] { - EXPECT_TRUE(registry.stopActivitiesForDevice(first->id())); - }); - first->waitForStopEntered(); - const auto snapshot_started = std::chrono::steady_clock::now(); - EXPECT_EQ( - registry.trackedDeviceIds(), - (std::vector{"camera.first", "camera.second"})); - EXPECT_LT( - std::chrono::steady_clock::now() - snapshot_started, - std::chrono::milliseconds(100)); - std::thread second_stop([&] { - EXPECT_TRUE(registry.stopActivitiesForDevice(second->id())); - }); - second->waitForStopEntered(); - - std::atomic matching_stop_returned{false}; - std::thread matching_stop([&] { - EXPECT_TRUE(registry.stopActivitiesForDevice(first->id())); - matching_stop_returned = true; - }); - std::this_thread::yield(); - EXPECT_FALSE(matching_stop_returned.load()); - - second->releaseStop(); - second_stop.join(); - first->releaseStop(); - first_stop.join(); - matching_stop.join(); - EXPECT_TRUE(matching_stop_returned.load()); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/camera_ptz_activity_registry_test.cpp b/cmvr-es/service/grpc/server/tests/camera_ptz_activity_registry_test.cpp deleted file mode 100644 index eec9ebe2..00000000 --- a/cmvr-es/service/grpc/server/tests/camera_ptz_activity_registry_test.cpp +++ /dev/null @@ -1,349 +0,0 @@ -#include "service/grpc/server/include/camera_ptz_activity_registry.h" - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" - -namespace cmvr::service { -namespace { - -class TestCamera final : public device::AbstractCamera { -public: - struct Call { - device::PtzCommand command; - bool stop; - int speed; - }; - - explicit TestCamera(std::string id) - { - id_ = std::move(id); - } - - std::string typeName() const override { return "TestCamera"; } - void getState(device::CameraState& state) override { state = {}; } - - bool controlPtz( - const device::PtzCommand command, - const bool stop, - const int speed) override - { - std::unique_lock lock(mutex_); - calls_.push_back({command, stop, speed}); - if (stop) { - stop_entered_ = true; - condition_.notify_all(); - condition_.wait(lock, [this] { return !block_stop_; }); - } - return !(stop && fail_stop_); - } - - bool stop() override - { - ++lifecycle_stop_calls_; - return true; - } - - std::vector calls() const - { - std::lock_guard lock(mutex_); - return calls_; - } - - void setFailStop(const bool fail) { fail_stop_ = fail; } - void blockStop() - { - std::lock_guard lock(mutex_); - block_stop_ = true; - stop_entered_ = false; - } - void waitForStopEntered() - { - std::unique_lock lock(mutex_); - condition_.wait(lock, [this] { return stop_entered_; }); - } - void releaseStop() - { - { - std::lock_guard lock(mutex_); - block_stop_ = false; - } - condition_.notify_all(); - } - int lifecycleStopCalls() const { return lifecycle_stop_calls_; } - -private: - mutable std::mutex mutex_; - std::condition_variable condition_; - std::vector calls_; - bool fail_stop_{false}; - bool block_stop_{false}; - bool stop_entered_{false}; - int lifecycle_stop_calls_{0}; -}; - -class CameraPtzActivityRegistryTest : public ::testing::Test { -protected: - void SetUp() override - { - globalStopAllAdmissionGate().clearForTesting(); - } - - void TearDown() override - { - globalStopAllAdmissionGate().clearForTesting(); - } -}; - -TEST_F(CameraPtzActivityRegistryTest, - StopAllMatchesEveryActiveStartAndNeverStopsLifecycle) -{ - CameraPtzActivityRegistry registry; - auto camera = std::make_shared("camera"); - - EXPECT_EQ( - registry.control( - camera->id(), camera, device::PtzCommand::PanLeft, false, 4), - CameraPtzActivityRegistry::DispatchResult::Success); - EXPECT_EQ( - registry.control( - camera->id(), camera, device::PtzCommand::ZoomIn, false, 7), - CameraPtzActivityRegistry::DispatchResult::Success); - - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - ASSERT_TRUE(ticket.valid()); - EXPECT_TRUE(registry.stopAllActivities()); - EXPECT_EQ(registry.activeCommandCount(), 0U); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); - ASSERT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); - - const auto calls = camera->calls(); - ASSERT_EQ(calls.size(), 4U); - EXPECT_FALSE(calls[0].stop); - EXPECT_FALSE(calls[1].stop); - EXPECT_TRUE(calls[2].stop); - EXPECT_TRUE(calls[3].stop); -} - -TEST_F(CameraPtzActivityRegistryTest, - FailedStopRemainsTrackedForRetryAndAdmissionRecovers) -{ - CameraPtzActivityRegistry registry; - auto camera = std::make_shared("camera"); - ASSERT_EQ( - registry.control( - camera->id(), camera, device::PtzCommand::TiltUp, false, 3), - CameraPtzActivityRegistry::DispatchResult::Success); - - auto ticket = globalStopAllAdmissionGate().beginStopAll(); - camera->setFailStop(true); - std::vector failures; - EXPECT_FALSE(registry.stopAllActivities(&failures)); - EXPECT_EQ(registry.activeCommandCount(), 1U); - ASSERT_FALSE(failures.empty()); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, false) == false); - - EXPECT_EQ( - registry.control( - camera->id(), camera, device::PtzCommand::ZoomOut, false, 5), - CameraPtzActivityRegistry::DispatchResult::RejectedByStopAll); - - ticket = globalStopAllAdmissionGate().beginStopAll(); - camera->setFailStop(false); - EXPECT_TRUE(registry.stopAllActivities()); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); - EXPECT_EQ( - registry.control( - camera->id(), camera, device::PtzCommand::ZoomOut, false, 5), - CameraPtzActivityRegistry::DispatchResult::Success); -} - -TEST_F(CameraPtzActivityRegistryTest, - ExplicitStopRemainsAvailableWhileStartAdmissionIsLatched) -{ - CameraPtzActivityRegistry registry; - auto camera = std::make_shared("camera"); - ASSERT_EQ( - registry.control( - camera->id(), camera, device::PtzCommand::PanLeft, false, 4), - CameraPtzActivityRegistry::DispatchResult::Success); - - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - ASSERT_TRUE(ticket.valid()); - EXPECT_FALSE(globalStopAllAdmissionGate().finishStopAll(ticket, false)); - EXPECT_EQ( - registry.control( - camera->id(), camera, device::PtzCommand::ZoomIn, false, 4), - CameraPtzActivityRegistry::DispatchResult::RejectedByStopAll); - EXPECT_EQ( - registry.control( - camera->id(), camera, device::PtzCommand::PanLeft, true, 4), - CameraPtzActivityRegistry::DispatchResult::Success); - EXPECT_EQ(registry.activeCommandCount(), 0U); - - const auto calls = camera->calls(); - ASSERT_EQ(calls.size(), 2U); - EXPECT_FALSE(calls.front().stop); - EXPECT_TRUE(calls.back().stop); -} - -TEST_F(CameraPtzActivityRegistryTest, - StopForDeviceIsSelectiveAndActiveIdsReflectFailures) -{ - CameraPtzActivityRegistry registry; - auto first = std::make_shared("camera.first"); - auto second = std::make_shared("camera.second"); - ASSERT_EQ( - registry.control( - first->id(), first, device::PtzCommand::PanLeft, false, 4), - CameraPtzActivityRegistry::DispatchResult::Success); - ASSERT_EQ( - registry.control( - second->id(), second, device::PtzCommand::ZoomIn, false, 7), - CameraPtzActivityRegistry::DispatchResult::Success); - EXPECT_EQ( - registry.activeDeviceIds(), - (std::vector{"camera.first", "camera.second"})); - EXPECT_EQ( - registry.trackedDeviceIds(), - (std::vector{"camera.first", "camera.second"})); - - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - first->setFailStop(true); - std::vector failures; - EXPECT_FALSE(registry.stopActivitiesForDevice(first->id(), &failures)); - EXPECT_EQ(registry.activeCommandCount(), 2U); - EXPECT_EQ(failures.size(), 1U); - EXPECT_EQ(second->calls().size(), 1U); - - first->setFailStop(false); - EXPECT_TRUE(registry.stopActivitiesForDevice(first->id())); - EXPECT_EQ(registry.activeCommandCount(), 1U); - EXPECT_EQ( - registry.activeDeviceIds(), - (std::vector{"camera.second"})); - EXPECT_TRUE(registry.stopActivitiesForDevice("missing")); - EXPECT_TRUE(registry.stopAllActivities()); - EXPECT_TRUE(registry.activeDeviceIds().empty()); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); - EXPECT_EQ(first->lifecycleStopCalls(), 0); - EXPECT_EQ(second->lifecycleStopCalls(), 0); -} - -TEST_F(CameraPtzActivityRegistryTest, - DifferentDevicesStopConcurrentlyButMatchingControlIsSerialized) -{ - CameraPtzActivityRegistry registry; - auto first = std::make_shared("camera.first"); - auto second = std::make_shared("camera.second"); - ASSERT_EQ( - registry.control( - first->id(), first, device::PtzCommand::PanLeft, false, 4), - CameraPtzActivityRegistry::DispatchResult::Success); - ASSERT_EQ( - registry.control( - second->id(), second, device::PtzCommand::ZoomIn, false, 7), - CameraPtzActivityRegistry::DispatchResult::Success); - first->blockStop(); - second->blockStop(); - - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - std::thread first_stop([&] { - EXPECT_TRUE(registry.stopActivitiesForDevice(first->id())); - }); - first->waitForStopEntered(); - const auto snapshot_started = std::chrono::steady_clock::now(); - EXPECT_EQ( - registry.trackedDeviceIds(), - (std::vector{"camera.first", "camera.second"})); - EXPECT_LT( - std::chrono::steady_clock::now() - snapshot_started, - std::chrono::milliseconds(100)); - std::thread second_stop([&] { - EXPECT_TRUE(registry.stopActivitiesForDevice(second->id())); - }); - second->waitForStopEntered(); - - std::atomic matching_stop_returned{false}; - std::thread matching_stop([&] { - EXPECT_TRUE(registry.stopActivitiesForDevice(first->id())); - matching_stop_returned = true; - }); - std::this_thread::yield(); - EXPECT_FALSE(matching_stop_returned.load()); - - second->releaseStop(); - second_stop.join(); - first->releaseStop(); - first_stop.join(); - matching_stop.join(); - EXPECT_TRUE(matching_stop_returned.load()); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); -} - -TEST_F(CameraPtzActivityRegistryTest, - DispatchFenceRunsInsidePerDeviceQueueBeforeHardwareMutation) -{ - CameraPtzActivityRegistry registry; - auto camera = std::make_shared("camera"); - std::mutex mutex; - std::condition_variable condition; - bool first_fence_entered = false; - bool release_first_fence = false; - std::atomic second_fence_entered{false}; - - std::thread first([&] { - EXPECT_EQ( - registry.control( - camera->id(), camera, device::PtzCommand::PanLeft, false, 4, - [&] { - std::unique_lock lock(mutex); - first_fence_entered = true; - condition.notify_all(); - condition.wait(lock, [&] { return release_first_fence; }); - return true; - }), - CameraPtzActivityRegistry::DispatchResult::Success); - }); - { - std::unique_lock lock(mutex); - condition.wait(lock, [&] { return first_fence_entered; }); - } - - std::thread second([&] { - EXPECT_EQ( - registry.control( - camera->id(), camera, device::PtzCommand::ZoomIn, false, 7, - [&] { - second_fence_entered = true; - return false; - }), - CameraPtzActivityRegistry::DispatchResult::RejectedByDispatchFence); - }); - std::this_thread::yield(); - EXPECT_FALSE(second_fence_entered.load()); - - { - std::lock_guard lock(mutex); - release_first_fence = true; - } - condition.notify_all(); - first.join(); - second.join(); - - EXPECT_TRUE(second_fence_entered.load()); - const auto calls = camera->calls(); - ASSERT_EQ(calls.size(), 1U); - EXPECT_EQ(calls.front().command, device::PtzCommand::PanLeft); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/grpc_agv_service_test.cpp b/cmvr-es/service/grpc/server/tests/grpc_agv_service_test.cpp deleted file mode 100644 index a59e2e13..00000000 --- a/cmvr-es/service/grpc/server/tests/grpc_agv_service_test.cpp +++ /dev/null @@ -1,806 +0,0 @@ -#include "service/grpc/server/include/grpc_agv_service.h" - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "cmvr/config/device_manager_config/device_manager_config.pb.h" -#include "manager/control_authority_manager/include/control_authority_manager.h" -#include "manager/device_manager/include/device_manager.h" -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" - -namespace cmvr::service { -namespace { - -constexpr char kNativeErrorMessage[] = - "SEER Robokit command failed: ret_code=41200, err_msg=speed_illegal"; -constexpr char kNativeNavigationErrorMessage[] = - "SEER Robokit command failed: ret_code=43051, err_msg=planner_rejected_pose"; - -class FakeAgv final : public device::AbstractAGV { -public: - FakeAgv() - { - id_ = "test-agv"; - } - - std::string typeName() const override { return "FakeAgv"; } - - device::AgvResult emergencyStop() override - { - ++emergency_stop_calls_; - emergency_stop_barrier_observed_ = normalLeaseIsBlocked_( - "test-probe:emergencyStop"); - return device::AgvResult::success(); - } - - device::AgvResult navigateToPose( - const math::Pose2d& pose, - const device::AgvMotionOptions& options, - const device::AgvAdapterParams&) override - { - ++navigate_pose_calls_; - pose_cancellation_bound_ = - static_cast(options.cancellation_requested); - pose_cancellation_requested_during_call_ = - pose_cancellation_bound_ && options.cancellation_requested(); - if (pose_cancellation_requested_during_call_) { - return device::AgvResult::failure( - device::AgvErrorCode::TaskCanceled, - "navigation canceled before fake device dispatch"); - } - pose_ = pose; - pose_options_ = options; - pose_options_.cancellation_requested = {}; - return pose_result_; - } - - device::AgvResult navigateToStation( - const std::string& station_id, - const device::AgvMotionOptions& options, - const device::AgvAdapterParams& adapter_params) override - { - station_id_ = station_id; - station_options_ = options; - station_adapter_params_ = adapter_params; - station_cancellation_bound_ = - static_cast(options.cancellation_requested); - station_cancellation_requested_during_call_ = - station_cancellation_bound_ && options.cancellation_requested(); - station_options_.cancellation_requested = {}; - return device::AgvResult::success(); - } - - device::AgvResult followPath( - const std::vector& path, - const device::AgvMotionOptions& options) override - { - path_ = path; - path_options_ = options; - path_cancellation_bound_ = - static_cast(options.cancellation_requested); - path_cancellation_requested_during_call_ = - path_cancellation_bound_ && options.cancellation_requested(); - path_options_.cancellation_requested = {}; - return device::AgvResult::success(); - } - - device::AgvResult setVelocity(const device::AgvVelocity&) override - { - ++set_velocity_calls_; - return device::AgvResult::failure( - device::AgvErrorCode::CommandFailed, - kNativeErrorMessage); - } - - device::AgvResult cancelNavigation() override - { - ++cancel_navigation_calls_; - cancel_navigation_barrier_observed_ = normalLeaseIsBlocked_( - "test-probe:cancelNavigation"); - return device::AgvResult::success(); - } - - device::AgvResult stopVelocityControl() override - { - ++stop_velocity_calls_; - stop_velocity_barrier_observed_ = normalLeaseIsBlocked_( - "test-probe:stopVelocityControl"); - return device::AgvResult::success(); - } - - device::AgvResult confirmMotionStopped() override - { - ++confirm_stopped_calls_; - confirm_stopped_barrier_observed_ = normalLeaseIsBlocked_( - "test-probe:confirmMotionStopped"); - return confirm_stopped_result_; - } - - bool normalLeaseIsBlocked_(const std::string& owner) - { - auto& authority = control::ControlAuthorityManager::instance(); - const auto probe = authority.tryAcquire( - id_, owner, std::chrono::hours(1)); - if (probe.acquired) { - authority.release(probe.token); - } - return !probe.acquired; - } - - math::Pose2d pose_{}; - device::AgvMotionOptions pose_options_; - device::AgvResult pose_result_{device::AgvResult::success()}; - std::string station_id_; - device::AgvMotionOptions station_options_; - device::AgvAdapterParams station_adapter_params_; - std::vector path_; - device::AgvMotionOptions path_options_; - bool pose_cancellation_bound_{false}; - bool pose_cancellation_requested_during_call_{false}; - bool station_cancellation_bound_{false}; - bool station_cancellation_requested_during_call_{false}; - bool path_cancellation_bound_{false}; - bool path_cancellation_requested_during_call_{false}; - int emergency_stop_calls_{0}; - int cancel_navigation_calls_{0}; - int stop_velocity_calls_{0}; - int confirm_stopped_calls_{0}; - int set_velocity_calls_{0}; - int navigate_pose_calls_{0}; - bool emergency_stop_barrier_observed_{false}; - bool cancel_navigation_barrier_observed_{false}; - bool stop_velocity_barrier_observed_{false}; - bool confirm_stopped_barrier_observed_{false}; - device::AgvResult confirm_stopped_result_{ - device::AgvResult::success()}; -}; - -class LegacyFollowPathAgv final : public device::AbstractAGV { -public: - std::string typeName() const override { return "LegacyFollowPathAgv"; } - - device::AgvResult followPath( - const std::vector& path) override - { - path_ = path; - return device::AgvResult::success(); - } - - std::vector path_; -}; - -class GrpcAgvServiceTest : public ::testing::Test { -protected: - void SetUp() override - { - control::ControlAuthorityManager::instance().clear(); - globalStopAllAdmissionGate().clearForTesting(); - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - agv_ = std::make_shared(); - manager.registerDevice(agv_); - service_ = std::make_unique(); - } - - void TearDown() override - { - service_.reset(); - agv_.reset(); - device::DeviceManager::destroyInstance(); - control::ControlAuthorityManager::instance().clear(); - globalStopAllAdmissionGate().clearForTesting(); - } - - std::shared_ptr agv_; - std::unique_ptr service_; -}; - -void setMotionOptions(msgs::AgvMotionOptions* options) -{ - options->set_max_speed(0.4); - options->set_max_angular_speed(0.5); - options->set_max_acceleration(0.6); - options->set_max_angular_acceleration(0.7); - options->set_reach_distance(0.08); - options->set_reach_angle(0.09); - options->set_wait_timeout_ms(1234); - options->set_poll_interval_ms(55); -} - -void expectMotionOptions(const device::AgvMotionOptions& options) -{ - EXPECT_DOUBLE_EQ(options.max_speed, 0.4); - EXPECT_DOUBLE_EQ(options.max_angular_speed, 0.5); - EXPECT_DOUBLE_EQ(options.max_acceleration, 0.6); - EXPECT_DOUBLE_EQ(options.max_angular_acceleration, 0.7); - EXPECT_DOUBLE_EQ(options.reach_distance, 0.08); - EXPECT_DOUBLE_EQ(options.reach_angle, 0.09); - EXPECT_EQ(options.wait_timeout_ms, 1234); - EXPECT_EQ(options.poll_interval_ms, 55); - EXPECT_FALSE(options.asynchronous); -} - -TEST_F(GrpcAgvServiceTest, NavigationRpcsForwardSpeedAndAccelerationOptions) -{ - api::AgvNavigateToPoseCommand_Request pose_request; - pose_request.mutable_header()->set_device_id("test-agv"); - pose_request.mutable_pose()->set_x(1.0); - pose_request.mutable_pose()->set_y(2.0); - pose_request.mutable_pose()->set_theta(0.5); - setMotionOptions(pose_request.mutable_options()); - api::AgvNavigateToPoseCommand_Feedback pose_response; - grpc::ServerContext pose_context; - - const auto pose_status = service_->navigateToPose( - &pose_context, - &pose_request, - &pose_response); - - ASSERT_TRUE(pose_status.ok()) << pose_status.error_message(); - EXPECT_TRUE(pose_response.header().success()); - EXPECT_DOUBLE_EQ(agv_->pose_.x, 1.0); - EXPECT_DOUBLE_EQ(agv_->pose_.y, 2.0); - EXPECT_DOUBLE_EQ(agv_->pose_.theta, 0.5); - expectMotionOptions(agv_->pose_options_); - EXPECT_TRUE(agv_->pose_cancellation_bound_); - EXPECT_FALSE(agv_->pose_cancellation_requested_during_call_); - - api::AgvNavigateToStationCommand_Request station_request; - station_request.mutable_header()->set_device_id("test-agv"); - station_request.set_station_id("station-1"); - setMotionOptions(station_request.mutable_options()); - api::AgvNavigateToStationCommand_Feedback station_response; - grpc::ServerContext station_context; - - const auto station_status = service_->navigateToStation( - &station_context, - &station_request, - &station_response); - - ASSERT_TRUE(station_status.ok()) << station_status.error_message(); - EXPECT_TRUE(station_response.header().success()); - EXPECT_EQ(agv_->station_id_, "station-1"); - expectMotionOptions(agv_->station_options_); - EXPECT_TRUE(agv_->station_cancellation_bound_); - EXPECT_FALSE(agv_->station_cancellation_requested_during_call_); - - api::AgvFollowPathCommand_Request path_request; - path_request.mutable_header()->set_device_id("test-agv"); - auto* segment = path_request.add_path(); - segment->set_source_station("station-1"); - segment->set_target_station("station-2"); - setMotionOptions(path_request.mutable_options()); - api::AgvFollowPathCommand_Feedback path_response; - grpc::ServerContext path_context; - - const auto path_status = service_->followPath( - &path_context, - &path_request, - &path_response); - - ASSERT_TRUE(path_status.ok()) << path_status.error_message(); - EXPECT_TRUE(path_response.header().success()); - ASSERT_EQ(agv_->path_.size(), 1U); - EXPECT_EQ(agv_->path_[0].source_station, "station-1"); - EXPECT_EQ(agv_->path_[0].target_station, "station-2"); - expectMotionOptions(agv_->path_options_); - EXPECT_TRUE(agv_->path_cancellation_bound_); - EXPECT_FALSE(agv_->path_cancellation_requested_during_call_); -} - -TEST_F(GrpcAgvServiceTest, NativeControllerCodeIsReturnedInGrpcMessage) -{ - api::AgvSetVelocityCommand_Request request; - request.mutable_header()->set_device_id("test-agv"); - request.mutable_velocity()->set_vx(0.1); - api::AgvSetVelocityCommand_Feedback response; - grpc::ServerContext context; - - const auto status = service_->setVelocity( - &context, - &request, - &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_EQ(status.error_message(), kNativeErrorMessage); - EXPECT_FALSE(response.header().success()); - EXPECT_EQ(response.header().error_message(), kNativeErrorMessage); -} - -TEST_F(GrpcAgvServiceTest, NativeNavigationCodeIsReturnedInGrpcMessage) -{ - agv_->pose_result_ = device::AgvResult::failure( - device::AgvErrorCode::CommandFailed, - kNativeNavigationErrorMessage); - api::AgvNavigateToPoseCommand_Request request; - request.mutable_header()->set_device_id("test-agv"); - request.mutable_pose()->set_x(1.0); - request.mutable_pose()->set_y(2.0); - api::AgvNavigateToPoseCommand_Feedback response; - grpc::ServerContext context; - - const auto status = service_->navigateToPose( - &context, - &request, - &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_EQ(status.error_message(), kNativeNavigationErrorMessage); - EXPECT_FALSE(response.header().success()); - EXPECT_EQ( - response.header().error_message(), - kNativeNavigationErrorMessage); - EXPECT_FALSE(agv_->pose_options_.asynchronous); - EXPECT_EQ(agv_->pose_options_.wait_timeout_ms, 0); - EXPECT_EQ(agv_->pose_options_.poll_interval_ms, 0); - EXPECT_TRUE(agv_->pose_cancellation_bound_); - EXPECT_FALSE(agv_->pose_cancellation_requested_during_call_); -} - -TEST_F(GrpcAgvServiceTest, ExplicitAsynchronousNavigationIsForwarded) -{ - api::AgvNavigateToStationCommand_Request request; - request.mutable_header()->set_device_id("test-agv"); - request.set_station_id("station-async"); - request.mutable_options()->set_asynchronous(true); - api::AgvNavigateToStationCommand_Feedback response; - grpc::ServerContext context; - - const auto status = service_->navigateToStation( - &context, - &request, - &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(agv_->station_options_.asynchronous); - EXPECT_TRUE(agv_->station_cancellation_bound_); - EXPECT_FALSE(agv_->station_cancellation_requested_during_call_); -} - -TEST_F(GrpcAgvServiceTest, ActionLeaseBlocksOrdinaryMutatingRpcs) -{ - auto& authority = control::ControlAuthorityManager::instance(); - const auto action_lease = authority.tryAcquire( - "test-agv", - "action-sequence:test-action", - std::chrono::hours(1)); - ASSERT_TRUE(action_lease.acquired) << action_lease.detail; - - api::AgvNavigateToPoseCommand_Request navigation_request; - navigation_request.mutable_header()->set_device_id("test-agv"); - api::AgvNavigateToPoseCommand_Feedback navigation_response; - grpc::ServerContext navigation_context; - const auto navigation_status = service_->navigateToPose( - &navigation_context, - &navigation_request, - &navigation_response); - EXPECT_EQ( - navigation_status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_FALSE(navigation_response.header().success()); - - api::CommandHeader_Request clear_fault_request; - clear_fault_request.set_device_id("test-agv"); - api::CommandHeader_Feedback clear_fault_response; - grpc::ServerContext clear_fault_context; - const auto clear_fault_status = service_->clearFault( - &clear_fault_context, - &clear_fault_request, - &clear_fault_response); - EXPECT_EQ( - clear_fault_status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_FALSE(clear_fault_response.success()); - - api::AgvMapCommand_Request switch_map_request; - switch_map_request.mutable_header()->set_device_id("test-agv"); - switch_map_request.set_map_name("map-1"); - api::AgvMapCommand_Feedback switch_map_response; - grpc::ServerContext switch_map_context; - const auto switch_map_status = service_->switchMap( - &switch_map_context, - &switch_map_request, - &switch_map_response); - EXPECT_EQ( - switch_map_status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_FALSE(switch_map_response.header().success()); - - authority.release(action_lease.token); -} - -TEST_F(GrpcAgvServiceTest, NavigationCancellationIncludesControlLease) -{ - auto& authority = control::ControlAuthorityManager::instance(); - const auto barrier = authority.preemptAcquire( - "test-agv", "stop-all-test", std::chrono::hours(1)); - ASSERT_TRUE(barrier.acquired) << barrier.detail; - - api::AgvNavigateToPoseCommand_Request request; - request.mutable_header()->set_device_id("test-agv"); - api::AgvNavigateToPoseCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->navigateToPose( - &context, &request, &response); - - EXPECT_EQ( - status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ(agv_->navigate_pose_calls_, 0); - authority.release(barrier.token); -} - -TEST_F(GrpcAgvServiceTest, SetVelocityDispatchRunsUnderControlFence) -{ - api::AgvSetVelocityCommand_Request request; - request.mutable_header()->set_device_id("test-agv"); - request.mutable_velocity()->set_vx(0.1); - api::AgvSetVelocityCommand_Feedback response; - grpc::ServerContext context; - - const auto status = service_->setVelocity( - &context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_EQ(agv_->set_velocity_calls_, 1); -} - -TEST_F(GrpcAgvServiceTest, - StopAllGateRejectsMutatingCommandsButAllowsReadsAndStops) -{ - auto& admission = globalStopAllAdmissionGate(); - const auto ticket = admission.beginStopAll(); - ASSERT_TRUE(ticket.valid()); - - api::AgvNavigateToPoseCommand_Request navigation_request; - navigation_request.mutable_header()->set_device_id("test-agv"); - api::AgvNavigateToPoseCommand_Feedback navigation_response; - grpc::ServerContext navigation_context; - const auto navigation_status = service_->navigateToPose( - &navigation_context, &navigation_request, &navigation_response); - - api::AgvSetVelocityCommand_Request velocity_request; - velocity_request.mutable_header()->set_device_id("test-agv"); - velocity_request.mutable_velocity()->set_vx(0.1); - api::AgvSetVelocityCommand_Feedback velocity_response; - grpc::ServerContext velocity_context; - const auto velocity_status = service_->setVelocity( - &velocity_context, &velocity_request, &velocity_response); - - api::AgvRuntimeStateCommand_Request state_request; - state_request.mutable_header()->set_device_id("test-agv"); - api::AgvRuntimeStateCommand_Feedback state_response; - grpc::ServerContext state_context; - const auto state_status = service_->getRuntimeState( - &state_context, &state_request, &state_response); - - api::CommandHeader_Request stop_request; - stop_request.set_device_id("test-agv"); - api::CommandHeader_Feedback stop_response; - grpc::ServerContext stop_context; - const auto stop_status = service_->cancelNavigation( - &stop_context, &stop_request, &stop_response); - - EXPECT_EQ( - navigation_status.error_code(), - grpc::StatusCode::UNAVAILABLE); - EXPECT_FALSE(navigation_response.header().success()); - EXPECT_EQ(agv_->navigate_pose_calls_, 0); - EXPECT_EQ( - velocity_status.error_code(), - grpc::StatusCode::UNAVAILABLE); - EXPECT_FALSE(velocity_response.header().success()); - EXPECT_EQ(agv_->set_velocity_calls_, 0); - - EXPECT_TRUE(state_status.ok()) << state_status.error_message(); - EXPECT_TRUE(state_response.header().success()); - EXPECT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_TRUE(stop_response.success()) - << stop_response.error_message(); - EXPECT_EQ(agv_->cancel_navigation_calls_, 2); - - EXPECT_TRUE(admission.finishStopAll(ticket, true)); - const auto resumed_status = service_->navigateToPose( - &navigation_context, &navigation_request, &navigation_response); - EXPECT_TRUE(resumed_status.ok()) << resumed_status.error_message(); - EXPECT_TRUE(navigation_response.header().success()); - EXPECT_EQ(agv_->navigate_pose_calls_, 1); -} - -TEST_F(GrpcAgvServiceTest, QueriesBypassAndSafetyStopsPreemptActionLease) -{ - auto& authority = control::ControlAuthorityManager::instance(); - const auto action_lease = authority.tryAcquire( - "test-agv", - "action-sequence:test-action", - std::chrono::hours(1)); - ASSERT_TRUE(action_lease.acquired) << action_lease.detail; - - api::AgvRuntimeStateCommand_Request state_request; - state_request.mutable_header()->set_device_id("test-agv"); - api::AgvRuntimeStateCommand_Feedback state_response; - grpc::ServerContext state_context; - const auto state_status = service_->getRuntimeState( - &state_context, - &state_request, - &state_response); - EXPECT_TRUE(state_status.ok()) << state_status.error_message(); - EXPECT_TRUE(state_response.header().success()); - EXPECT_TRUE(authority.validate(action_lease.token)); - - api::CommandHeader_Request stop_request; - stop_request.set_device_id("test-agv"); - - api::CommandHeader_Feedback emergency_response; - grpc::ServerContext emergency_context; - auto emergency = std::async( - std::launch::async, - [this, &emergency_context, &stop_request, &emergency_response]() { - return service_->emergencyStop( - &emergency_context, - &stop_request, - &emergency_response); - }); - const auto emergency_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (authority.validate(action_lease.token) && - std::chrono::steady_clock::now() < emergency_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_FALSE(authority.validate(action_lease.token)); - authority.release(action_lease.token); - const auto emergency_status = emergency.get(); - EXPECT_TRUE(emergency_status.ok()) << emergency_status.error_message(); - EXPECT_TRUE(agv_->emergency_stop_barrier_observed_); - - const auto released_lease_after_emergency = authority.tryAcquire( - "test-agv", - "action-sequence:after-emergency-release", - std::chrono::hours(1)); - ASSERT_TRUE(released_lease_after_emergency.acquired) - << released_lease_after_emergency.detail; - - api::CommandHeader_Feedback cancel_response; - grpc::ServerContext cancel_context; - auto cancel = std::async( - std::launch::async, - [this, &cancel_context, &stop_request, &cancel_response]() { - return service_->cancelNavigation( - &cancel_context, - &stop_request, - &cancel_response); - }); - const auto cancel_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (authority.validate(released_lease_after_emergency.token) && - std::chrono::steady_clock::now() < cancel_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_FALSE(authority.validate( - released_lease_after_emergency.token)); - authority.release(released_lease_after_emergency.token); - const auto cancel_status = cancel.get(); - EXPECT_TRUE(cancel_status.ok()) << cancel_status.error_message(); - EXPECT_TRUE(agv_->cancel_navigation_barrier_observed_); - - const auto released_lease_after_cancel = authority.tryAcquire( - "test-agv", - "action-sequence:after-cancel-release", - std::chrono::hours(1)); - ASSERT_TRUE(released_lease_after_cancel.acquired) - << released_lease_after_cancel.detail; - - api::CommandHeader_Feedback velocity_response; - grpc::ServerContext velocity_context; - auto velocity = std::async( - std::launch::async, - [this, &velocity_context, &stop_request, &velocity_response]() { - return service_->stopVelocityControl( - &velocity_context, - &stop_request, - &velocity_response); - }); - const auto velocity_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (authority.validate(released_lease_after_cancel.token) && - std::chrono::steady_clock::now() < velocity_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - EXPECT_FALSE(authority.validate( - released_lease_after_cancel.token)); - authority.release(released_lease_after_cancel.token); - const auto velocity_status = velocity.get(); - EXPECT_TRUE(velocity_status.ok()) << velocity_status.error_message(); - EXPECT_TRUE(agv_->stop_velocity_barrier_observed_); - - const auto lease_after_stops = authority.tryAcquire( - "test-agv", - "action-sequence:after-stops", - std::chrono::hours(1)); - ASSERT_TRUE(lease_after_stops.acquired) - << lease_after_stops.detail; - - EXPECT_EQ(agv_->emergency_stop_calls_, 2); - EXPECT_EQ(agv_->cancel_navigation_calls_, 2); - EXPECT_EQ(agv_->stop_velocity_calls_, 2); - EXPECT_EQ(agv_->confirm_stopped_calls_, 3); - EXPECT_TRUE(agv_->confirm_stopped_barrier_observed_); - - authority.release(lease_after_stops.token); -} - -TEST_F(GrpcAgvServiceTest, - SafetyStopQuarantinesControlWhenStoppedStateIsUnconfirmed) -{ - agv_->confirm_stopped_result_ = device::AgvResult::failure( - device::AgvErrorCode::Timeout, - "two zero-velocity samples were not observed"); - - api::CommandHeader_Request request; - request.set_device_id("test-agv"); - api::CommandHeader_Feedback response; - grpc::ServerContext context; - const auto status = service_->cancelNavigation( - &context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::DEADLINE_EXCEEDED); - EXPECT_FALSE(response.success()); - EXPECT_NE( - response.error_message().find("confirmed stopped state"), - std::string::npos); - EXPECT_TRUE(agv_->cancel_navigation_barrier_observed_); - EXPECT_TRUE(agv_->confirm_stopped_barrier_observed_); - - const auto lease = - control::ControlAuthorityManager::instance().tryAcquire( - "test-agv", - "normal-control-after-unconfirmed-stop", - std::chrono::hours(1)); - EXPECT_FALSE(lease.acquired); - - auto& authority = control::ControlAuthorityManager::instance(); - const auto recovery = authority.preemptAcquire( - "test-agv", "confirmed-stop-recovery", std::chrono::hours(1)); - ASSERT_TRUE(recovery.acquired) << recovery.detail; - ASSERT_TRUE(authority.waitForPreemptedRelease( - recovery.token, std::chrono::milliseconds::zero())); - ASSERT_TRUE(authority.recoverRetiredSafetyHolders(recovery.token)); - authority.release(recovery.token); - const auto recovered = authority.tryAcquire( - "test-agv", "normal-control-after-recovery", std::chrono::hours(1)); - EXPECT_TRUE(recovered.acquired) << recovered.detail; - authority.release(recovered.token); -} - -TEST_F(GrpcAgvServiceTest, StopMappingFailureReleasesOrdinaryControlLease) -{ - api::CommandHeader_Request request; - request.set_device_id("test-agv"); - api::CommandHeader_Feedback response; - grpc::ServerContext context; - - const auto status = service_->stopMapping( - &context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_FALSE(response.success()); - auto& authority = control::ControlAuthorityManager::instance(); - const auto lease = authority.tryAcquire( - "test-agv", "normal-control-after-mapping-failure", - std::chrono::hours(1)); - EXPECT_TRUE(lease.acquired) << lease.detail; - authority.release(lease.token); -} - -TEST_F(GrpcAgvServiceTest, NavigateToStationForwardsPgvAdapterParams) -{ - api::AgvNavigateToStationCommand_Request request; - request.mutable_header()->set_device_id("test-agv"); - request.set_station_id("AP1"); - auto* values = request.mutable_adapter_params()->mutable_values(); - (*values)["use_pgv"] = "true"; - (*values)["pgv_adjust_dist"] = "0.3"; - (*values)["pgv_adjust_cx"] = "-0.3"; - (*values)["pgv_adjust_cy"] = "0"; - api::AgvNavigateToStationCommand_Feedback response; - grpc::ServerContext context; - - const auto status = service_->navigateToStation( - &context, - &request, - &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()); - EXPECT_EQ(agv_->station_id_, "AP1"); - EXPECT_EQ( - agv_->station_adapter_params_.getString("use_pgv").value_or(""), - "true"); - EXPECT_EQ( - agv_->station_adapter_params_.getString("pgv_adjust_dist").value_or(""), - "0.3"); - EXPECT_EQ( - agv_->station_adapter_params_.getString("pgv_adjust_cx").value_or(""), - "-0.3"); - EXPECT_EQ( - agv_->station_adapter_params_.getString("pgv_adjust_cy").value_or(""), - "0"); -} - -TEST_F(GrpcAgvServiceTest, NavigationErrorsMapToGrpcCodesAndPreserveDetails) -{ - struct ErrorCase { - device::AgvErrorCode device_code; - grpc::StatusCode grpc_code; - }; - const ErrorCase cases[] = { - {device::AgvErrorCode::InvalidArgument, - grpc::StatusCode::INVALID_ARGUMENT}, - {device::AgvErrorCode::TaskCanceled, - grpc::StatusCode::CANCELLED}, - {device::AgvErrorCode::Timeout, - grpc::StatusCode::DEADLINE_EXCEEDED}, - }; - - for (const auto& test_case : cases) { - const std::string detail = - "SEER Robokit navigation detail for code=" - + std::to_string(static_cast(test_case.device_code)); - agv_->pose_result_ = device::AgvResult::failure( - test_case.device_code, - detail); - api::AgvNavigateToPoseCommand_Request request; - request.mutable_header()->set_device_id("test-agv"); - api::AgvNavigateToPoseCommand_Feedback response; - grpc::ServerContext context; - - const auto status = service_->navigateToPose( - &context, - &request, - &response); - - EXPECT_EQ(status.error_code(), test_case.grpc_code); - EXPECT_EQ(status.error_message(), detail); - EXPECT_FALSE(response.header().success()); - EXPECT_EQ(response.header().error_message(), detail); - } -} - -TEST(AbstractAgvCompatibilityTest, FollowPathOptionsDelegateToLegacyOverride) -{ - LegacyFollowPathAgv legacy; - device::AbstractAGV* abstract = &legacy; - const std::vector path = { - {"station-1", "station-2"}, - }; - device::AgvMotionOptions options; - - const auto result = abstract->followPath(path, options); - - ASSERT_TRUE(result.ok()) << result.message; - ASSERT_EQ(legacy.path_.size(), 1U); - EXPECT_EQ(legacy.path_[0].source_station, "station-1"); - EXPECT_EQ(legacy.path_[0].target_station, "station-2"); -} - -TEST(AbstractAgvCompatibilityTest, SynchronousActionSupportDefaultsToFalse) -{ - LegacyFollowPathAgv legacy; - - EXPECT_FALSE(legacy.supportsSynchronousAction( - device::AgvActionKind::NavigateToPose)); - EXPECT_FALSE(legacy.supportsSynchronousAction( - device::AgvActionKind::NavigateToStation)); - EXPECT_FALSE(legacy.supportsSynchronousAction( - device::AgvActionKind::FollowPath)); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/grpc_arm_service_test.cpp b/cmvr-es/service/grpc/server/tests/grpc_arm_service_test.cpp deleted file mode 100644 index f9720de4..00000000 --- a/cmvr-es/service/grpc/server/tests/grpc_arm_service_test.cpp +++ /dev/null @@ -1,1276 +0,0 @@ -#include "service/grpc/server/include/grpc_arm_service.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "cmvr/config/device_manager_config/device_manager_config.pb.h" -#include "manager/control_authority_manager/include/control_authority_manager.h" -#include "manager/device_manager/include/device_manager.h" -#include "service/grpc/server/include/grpc_error_logging_interceptor.h" -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" - -namespace cmvr::service { -namespace { - -class JsonCommandRobotArm final : public device::RobotArm { -public: - explicit JsonCommandRobotArm(std::string id) - { - id_ = std::move(id); - } - - std::string typeName() const override { return "JsonCommandRobotArm"; } - - bool executeJsonCommand(const std::string& request_json, - std::string& response_json) override - { - ++execute_calls; - last_request_json = request_json; - response_json = next_response_json; - return next_success; - } - - device::RobotModel getRobotModel() const override { return {}; } - std::size_t getDof() const override { return 0U; } - device::ArmState getRobotState() const override - { - device::ArmState state; - state.connected = true; - state.powered_on = powered_on_.load(); - state.robot_mode = state.powered_on - ? device::RobotMode::Running - : device::RobotMode::PowerOff; - return state; - } - device::JointGroupState getJointState() const override { return {}; } - device::CartesianPose getTcpPose( - device::FrameType = device::FrameType::Base) const override - { - return {}; - } - device::RobotMode getRobotMode() const override - { - return device::RobotMode::Unknown; - } - device::SafetyMode getSafetyMode() const override - { - return device::SafetyMode::Unknown; - } - device::ControlMode getControlMode() const override - { - return device::ControlMode::None; - } - - device::Result torqueOn() override { return torqueOn({}); } - device::Result torqueOn( - const std::function& cancellation_requested) override - { - std::unique_lock lock(motion_mutex_); - ++torque_on_calls_; - last_torque_on_had_cancellation_ = - static_cast(cancellation_requested); - if (!block_next_torque_on_) { - return device::Result::success(); - } - - block_next_torque_on_ = false; - blocking_torque_on_started_ = true; - torque_on_started_cv_.notify_all(); - while (!release_blocking_torque_on_) { - lock.unlock(); - const bool cancelled = - cancellation_requested && cancellation_requested(); - lock.lock(); - if (cancelled) { - last_torque_on_cancellation_requested_ = true; - if (fail_next_torque_on_cancellation_) { - fail_next_torque_on_cancellation_ = false; - return device::Result::failure( - device::ArmErrorCode::CommandFailed, - "simulated torqueOn safety termination failure"); - } - return device::Result::failure( - device::ArmErrorCode::CommandRejected, - "simulated torqueOn cancellation"); - } - torque_on_release_cv_.wait_for( - lock, std::chrono::milliseconds(5)); - } - return device::Result::success(); - } - device::Result torqueOff() override - { - std::lock_guard lock(motion_mutex_); - ++torque_off_calls_; - return device::Result::success(); - } - device::Result calibrateZeroQ(const std::string&) override - { - return device::Result::success(); - } - device::Result emergencyStop() override - { - return device::Result::success(); - } - device::Result protectiveStop() override - { - return device::Result::success(); - } - device::Result setSpeedScaling(double) override - { - return device::Result::success(); - } - double getSpeedScaling() const override { return 1.0; } - bool isProtectiveStopped() const override { return false; } - bool isEmergencyStopped() const override { return false; } - bool isFault() const override { return false; } - - device::Result moveJ(const device::JointPositionCommand&, - const device::MotionOptions& options) override - { - return enterMotion("moveJ", move_j_calls_, options); - } - device::Result speedJ(const device::JointVelocityCommand&, - double, - double) override - { - return device::Result::success(); - } - device::Result stopJ(double) override - { - return device::Result::success(); - } - device::Result moveL( - const device::CartesianPose&, - const device::MotionOptions& options, - device::FrameType = device::FrameType::Base) override - { - return enterMotion("moveL", move_l_calls_, options); - } - device::Result speedL( - const device::CartesianVelocity&, - double, - double, - device::FrameType = device::FrameType::Base) override - { - return device::Result::success(); - } - device::Result stopL(std::optional = std::nullopt) override - { - return device::Result::success(); - } - device::Result stopMotion() override - { - std::unique_lock lock(motion_mutex_); - ++stop_motion_calls_; - if (block_next_stop_) { - block_next_stop_ = false; - blocking_stop_started_ = true; - stop_started_cv_.notify_all(); - stop_release_cv_.wait( - lock, - [this]() { return release_blocking_stop_; }); - } - if (throw_next_stop_) { - throw_next_stop_ = false; - throw std::runtime_error("simulated stopMotion exception"); - } - if (fail_next_stop_) { - fail_next_stop_ = false; - return device::Result::failure( - device::ArmErrorCode::CommandFailed, - "simulated stopMotion failure"); - } - return device::Result::success(); - } - - void blockNextMotion() - { - std::lock_guard lock(motion_mutex_); - block_next_motion_ = true; - blocking_motion_started_ = false; - release_blocking_motion_ = false; - blocking_motion_name_.clear(); - } - - void blockNextTorqueOn() - { - std::lock_guard lock(motion_mutex_); - block_next_torque_on_ = true; - blocking_torque_on_started_ = false; - release_blocking_torque_on_ = false; - last_torque_on_cancellation_requested_ = false; - } - - void failNextTorqueOnCancellation() - { - std::lock_guard lock(motion_mutex_); - fail_next_torque_on_cancellation_ = true; - } - - bool waitForBlockingTorqueOn( - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(motion_mutex_); - return torque_on_started_cv_.wait_for( - lock, - timeout, - [this]() { return blocking_torque_on_started_; }); - } - - void releaseBlockingTorqueOn() - { - { - std::lock_guard lock(motion_mutex_); - release_blocking_torque_on_ = true; - } - torque_on_release_cv_.notify_all(); - } - - bool waitForBlockingMotion( - const std::string& operation, - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(motion_mutex_); - return motion_started_cv_.wait_for( - lock, - timeout, - [this, &operation]() { - return blocking_motion_started_ && - blocking_motion_name_ == operation; - }); - } - - void releaseBlockingMotion() - { - { - std::lock_guard lock(motion_mutex_); - release_blocking_motion_ = true; - } - motion_release_cv_.notify_all(); - } - - void blockNextStopMotion() - { - std::lock_guard lock(motion_mutex_); - block_next_stop_ = true; - blocking_stop_started_ = false; - release_blocking_stop_ = false; - } - - void failNextStopMotion() - { - std::lock_guard lock(motion_mutex_); - fail_next_stop_ = true; - } - - void throwNextStopMotion() - { - std::lock_guard lock(motion_mutex_); - throw_next_stop_ = true; - } - - bool waitForBlockingStop(const std::chrono::milliseconds timeout) - { - std::unique_lock lock(motion_mutex_); - return stop_started_cv_.wait_for( - lock, - timeout, - [this]() { return blocking_stop_started_; }); - } - - void releaseBlockingStop() - { - { - std::lock_guard lock(motion_mutex_); - release_blocking_stop_ = true; - } - stop_release_cv_.notify_all(); - } - - int moveJCalls() const - { - std::lock_guard lock(motion_mutex_); - return move_j_calls_; - } - - int moveLCalls() const - { - std::lock_guard lock(motion_mutex_); - return move_l_calls_; - } - - int stopMotionCalls() const - { - std::lock_guard lock(motion_mutex_); - return stop_motion_calls_; - } - - int torqueOffCalls() const - { - std::lock_guard lock(motion_mutex_); - return torque_off_calls_; - } - - int torqueOnCalls() const - { - std::lock_guard lock(motion_mutex_); - return torque_on_calls_; - } - - void setPoweredOn(const bool powered_on) - { - powered_on_.store(powered_on); - } - - bool lastTorqueOnHadCancellation() const - { - std::lock_guard lock(motion_mutex_); - return last_torque_on_had_cancellation_; - } - - bool lastTorqueOnCancellationRequested() const - { - std::lock_guard lock(motion_mutex_); - return last_torque_on_cancellation_requested_; - } - - bool lastMotionHadCancellation() const - { - std::lock_guard lock(motion_mutex_); - return last_motion_had_cancellation_; - } - - bool lastMotionCancellationRequested() const - { - std::lock_guard lock(motion_mutex_); - return last_motion_cancellation_requested_; - } - - device::Result startServoMode(const device::ServoOptions&) override - { - return device::Result::success(); - } - device::Result servoJ(const device::JointPositionCommand&) override - { - return device::Result::success(); - } - device::Result servoL( - const device::CartesianPose&, - device::FrameType = device::FrameType::Base) override - { - return device::Result::success(); - } - device::Result servoSpeedJ(const device::JointVelocityCommand&) override - { - return device::Result::success(); - } - device::Result servoSpeedL( - const device::CartesianVelocity&, - device::FrameType = device::FrameType::Base) override - { - return device::Result::success(); - } - device::Result stopServoMode() override - { - return device::Result::success(); - } - - device::Result connect(const std::string&, int) override - { - return device::Result::success(); - } - device::Result disconnect() override - { - return device::Result::success(); - } - bool isConnected() const override { return true; } - device::Result powerOn() override { return device::Result::success(); } - device::Result powerOff() override { return device::Result::success(); } - device::Result brakeRelease() override - { - return device::Result::success(); - } - device::Result shutdown() override - { - return device::Result::success(); - } - device::Result clearFault() override - { - return device::Result::success(); - } - device::Result unlockProtectiveStop() override - { - return device::Result::success(); - } - device::Result loadProgram(const std::string&) override - { - return device::Result::success(); - } - device::Result playProgram() override - { - return device::Result::success(); - } - device::Result pauseProgram() override - { - return device::Result::success(); - } - device::Result stopProgram() override - { - return device::Result::success(); - } - - std::vector ik(const std::string&, - const std::string&, - const device::CartesianPose&) override - { - return {}; - } - std::shared_ptr kinematicsSolver() const override - { - return nullptr; - } - device::CartesianPose fk(const std::string&, - const std::string&) override - { - return {}; - } - device::CartesianPose fk(bool = true) override { return {}; } - device::CartesianVelocity getSpeedLCommandTwistBase() const override - { - return {}; - } - bool busy() const override { return false; } - - int execute_calls{0}; - bool next_success{true}; - std::string next_response_json; - std::string last_request_json; - -private: - device::Result enterMotion( - const char* operation, - int& call_count, - const device::MotionOptions& options) - { - std::unique_lock lock(motion_mutex_); - ++call_count; - last_motion_had_cancellation_ = - static_cast(options.cancellation_requested); - last_motion_cancellation_requested_ = - last_motion_had_cancellation_ && - options.cancellation_requested(); - if (!block_next_motion_) { - return device::Result::success(); - } - - block_next_motion_ = false; - blocking_motion_started_ = true; - blocking_motion_name_ = operation; - motion_started_cv_.notify_all(); - motion_release_cv_.wait( - lock, - [this]() { return release_blocking_motion_; }); - return device::Result::success(); - } - - mutable std::mutex motion_mutex_; - std::condition_variable motion_started_cv_; - std::condition_variable motion_release_cv_; - std::condition_variable stop_started_cv_; - std::condition_variable stop_release_cv_; - std::condition_variable torque_on_started_cv_; - std::condition_variable torque_on_release_cv_; - bool block_next_motion_{false}; - bool blocking_motion_started_{false}; - bool release_blocking_motion_{false}; - bool block_next_stop_{false}; - bool blocking_stop_started_{false}; - bool release_blocking_stop_{false}; - bool fail_next_stop_{false}; - bool throw_next_stop_{false}; - bool block_next_torque_on_{false}; - bool blocking_torque_on_started_{false}; - bool release_blocking_torque_on_{false}; - bool fail_next_torque_on_cancellation_{false}; - std::string blocking_motion_name_; - int move_j_calls_{0}; - int move_l_calls_{0}; - int stop_motion_calls_{0}; - int torque_off_calls_{0}; - int torque_on_calls_{0}; - bool last_torque_on_had_cancellation_{false}; - bool last_torque_on_cancellation_requested_{false}; - bool last_motion_had_cancellation_{false}; - bool last_motion_cancellation_requested_{false}; - std::atomic powered_on_{false}; -}; - -class JsonCommandNonArmDevice final : public device::AbstractDevice { -public: - explicit JsonCommandNonArmDevice(std::string id) - : AbstractDevice(std::move(id)) - { - } - - std::string typeName() const override { return "JsonCommandNonArmDevice"; } - - bool executeJsonCommand(const std::string&, - std::string& response_json) override - { - ++execute_calls; - response_json = R"({"success":true})"; - return true; - } - - int execute_calls{0}; -}; - -class GrpcArmServiceTest : public ::testing::Test { -protected: - void SetUp() override - { - control::ControlAuthorityManager::instance().clear(); - globalStopAllAdmissionGate().clearForTesting(); - device::DeviceManager::destroyInstance(); - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - - left_arm_ = std::make_shared("left_arm"); - aubo_arm_ = std::make_shared("aubo_arm"); - non_arm_ = std::make_shared("camera"); - manager.registerDevice(left_arm_); - manager.registerDevice(aubo_arm_); - manager.registerDevice(non_arm_); - service_ = std::make_unique(); - } - - void TearDown() override - { - service_.reset(); - non_arm_.reset(); - aubo_arm_.reset(); - left_arm_.reset(); - device::DeviceManager::destroyInstance(); - control::ControlAuthorityManager::instance().clear(); - globalStopAllAdmissionGate().clearForTesting(); - } - - grpc::Status execute(const std::string& device_id, - const std::string& request_json, - api::JsonDeviceCommand_Feedback& response) - { - api::JsonDeviceCommand_Request request; - request.mutable_header()->set_device_id(device_id); - request.set_request_json(request_json); - grpc::ServerContext context; - return service_->ExecuteJsonCommand(&context, &request, &response); - } - - struct MoveOutcome { - grpc::Status status; - bool response_success{false}; - std::string response_error; - }; - - MoveOutcome moveJ(const std::string& device_id) - { - api::MoveJ_Request request; - request.mutable_header()->set_device_id(device_id); - request.mutable_target()->add_position(0.1); - api::MoveJ_Response response; - grpc::ServerContext context; - auto status = service_->moveJ(&context, &request, &response); - return { - std::move(status), - response.header().success(), - response.header().error_message()}; - } - - grpc::Status identifiedMoveJ( - const std::string& command_id, - const double position, - api::MoveJ_Response& response) - { - api::MoveJ_Request request; - auto* header = request.mutable_header(); - header->set_device_id("aubo_arm"); - header->set_command_id(command_id); - header->set_expected_service_instance_id( - device::DeviceManager::getInstance() - .safetyManager() - .serviceInstanceId()); - header->set_valid_for_ms(1000); - request.mutable_target()->add_position(position); - grpc::ServerContext context; - return service_->moveJ(&context, &request, &response); - } - - MoveOutcome moveL(const std::string& device_id) - { - api::MoveL_Request request; - request.mutable_header()->set_device_id(device_id); - request.mutable_target()->set_x(0.1); - api::MoveL_Response response; - grpc::ServerContext context; - auto status = service_->moveL(&context, &request, &response); - return { - std::move(status), - response.header().success(), - response.header().error_message()}; - } - - grpc::Status stopMotion( - const std::string& device_id, - api::CommandHeader_Feedback& response) - { - api::CommandHeader_Request request; - request.set_device_id(device_id); - grpc::ServerContext context; - return service_->stopMotion(&context, &request, &response); - } - - grpc::Status torqueOff( - const std::string& device_id, - api::CommandHeader_Feedback& response) - { - api::CommandHeader_Request request; - request.set_device_id(device_id); - grpc::ServerContext context; - return service_->torqueOff(&context, &request, &response); - } - - grpc::Status torqueOn( - const std::string& device_id, - api::CommandHeader_Feedback& response) - { - api::CommandHeader_Request request; - request.set_device_id(device_id); - grpc::ServerContext context; - return service_->torqueOn(&context, &request, &response); - } - - MoveOutcome torqueOn(const std::string& device_id) - { - api::CommandHeader_Feedback response; - auto status = torqueOn(device_id, response); - return { - std::move(status), - response.success(), - response.error_message()}; - } - - std::shared_ptr left_arm_; - std::shared_ptr aubo_arm_; - std::shared_ptr non_arm_; - std::unique_ptr service_; -}; - -TEST(GrpcArmServiceDescriptorTest, - ExecuteJsonCommandBelongsOnlyToArmService) -{ - const auto* pool = google::protobuf::DescriptorPool::generated_pool(); - const auto* arm_service = - pool->FindServiceByName("cmvr.api.ArmService"); - const auto* system_service = - pool->FindServiceByName("cmvr.api.SystemService"); - - ASSERT_NE(arm_service, nullptr); - ASSERT_NE(system_service, nullptr); - EXPECT_NE(arm_service->FindMethodByName("ExecuteJsonCommand"), nullptr); - EXPECT_EQ(system_service->FindMethodByName("ExecuteJsonCommand"), nullptr); -} - -TEST_F(GrpcArmServiceTest, RoutesByHeaderDeviceIdAndForwardsSuccessfulJson) -{ - const std::string request_json = - R"({"command":"cabinet_io","operation":"get_di","index":0})"; - const std::string response_json = - R"({"success":true,"operation":"get_di","index":0,"value":false})"; - aubo_arm_->next_response_json = response_json; - - api::JsonDeviceCommand_Feedback response; - const auto status = execute("aubo_arm", request_json, response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()); - EXPECT_TRUE(response.header().error_message().empty()); - EXPECT_TRUE(response.header().has_timestamp()); - EXPECT_GT(response.header().timestamp().seconds(), 0); - EXPECT_EQ(response.response_json(), response_json); - EXPECT_EQ(aubo_arm_->execute_calls, 1); - EXPECT_EQ(aubo_arm_->last_request_json, request_json); - EXPECT_EQ(left_arm_->execute_calls, 0); -} - -TEST_F(GrpcArmServiceTest, ForwardsDeviceJsonFailureWithLegacyGrpcOkSemantics) -{ - const std::string response_json = - R"({"success":false,"error_code":"not_connected"})"; - aubo_arm_->next_success = false; - aubo_arm_->next_response_json = response_json; - - api::JsonDeviceCommand_Feedback response; - const auto status = execute( - "aubo_arm", - R"({"command":"cabinet_io","operation":"get_do","index":0})", - response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_FALSE(response.header().success()); - EXPECT_EQ(response.header().error_message(), response_json); - EXPECT_TRUE(response.header().has_timestamp()); - EXPECT_GT(response.header().timestamp().seconds(), 0); - EXPECT_EQ(response.response_json(), response_json); - EXPECT_EQ(aubo_arm_->execute_calls, 1); - EXPECT_EQ(left_arm_->execute_calls, 0); -} - -TEST_F(GrpcArmServiceTest, - MissingOrNonArmIdReturnsBusinessFailureWithoutBackendDispatch) -{ - api::JsonDeviceCommand_Feedback non_arm_response; - const auto non_arm_status = execute( - "camera", R"({"command":"cabinet_io"})", non_arm_response); - - ASSERT_TRUE(non_arm_status.ok()) << non_arm_status.error_message(); - EXPECT_FALSE(non_arm_response.header().success()); - EXPECT_EQ(non_arm_response.header().error_message(), - "Device not found: camera"); - EXPECT_TRUE(non_arm_response.header().has_timestamp()); - EXPECT_TRUE(non_arm_response.response_json().empty()); - EXPECT_EQ(non_arm_->execute_calls, 0); - EXPECT_EQ(aubo_arm_->execute_calls, 0); - EXPECT_EQ(left_arm_->execute_calls, 0); - - api::JsonDeviceCommand_Feedback missing_response; - const auto missing_status = execute( - "missing_arm", R"({"command":"cabinet_io"})", missing_response); - - ASSERT_TRUE(missing_status.ok()) << missing_status.error_message(); - EXPECT_FALSE(missing_response.header().success()); - EXPECT_EQ(missing_response.header().error_message(), - "Device not found: missing_arm"); - EXPECT_TRUE(missing_response.header().has_timestamp()); - EXPECT_TRUE(missing_response.response_json().empty()); - EXPECT_EQ(non_arm_->execute_calls, 0); - EXPECT_EQ(aubo_arm_->execute_calls, 0); - EXPECT_EQ(left_arm_->execute_calls, 0); -} - -TEST_F(GrpcArmServiceTest, - TorqueOnAlreadyEnabledArmReturnsOkWithoutDispatchingBackend) -{ - aubo_arm_->setPoweredOn(true); - - api::CommandHeader_Feedback response; - const auto status = torqueOn("aubo_arm", response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.success()); - EXPECT_EQ(response.error_message(), "RobotArm is already enabled"); - EXPECT_EQ( - response.reason_code(), - api::COMMAND_REASON_CODE_NONE); - EXPECT_EQ(aubo_arm_->torqueOnCalls(), 0); -} - -TEST_F(GrpcArmServiceTest, - StopMotionRevokesBlockedMoveJLeaseBeforeMoveLReturns) -{ - aubo_arm_->blockNextMotion(); - auto blocked_move = std::async( - std::launch::async, - [this]() { return moveJ("aubo_arm"); }); - - const bool move_started = aubo_arm_->waitForBlockingMotion( - "moveJ", std::chrono::seconds(2)); - - MoveOutcome conflict; - MoveOutcome during_stop; - api::CommandHeader_Feedback torque_off_response; - grpc::Status torque_off_status; - api::CommandHeader_Feedback stop_response; - grpc::Status stop_status; - MoveOutcome before_retired_handler_release; - bool stop_started = false; - std::future blocked_stop; - std::future torque_off; - if (move_started) { - conflict = moveL("aubo_arm"); - aubo_arm_->blockNextStopMotion(); - blocked_stop = std::async( - std::launch::async, - [this, &stop_response]() { - return stopMotion("aubo_arm", stop_response); - }); - stop_started = aubo_arm_->waitForBlockingStop( - std::chrono::seconds(2)); - if (stop_started) { - torque_off = std::async( - std::launch::async, - [this, &torque_off_response]() { - return torqueOff("aubo_arm", torque_off_response); - }); - during_stop = moveL("aubo_arm"); - } - aubo_arm_->releaseBlockingStop(); - before_retired_handler_release = moveL("aubo_arm"); - } - - // Keep the original RPC active until after the replacement MoveL has - // attempted to acquire control. This models a driver whose stopped motion - // takes time to unwind and guards the lease hand-off itself. - aubo_arm_->releaseBlockingMotion(); - const auto original_move = blocked_move.get(); - if (blocked_stop.valid()) { - stop_status = blocked_stop.get(); - } - if (torque_off.valid()) { - torque_off_status = torque_off.get(); - } - const auto resumed_move = moveL("aubo_arm"); - - ASSERT_TRUE(move_started); - ASSERT_TRUE(stop_started); - EXPECT_EQ(conflict.status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ(conflict.response_error, conflict.status.error_message()); - EXPECT_EQ(during_stop.status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ(during_stop.response_error, - during_stop.status.error_message()); - EXPECT_TRUE(torque_off_status.ok()) - << torque_off_status.error_message(); - EXPECT_TRUE(torque_off_response.success()) - << torque_off_response.error_message(); - EXPECT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_TRUE(stop_response.success()) - << stop_response.error_message(); - EXPECT_EQ( - before_retired_handler_release.status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_TRUE(resumed_move.status.ok()) - << resumed_move.status.error_message(); - EXPECT_TRUE(resumed_move.response_success) - << resumed_move.response_error; - EXPECT_TRUE(original_move.status.ok()) - << original_move.status.error_message(); - EXPECT_TRUE(original_move.response_success) - << original_move.response_error; - EXPECT_EQ(aubo_arm_->moveJCalls(), 1); - EXPECT_EQ(aubo_arm_->moveLCalls(), 1); - EXPECT_EQ(aubo_arm_->stopMotionCalls(), 2); - EXPECT_EQ(aubo_arm_->torqueOffCalls(), 2); -} - -TEST_F(GrpcArmServiceTest, MoveBindsLeaseRevocationCancellation) -{ - const auto outcome = moveJ("aubo_arm"); - - ASSERT_TRUE(outcome.status.ok()) - << outcome.status.error_message(); - EXPECT_TRUE(outcome.response_success) << outcome.response_error; - EXPECT_TRUE(aubo_arm_->lastMotionHadCancellation()); - EXPECT_FALSE(aubo_arm_->lastMotionCancellationRequested()); -} - -TEST_F(GrpcArmServiceTest, - IdenticalCommandIdReplaysCachedResultWithoutRedispatch) -{ - api::MoveJ_Response first; - api::MoveJ_Response retry; - - const auto first_status = identifiedMoveJ( - "arm-movej-idempotency-1", 0.1, first); - const auto retry_status = identifiedMoveJ( - "arm-movej-idempotency-1", 0.1, retry); - - ASSERT_TRUE(first_status.ok()) << first_status.error_message(); - ASSERT_TRUE(retry_status.ok()) << retry_status.error_message(); - EXPECT_TRUE(first.header().success()); - EXPECT_TRUE(retry.header().success()); - EXPECT_EQ( - retry.header().execution_state(), - api::COMMAND_EXECUTION_STATE_COMPLETED); - EXPECT_EQ(retry.header().command_id(), "arm-movej-idempotency-1"); - EXPECT_EQ(aubo_arm_->moveJCalls(), 1); -} - -TEST_F(GrpcArmServiceTest, - ReusedCommandIdWithDifferentPayloadIsRejectedWithoutRedispatch) -{ - api::MoveJ_Response first; - api::MoveJ_Response conflict; - - const auto first_status = identifiedMoveJ( - "arm-movej-conflict-1", 0.1, first); - const auto conflict_status = identifiedMoveJ( - "arm-movej-conflict-1", 0.2, conflict); - - ASSERT_TRUE(first_status.ok()) << first_status.error_message(); - EXPECT_EQ( - conflict_status.error_code(), grpc::StatusCode::ALREADY_EXISTS); - EXPECT_FALSE(conflict.header().success()); - EXPECT_EQ( - conflict.header().reason_code(), - api::COMMAND_REASON_CODE_COMMAND_ID_CONFLICT); - EXPECT_EQ(aubo_arm_->moveJCalls(), 1); -} - -TEST_F(GrpcArmServiceTest, - StopAllCancelsInFlightTorqueOnWithoutReportingSuccess) -{ - aubo_arm_->blockNextTorqueOn(); - auto blocked_torque_on = std::async( - std::launch::async, - [this]() { return torqueOn("aubo_arm"); }); - - const bool torque_on_started = aubo_arm_->waitForBlockingTorqueOn( - std::chrono::seconds(2)); - auto& admission = globalStopAllAdmissionGate(); - StopAllAdmissionGate::StopAllTicket stop_all_ticket; - if (torque_on_started) { - stop_all_ticket = admission.beginStopAll(); - } - - const bool cancelled_promptly = - blocked_torque_on.wait_for(std::chrono::seconds(2)) == - std::future_status::ready; - if (!cancelled_promptly) { - aubo_arm_->releaseBlockingTorqueOn(); - } - const auto outcome = blocked_torque_on.get(); - - ASSERT_TRUE(torque_on_started); - ASSERT_TRUE(stop_all_ticket.valid()); - EXPECT_TRUE(cancelled_promptly); - EXPECT_EQ(outcome.status.error_code(), grpc::StatusCode::UNAVAILABLE); - EXPECT_FALSE(outcome.response_success); - EXPECT_EQ(outcome.response_error, outcome.status.error_message()); - EXPECT_NE(outcome.response_error.find("StopAll"), std::string::npos); - EXPECT_EQ(aubo_arm_->torqueOnCalls(), 1); - EXPECT_TRUE(aubo_arm_->lastTorqueOnHadCancellation()); - EXPECT_TRUE(aubo_arm_->lastTorqueOnCancellationRequested()); - - EXPECT_TRUE(admission.finishStopAll(stop_all_ticket, true)); -} - -TEST_F(GrpcArmServiceTest, - StopAllPreservesTorqueOnSafetyTerminationFailure) -{ - aubo_arm_->blockNextTorqueOn(); - aubo_arm_->failNextTorqueOnCancellation(); - auto blocked_torque_on = std::async( - std::launch::async, - [this]() { return torqueOn("aubo_arm"); }); - - const bool torque_on_started = aubo_arm_->waitForBlockingTorqueOn( - std::chrono::seconds(2)); - auto& admission = globalStopAllAdmissionGate(); - StopAllAdmissionGate::StopAllTicket stop_all_ticket; - if (torque_on_started) { - stop_all_ticket = admission.beginStopAll(); - } - - const bool completed_promptly = - blocked_torque_on.wait_for(std::chrono::seconds(2)) == - std::future_status::ready; - if (!completed_promptly) { - aubo_arm_->releaseBlockingTorqueOn(); - } - const auto outcome = blocked_torque_on.get(); - - ASSERT_TRUE(torque_on_started); - ASSERT_TRUE(stop_all_ticket.valid()); - EXPECT_TRUE(completed_promptly); - EXPECT_EQ(outcome.status.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_FALSE(outcome.response_success); - EXPECT_EQ( - outcome.response_error, - "simulated torqueOn safety termination failure"); - EXPECT_EQ(outcome.status.error_message(), outcome.response_error); - EXPECT_TRUE(aubo_arm_->lastTorqueOnCancellationRequested()); - - EXPECT_FALSE(admission.finishStopAll(stop_all_ticket, false)); -} - -TEST_F(GrpcArmServiceTest, - ClientCancellationPreservesTorqueOnSafetyTerminationFailure) -{ - std::mutex records_mutex; - std::condition_variable records_changed; - std::vector records; - - grpc::ServerBuilder builder; - const std::string socket_path = - "/tmp/cmvr_grpc_arm_service_test_" + - std::to_string(static_cast(::getpid())) + ".sock"; - std::remove(socket_path.c_str()); - const std::string address = "unix:" + socket_path; - builder.AddListeningPort( - address, - grpc::InsecureServerCredentials()); - builder.RegisterService(service_.get()); - std::vector> factories; - factories.emplace_back(makeGrpcErrorLoggingInterceptorFactory( - [&records, &records_mutex, &records_changed]( - const GrpcFailureRecord& record) { - { - std::lock_guard lock(records_mutex); - records.push_back(record); - } - records_changed.notify_all(); - })); - builder.experimental().SetInterceptorCreators(std::move(factories)); - auto server = builder.BuildAndStart(); - ASSERT_NE(server, nullptr); - - const auto channel = grpc::CreateChannel( - address, - grpc::InsecureChannelCredentials()); - auto stub = api::ArmService::NewStub(channel); - grpc::ClientContext client_context; - client_context.set_deadline( - std::chrono::system_clock::now() + std::chrono::seconds(3)); - api::CommandHeader_Request request; - request.set_device_id("aubo_arm"); - api::CommandHeader_Feedback response; - grpc::Status client_status; - - aubo_arm_->blockNextTorqueOn(); - aubo_arm_->failNextTorqueOnCancellation(); - std::thread client_call([&]() { - client_status = stub->torqueOn( - &client_context, request, &response); - }); - const bool torque_on_started = aubo_arm_->waitForBlockingTorqueOn( - std::chrono::seconds(2)); - client_context.TryCancel(); - client_call.join(); - - bool failure_recorded = false; - { - std::unique_lock lock(records_mutex); - failure_recorded = records_changed.wait_for( - lock, - std::chrono::seconds(2), - [&records]() { return !records.empty(); }); - } - if (!failure_recorded) { - aubo_arm_->releaseBlockingTorqueOn(); - } - server->Shutdown(); - server->Wait(); - std::remove(socket_path.c_str()); - - ASSERT_TRUE(torque_on_started); - EXPECT_EQ(client_status.error_code(), grpc::StatusCode::CANCELLED); - ASSERT_TRUE(failure_recorded); - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records.front().kind, GrpcFailureKind::GRPC_STATUS); - EXPECT_EQ(records.front().status_code, grpc::StatusCode::INTERNAL); - EXPECT_EQ(records.front().severity, GrpcFailureSeverity::ERROR); - EXPECT_EQ( - records.front().detail, - "simulated torqueOn safety termination failure"); - EXPECT_TRUE(aubo_arm_->lastTorqueOnCancellationRequested()); -} - -TEST_F(GrpcArmServiceTest, - StopAllGateRejectsMutatingCommandsButAllowsReadsAndStops) -{ - auto& admission = globalStopAllAdmissionGate(); - const auto ticket = admission.beginStopAll(); - ASSERT_TRUE(ticket.valid()); - - const auto rejected_move = moveJ("aubo_arm"); - - api::JsonDeviceCommand_Feedback json_response; - const auto json_status = execute( - "aubo_arm", R"({"command":"cabinet_io"})", json_response); - - api::JointRequest state_request; - state_request.mutable_header()->set_device_id("aubo_arm"); - api::JointResponse state_response; - grpc::ServerContext state_context; - const auto state_status = service_->getJointState( - &state_context, &state_request, &state_response); - - api::CommandHeader_Feedback stop_response; - const auto stop_status = stopMotion("aubo_arm", stop_response); - - EXPECT_EQ( - rejected_move.status.error_code(), - grpc::StatusCode::UNAVAILABLE); - EXPECT_FALSE(rejected_move.response_success); - EXPECT_EQ(aubo_arm_->moveJCalls(), 0); - EXPECT_EQ(json_status.error_code(), grpc::StatusCode::UNAVAILABLE); - EXPECT_FALSE(json_response.header().success()); - EXPECT_EQ(aubo_arm_->execute_calls, 0); - - EXPECT_TRUE(state_status.ok()) << state_status.error_message(); - EXPECT_TRUE(state_response.header().success()); - EXPECT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_TRUE(stop_response.success()) - << stop_response.error_message(); - EXPECT_EQ(aubo_arm_->stopMotionCalls(), 2); - - EXPECT_TRUE(admission.finishStopAll(ticket, true)); - const auto resumed_move = moveJ("aubo_arm"); - EXPECT_TRUE(resumed_move.status.ok()) - << resumed_move.status.error_message(); - EXPECT_TRUE(resumed_move.response_success) - << resumed_move.response_error; - EXPECT_EQ(aubo_arm_->moveJCalls(), 1); -} - -TEST_F(GrpcArmServiceTest, - StopMotionRevokesBlockedMoveLLeaseBeforeMoveJReturns) -{ - aubo_arm_->blockNextMotion(); - auto blocked_move = std::async( - std::launch::async, - [this]() { return moveL("aubo_arm"); }); - - const bool move_started = aubo_arm_->waitForBlockingMotion( - "moveL", std::chrono::seconds(2)); - - MoveOutcome conflict; - api::CommandHeader_Feedback stop_response; - grpc::Status stop_status; - MoveOutcome before_retired_handler_release; - if (move_started) { - conflict = moveJ("aubo_arm"); - auto stop = std::async( - std::launch::async, - [this, &stop_response]() { - return stopMotion("aubo_arm", stop_response); - }); - before_retired_handler_release = moveJ("aubo_arm"); - aubo_arm_->releaseBlockingMotion(); - stop_status = stop.get(); - } - - aubo_arm_->releaseBlockingMotion(); - const auto original_move = blocked_move.get(); - const auto resumed_move = moveJ("aubo_arm"); - - ASSERT_TRUE(move_started); - EXPECT_EQ(conflict.status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ(conflict.response_error, conflict.status.error_message()); - EXPECT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_TRUE(stop_response.success()) - << stop_response.error_message(); - EXPECT_EQ( - before_retired_handler_release.status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_TRUE(resumed_move.status.ok()) - << resumed_move.status.error_message(); - EXPECT_TRUE(resumed_move.response_success) - << resumed_move.response_error; - EXPECT_TRUE(original_move.status.ok()) - << original_move.status.error_message(); - EXPECT_TRUE(original_move.response_success) - << original_move.response_error; - EXPECT_EQ(aubo_arm_->moveJCalls(), 1); - EXPECT_EQ(aubo_arm_->moveLCalls(), 1); - EXPECT_EQ(aubo_arm_->stopMotionCalls(), 2); -} - -TEST_F(GrpcArmServiceTest, StopMotionFailureRetainsSafetyBarrier) -{ - auto& authority = control::ControlAuthorityManager::instance(); - const auto action_lease = authority.tryAcquire( - "aubo_arm", "action-queue:test", std::chrono::hours(1)); - ASSERT_TRUE(action_lease.acquired) << action_lease.detail; - aubo_arm_->failNextStopMotion(); - - api::CommandHeader_Feedback stop_response; - const auto stop_status = stopMotion("aubo_arm", stop_response); - const auto rejected_move = moveJ("aubo_arm"); - - EXPECT_EQ(stop_status.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_FALSE(stop_response.success()); - EXPECT_EQ( - stop_response.reason_code(), - api::COMMAND_REASON_CODE_STOP_UNCONFIRMED); - EXPECT_FALSE(authority.validate(action_lease.token)); - EXPECT_TRUE(authority.isLeased("aubo_arm")); - EXPECT_EQ( - rejected_move.status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ(aubo_arm_->moveJCalls(), 0); - EXPECT_EQ(aubo_arm_->stopMotionCalls(), 1); - - authority.release(action_lease.token); - const auto recovery = authority.preemptAcquire( - "aubo_arm", "confirmed-stop-recovery", std::chrono::hours(1)); - ASSERT_TRUE(recovery.acquired) << recovery.detail; - ASSERT_TRUE(authority.waitForPreemptedRelease( - recovery.token, std::chrono::milliseconds::zero())); - ASSERT_TRUE(authority.recoverRetiredSafetyHolders(recovery.token)); - authority.release(recovery.token); - const auto recovered = authority.tryAcquire( - "aubo_arm", "move-after-recovery", std::chrono::hours(1)); - EXPECT_TRUE(recovered.acquired) << recovered.detail; - authority.release(recovered.token); -} - -TEST_F(GrpcArmServiceTest, StopMotionExceptionRetainsSafetyBarrier) -{ - auto& authority = control::ControlAuthorityManager::instance(); - const auto action_lease = authority.tryAcquire( - "aubo_arm", "action-queue:test", std::chrono::hours(1)); - ASSERT_TRUE(action_lease.acquired) << action_lease.detail; - aubo_arm_->throwNextStopMotion(); - - api::CommandHeader_Feedback stop_response; - const auto stop_status = stopMotion("aubo_arm", stop_response); - const auto rejected_move = moveL("aubo_arm"); - - EXPECT_EQ( - stop_status.error_code(), grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_FALSE(stop_response.success()); - EXPECT_EQ( - stop_response.reason_code(), - api::COMMAND_REASON_CODE_STOP_UNCONFIRMED); - EXPECT_FALSE(authority.validate(action_lease.token)); - EXPECT_TRUE(authority.isLeased("aubo_arm")); - EXPECT_EQ( - rejected_move.status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ(aubo_arm_->moveLCalls(), 0); - EXPECT_EQ(aubo_arm_->stopMotionCalls(), 1); - - authority.release(action_lease.token); - const auto recovery = authority.preemptAcquire( - "aubo_arm", "confirmed-exception-recovery", std::chrono::hours(1)); - ASSERT_TRUE(recovery.acquired) << recovery.detail; - ASSERT_TRUE(authority.waitForPreemptedRelease( - recovery.token, std::chrono::milliseconds::zero())); - ASSERT_TRUE(authority.recoverRetiredSafetyHolders(recovery.token)); - authority.release(recovery.token); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/grpc_arm_teleop_service_test.cpp b/cmvr-es/service/grpc/server/tests/grpc_arm_teleop_service_test.cpp deleted file mode 100644 index 0a6be187..00000000 --- a/cmvr-es/service/grpc/server/tests/grpc_arm_teleop_service_test.cpp +++ /dev/null @@ -1,920 +0,0 @@ -#include "service/grpc/server/include/grpc_arm_teleop_service.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "manager/safety_manager/include/device_safety_endpoint.h" -#include "manager/safety_manager/include/safety_manager.h" -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" - -namespace cmvr::service { -namespace { - -using namespace std::chrono_literals; - -std::atomic g_socket_sequence{0}; - -arm_teleop::RobotManifest makeManifest() -{ - arm_teleop::RobotManifest manifest; - manifest.set_robot_id("fake_humanoid_arm"); - manifest.set_model_sha256(std::string(64, 'a')); - manifest.set_calibration_sha256(std::string(64, 'b')); - manifest.add_joint_names("shoulder_joint"); - manifest.add_joint_names("elbow_joint"); - manifest.set_position_unit("rad"); - manifest.set_velocity_unit("rad/s"); - manifest.set_effort_unit("N*m"); - manifest.set_base_frame("base_link"); - manifest.set_tool_frame("tool_link"); - return manifest; -} - -arm_teleop::ClientFrame makeOpenFrame( - const arm_teleop::RobotManifest& manifest, - const std::uint32_t watchdog_ms = 100, - const std::uint32_t lease_ms = 2000, - const bool request_force_feedback = false) -{ - arm_teleop::ClientFrame frame; - auto* open = frame.mutable_open(); - open->set_protocol_major(1); - open->set_protocol_minor(0); - open->set_client_instance_id("test-client"); - *open->mutable_expected_robot() = manifest; - open->set_requested_command_rate_hz(200); - open->set_requested_state_rate_hz(100); - open->set_watchdog_timeout_ms(watchdog_ms); - open->set_requested_lease_ms(lease_ms); - open->set_request_force_feedback(request_force_feedback); - return frame; -} - -arm_teleop::ClientFrame makeSetpoint( - const std::uint64_t sequence, - const std::uint32_t valid_for_us = 50000) -{ - arm_teleop::ClientFrame frame; - auto* setpoint = frame.mutable_setpoint(); - setpoint->set_sequence(sequence); - setpoint->add_position_rad(0.1 * static_cast(sequence)); - setpoint->add_position_rad(0.2 * static_cast(sequence)); - setpoint->add_velocity_rad_s(0.01); - setpoint->add_velocity_rad_s(0.02); - setpoint->set_valid_for_us(valid_for_us); - return frame; -} - -arm_teleop::ClientFrame makeHeartbeat(const std::uint64_t sequence) -{ - arm_teleop::ClientFrame frame; - frame.mutable_heartbeat()->set_sequence(sequence); - return frame; -} - -arm_teleop::ClientFrame makeStop( - const arm_teleop::StopReason reason = - arm_teleop::STOP_REASON_OPERATOR_REQUEST) -{ - arm_teleop::ClientFrame frame; - frame.mutable_stop()->set_reason(reason); - frame.mutable_stop()->set_detail("test stop"); - return frame; -} - -class FakeArmTeleopBackend final : public ArmTeleopBackend { -public: - explicit FakeArmTeleopBackend( - arm_teleop::RobotManifest manifest = makeManifest()) - : manifest_(std::move(manifest)) - { - } - - bool available() const noexcept override { return true; } - - arm_teleop::RobotManifest manifest() const override - { - recordThread(); - return manifest_; - } - - bool supportsForceFeedback() const noexcept override { return true; } - - ArmTeleopBackendResult open( - const arm_teleop::OpenSession&) override - { - recordThread(); - std::lock_guard lock(mutex_); - ++open_calls_; - return open_result_; - } - - ArmTeleopBackendResult applySetpoint( - const arm_teleop::JointSetpoint& setpoint, - const std::chrono::steady_clock::time_point deadline) override - { - if (std::chrono::steady_clock::now() >= deadline) { - return ArmTeleopBackendResult::failure( - grpc::StatusCode::DEADLINE_EXCEEDED, - "fake backend received an expired setpoint"); - } - recordThread(); - std::unique_lock lock(mutex_); - apply_entered_ = true; - apply_entered_sequence_ = setpoint.sequence(); - cv_.notify_all(); - cv_.wait(lock, [&]() { return !block_apply_; }); - applied_sequences_.push_back(setpoint.sequence()); - return apply_result_; - } - - ArmTeleopBackendResult stop( - const arm_teleop::StopReason reason, - const std::string&) override - { - recordThread(); - std::lock_guard lock(mutex_); - stop_reasons_.push_back(reason); - return stop_result_; - } - - ArmTeleopBackendSnapshot snapshot() const override - { - recordThread(); - std::lock_guard lock(mutex_); - ArmTeleopBackendSnapshot snapshot; - auto* state = &snapshot.joint_state; - state->set_sample_sequence(++sample_sequence_); - state->add_position_rad(0.1); - state->add_position_rad(0.2); - state->add_velocity_rad_s(0.01); - state->add_velocity_rad_s(0.02); - state->add_effort_nm(1.0); - state->add_effort_nm(2.0); - state->set_position_valid(true); - state->set_velocity_valid(true); - state->set_effort_valid(true); - state->set_effort_source( - arm_teleop::EFFORT_SOURCE_JOINT_SENSOR); - snapshot.safety.set_connected(true); - snapshot.safety.set_powered_on(true); - return snapshot; - } - - void blockApply() - { - std::lock_guard lock(mutex_); - block_apply_ = true; - apply_entered_ = false; - apply_entered_sequence_ = 0; - } - - void releaseApply() - { - { - std::lock_guard lock(mutex_); - block_apply_ = false; - } - cv_.notify_all(); - } - - bool waitForApply( - const std::uint64_t sequence, - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return cv_.wait_for(lock, timeout, [&]() { - return apply_entered_ && - apply_entered_sequence_ == sequence; - }); - } - - int openCalls() const - { - std::lock_guard lock(mutex_); - return open_calls_; - } - - std::vector appliedSequences() const - { - std::lock_guard lock(mutex_); - return applied_sequences_; - } - - std::vector stopReasons() const - { - std::lock_guard lock(mutex_); - return stop_reasons_; - } - - std::size_t backendThreadCount() const - { - std::lock_guard lock(thread_mutex_); - return backend_threads_.size(); - } - -private: - void recordThread() const - { - std::lock_guard lock(thread_mutex_); - backend_threads_.insert(std::this_thread::get_id()); - } - - arm_teleop::RobotManifest manifest_; - mutable std::mutex mutex_; - mutable std::condition_variable cv_; - bool block_apply_{false}; - bool apply_entered_{false}; - std::uint64_t apply_entered_sequence_{0}; - int open_calls_{0}; - std::vector applied_sequences_; - std::vector stop_reasons_; - mutable std::uint64_t sample_sequence_{0}; - ArmTeleopBackendResult open_result_{ - ArmTeleopBackendResult::ok()}; - ArmTeleopBackendResult apply_result_{ - ArmTeleopBackendResult::ok()}; - ArmTeleopBackendResult stop_result_{ - ArmTeleopBackendResult::ok()}; - - mutable std::mutex thread_mutex_; - mutable std::set backend_threads_; -}; - -class FakeTeleopSafetyEndpoint final - : public safety::DeviceSafetyEndpoint { -public: - FakeTeleopSafetyEndpoint() - { - descriptor_.device_id = makeManifest().robot_id(); - descriptor_.kind = device::DeviceKind::Arm; - descriptor_.default_policy = - safety::SafetyPolicyFamily::Control; - descriptor_.maximum_snapshot_age = 1s; - descriptor_.supports_active_refresh = true; - } - - safety::DeviceSafetyDescriptor descriptor() const override - { - return descriptor_; - } - - void bindPublisher( - safety::SafetySnapshotPublisher publisher) override - { - publisher_ = std::move(publisher); - } - - void requestSafetyRefresh() noexcept override - { - if (!publisher_) { - return; - } - safety::DeviceSafetySnapshot snapshot; - snapshot.device_id = descriptor_.device_id; - snapshot.condition = safety::SafetyCondition::Nominal; - snapshot.device_generation = generation_; - snapshot.sample_sequence = ++sequence_; - snapshot.observed_at = safety::SafetyClock::now(); - snapshot.connected = safety::TriState::True; - snapshot.operational_ready = safety::TriState::True; - snapshot.quiescent = safety::TriState::True; - snapshot.motion_active = safety::TriState::False; - snapshot.actuator_enabled = safety::TriState::True; - snapshot.emergency_stop_active = safety::TriState::False; - snapshot.protective_stop_active = safety::TriState::False; - snapshot.fault_active = safety::TriState::False; - (void)publisher_(std::move(snapshot)); - } - - void onDeviceGenerationChanged( - const std::uint64_t generation) noexcept override - { - generation_ = generation; - requestSafetyRefresh(); - } - - safety::HardwareCheckResult validateBeforeDispatch( - const safety::AdmissionPermit&) override - { - ++hardware_checks_; - return {true, safety::SafetyReason::None, {}}; - } - - safety::RecoveryCheckResult reconcileAdmissionState( - const safety::RecoveryContext&) override - { - return {true, safety::SafetyReason::None, {}}; - } - - int hardwareChecks() const noexcept - { - return hardware_checks_.load(); - } - -private: - safety::DeviceSafetyDescriptor descriptor_; - safety::SafetySnapshotPublisher publisher_; - std::uint64_t generation_{1}; - std::uint64_t sequence_{0}; - std::atomic hardware_checks_{0}; -}; - -class TeleopServerHarness final { -public: - explicit TeleopServerHarness( - std::shared_ptr backend, - safety::SafetyManager* safety_manager = nullptr) - : service_( - std::move(backend), nullptr, nullptr, - safety_manager) - { - socket_path_ = - "/tmp/cmvr_arm_teleop_service_test_" + - std::to_string(static_cast(::getpid())) + "_" + - std::to_string( - g_socket_sequence.fetch_add( - 1, std::memory_order_relaxed)) + - ".sock"; - std::remove(socket_path_.c_str()); - const std::string address = "unix:" + socket_path_; - - grpc::ServerBuilder builder; - builder.AddListeningPort( - address, grpc::InsecureServerCredentials()); - builder.RegisterService(&service_); - server_ = builder.BuildAndStart(); - if (!server_) { - throw std::runtime_error( - "failed to start in-process arm teleoperation server"); - } - channel_ = grpc::CreateChannel( - address, grpc::InsecureChannelCredentials()); - if (!channel_->WaitForConnected( - std::chrono::system_clock::now() + 2s)) { - throw std::runtime_error( - "failed to connect arm teleoperation test channel"); - } - stub_ = arm_teleop::ArmTeleopService::NewStub(channel_); - } - - ~TeleopServerHarness() - { - if (server_) { - server_->Shutdown(); - server_->Wait(); - } - if (!socket_path_.empty()) { - std::remove(socket_path_.c_str()); - } - } - - arm_teleop::ArmTeleopService::Stub& stub() { return *stub_; } - -private: - ArmTeleopServiceImpl service_; - std::unique_ptr server_; - std::shared_ptr channel_; - std::unique_ptr stub_; - std::string socket_path_; -}; - -template -void expectOpeningFrames(Stream& stream) -{ - arm_teleop::ServerFrame response; - ASSERT_TRUE(stream.Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_OPENED); - EXPECT_FALSE(response.status().session_id().empty()); - ASSERT_TRUE(stream.Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_READY); - EXPECT_TRUE(response.safety().connected()); -} - -TEST(ArmTeleopServiceTest, ProductionDisabledBackendRejectsOpen) -{ - TeleopServerHarness harness(makeDisabledArmTeleopBackend()); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 2s); - auto stream = harness.stub().Teleoperate(&context); - - ASSERT_TRUE(stream->Write(makeOpenFrame(makeManifest()))); - ASSERT_TRUE(stream->WritesDone()); - - arm_teleop::ServerFrame response; - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_REJECTED); - EXPECT_TRUE(response.safety().fault()); - const grpc::Status status = stream->Finish(); - EXPECT_EQ( - status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); -} - -TEST(ArmTeleopServiceTest, RequiresOpenAsFirstFrame) -{ - auto backend = std::make_shared(); - TeleopServerHarness harness(backend); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 2s); - auto stream = harness.stub().Teleoperate(&context); - - ASSERT_TRUE(stream->Write(makeSetpoint(1))); - ASSERT_TRUE(stream->WritesDone()); - - arm_teleop::ServerFrame response; - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_REJECTED); - const grpc::Status status = stream->Finish(); - EXPECT_EQ( - status.error_code(), - grpc::StatusCode::INVALID_ARGUMENT); - EXPECT_EQ(backend->openCalls(), 0); -} - -TEST(ArmTeleopServiceTest, RejectsManifestMismatchBeforeBackendOpen) -{ - auto backend = std::make_shared(); - TeleopServerHarness harness(backend); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 2s); - auto stream = harness.stub().Teleoperate(&context); - - auto mismatched = makeManifest(); - mismatched.set_calibration_sha256(std::string(64, 'c')); - ASSERT_TRUE(stream->Write(makeOpenFrame(mismatched))); - ASSERT_TRUE(stream->WritesDone()); - - arm_teleop::ServerFrame response; - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_REJECTED); - const grpc::Status status = stream->Finish(); - EXPECT_EQ( - status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ(backend->openCalls(), 0); -} - -TEST(ArmTeleopServiceTest, RejectsNonIncreasingSequenceAndStops) -{ - auto backend = std::make_shared(); - TeleopServerHarness harness(backend); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 2s); - auto stream = harness.stub().Teleoperate(&context); - - ASSERT_TRUE(stream->Write(makeOpenFrame(makeManifest()))); - expectOpeningFrames(*stream); - ASSERT_TRUE(stream->Write(makeSetpoint(1))); - - arm_teleop::ServerFrame response; - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_ACTIVE); - EXPECT_EQ(response.status().applied_sequence(), 1U); - - ASSERT_TRUE(stream->Write(makeHeartbeat(1))); - ASSERT_TRUE(stream->WritesDone()); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_REJECTED); - EXPECT_EQ( - response.status().stop_reason(), - arm_teleop::STOP_REASON_PROTOCOL_ERROR); - - const grpc::Status status = stream->Finish(); - EXPECT_EQ( - status.error_code(), - grpc::StatusCode::INVALID_ARGUMENT); - ASSERT_FALSE(backend->stopReasons().empty()); - EXPECT_EQ( - backend->stopReasons().back(), - arm_teleop::STOP_REASON_PROTOCOL_ERROR); - EXPECT_EQ(backend->backendThreadCount(), 1U); -} - -TEST(ArmTeleopServiceTest, ProtocolErrorCancelsReaderWithoutClientHalfClose) -{ - auto backend = std::make_shared(); - TeleopServerHarness harness(backend); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 2s); - auto stream = harness.stub().Teleoperate(&context); - - ASSERT_TRUE(stream->Write(makeOpenFrame(makeManifest()))); - expectOpeningFrames(*stream); - ASSERT_TRUE(stream->Write(makeHeartbeat(1))); - - arm_teleop::ServerFrame response; - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_READY); - - // Deliberately keep the client write half open after the duplicate - // sequence. The server must cancel its reader and return promptly. - ASSERT_TRUE(stream->Write(makeHeartbeat(1))); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_REJECTED); - EXPECT_EQ( - response.status().stop_reason(), - arm_teleop::STOP_REASON_PROTOCOL_ERROR); - const auto status = stream->Finish(); - // TryCancel is required to interrupt the server reader's blocking Read - // when the peer deliberately keeps its write half open. Depending on - // gRPC completion ordering, the client may therefore observe CANCELLED - // after it has already received the explicit protocol-error frame. - EXPECT_TRUE( - status.error_code() == grpc::StatusCode::INVALID_ARGUMENT || - status.error_code() == grpc::StatusCode::CANCELLED) - << status.error_message(); -} - -TEST(ArmTeleopServiceTest, WatchdogExpiresWithoutValidClientActivity) -{ - auto backend = std::make_shared(); - TeleopServerHarness harness(backend); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 2s); - auto stream = harness.stub().Teleoperate(&context); - - ASSERT_TRUE(stream->Write( - makeOpenFrame(makeManifest(), 20, 2000))); - expectOpeningFrames(*stream); - - arm_teleop::ServerFrame response; - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_WATCHDOG_EXPIRED); - EXPECT_EQ( - response.status().stop_reason(), - arm_teleop::STOP_REASON_WATCHDOG); - - const grpc::Status status = stream->Finish(); - EXPECT_TRUE( - status.error_code() == grpc::StatusCode::DEADLINE_EXCEEDED || - status.error_code() == grpc::StatusCode::CANCELLED) - << status.error_message(); - ASSERT_FALSE(backend->stopReasons().empty()); - EXPECT_EQ( - backend->stopReasons().back(), - arm_teleop::STOP_REASON_WATCHDOG); -} - -TEST(ArmTeleopServiceTest, ValidHeartbeatsRenewControlLease) -{ - auto backend = std::make_shared(); - TeleopServerHarness harness(backend); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 3s); - auto stream = harness.stub().Teleoperate(&context); - - ASSERT_TRUE(stream->Write( - makeOpenFrame(makeManifest(), 100, 200))); - expectOpeningFrames(*stream); - - arm_teleop::ServerFrame response; - for (std::uint64_t sequence = 1; sequence <= 7; ++sequence) { - std::this_thread::sleep_for(40ms); - ASSERT_TRUE(stream->Write(makeHeartbeat(sequence))); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_READY); - EXPECT_EQ( - response.status().received_sequence(), - sequence); - EXPECT_GT(response.status().lease_remaining_ms(), 0U); - } - - ASSERT_TRUE(stream->Write(makeStop())); - ASSERT_TRUE(stream->WritesDone()); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_STOPPED); - EXPECT_TRUE(stream->Finish().ok()); -} - -TEST(ArmTeleopServiceTest, RejectsSecondControllerWhileLeaseIsActive) -{ - auto backend = std::make_shared(); - TeleopServerHarness harness(backend); - - grpc::ClientContext first_context; - first_context.set_deadline( - std::chrono::system_clock::now() + 3s); - auto first_stream = - harness.stub().Teleoperate(&first_context); - ASSERT_TRUE(first_stream->Write( - makeOpenFrame(makeManifest(), 500, 2000))); - expectOpeningFrames(*first_stream); - - grpc::ClientContext second_context; - second_context.set_deadline( - std::chrono::system_clock::now() + 2s); - auto second_stream = - harness.stub().Teleoperate(&second_context); - ASSERT_TRUE(second_stream->Write( - makeOpenFrame(makeManifest(), 500, 2000))); - ASSERT_TRUE(second_stream->WritesDone()); - - arm_teleop::ServerFrame response; - ASSERT_TRUE(second_stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_REJECTED); - const grpc::Status second_status = - second_stream->Finish(); - EXPECT_EQ( - second_status.error_code(), - grpc::StatusCode::RESOURCE_EXHAUSTED); - - ASSERT_TRUE(first_stream->Write(makeStop())); - ASSERT_TRUE(first_stream->WritesDone()); - ASSERT_TRUE(first_stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_STOPPED); - EXPECT_TRUE(first_stream->Finish().ok()); -} - -TEST(ArmTeleopServiceTest, LatestOnlySlotDropsIntermediateSetpoints) -{ - auto backend = std::make_shared(); - TeleopServerHarness harness(backend); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 3s); - auto stream = harness.stub().Teleoperate(&context); - - ASSERT_TRUE(stream->Write( - makeOpenFrame(makeManifest(), 500, 2000))); - expectOpeningFrames(*stream); - - backend->blockApply(); - ASSERT_TRUE(stream->Write(makeSetpoint(1, 400000))); - ASSERT_TRUE(backend->waitForApply(1, 1s)); - ASSERT_TRUE(stream->Write(makeSetpoint(2, 400000))); - ASSERT_TRUE(stream->Write(makeSetpoint(3, 400000))); - ASSERT_TRUE(stream->Write(makeSetpoint(4, 400000))); - std::this_thread::sleep_for(30ms); - backend->releaseApply(); - - arm_teleop::ServerFrame response; - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ(response.status().applied_sequence(), 1U); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ(response.status().applied_sequence(), 4U); - EXPECT_GE(response.status().dropped_setpoints(), 2U); - - ASSERT_TRUE(stream->Write(makeStop())); - ASSERT_TRUE(stream->WritesDone()); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_STOPPED); - EXPECT_TRUE(stream->Finish().ok()); - - const auto applied = backend->appliedSequences(); - ASSERT_EQ(applied.size(), 2U); - EXPECT_EQ(applied[0], 1U); - EXPECT_EQ(applied[1], 4U); - EXPECT_EQ(backend->backendThreadCount(), 1U); -} - -TEST(ArmTeleopServiceTest, ExpiredSetpointIsNeverDispatched) -{ - auto backend = std::make_shared(); - TeleopServerHarness harness(backend); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 3s); - auto stream = harness.stub().Teleoperate(&context); - - ASSERT_TRUE(stream->Write( - makeOpenFrame(makeManifest(), 500, 2000))); - expectOpeningFrames(*stream); - - backend->blockApply(); - ASSERT_TRUE(stream->Write(makeSetpoint(1, 400000))); - ASSERT_TRUE(backend->waitForApply(1, 1s)); - ASSERT_TRUE(stream->Write(makeSetpoint(2, 1000))); - std::this_thread::sleep_for(30ms); - backend->releaseApply(); - - arm_teleop::ServerFrame response; - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ(response.status().applied_sequence(), 1U); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_HOLDING); - EXPECT_EQ(response.status().received_sequence(), 2U); - EXPECT_EQ(response.status().applied_sequence(), 1U); - EXPECT_EQ(response.status().rejected_setpoints(), 1U); - - ASSERT_TRUE(stream->Write(makeStop())); - ASSERT_TRUE(stream->WritesDone()); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_STOPPED); - EXPECT_TRUE(stream->Finish().ok()); - - const auto applied = backend->appliedSequences(); - ASSERT_EQ(applied.size(), 1U); - EXPECT_EQ(applied.front(), 1U); -} - -TEST(ArmTeleopServiceTest, - StopAllFencesDispatchRejectsAdmissionAndAllowsReuse) -{ - auto& authority = control::ControlAuthorityManager::instance(); - auto& admission = globalStopAllAdmissionGate(); - authority.clear(); - admission.clearForTesting(); - - auto backend = std::make_shared(); - TeleopServerHarness harness(backend); - grpc::ClientContext active_context; - active_context.set_deadline( - std::chrono::system_clock::now() + 3s); - auto active_stream = harness.stub().Teleoperate(&active_context); - - ASSERT_TRUE(active_stream->Write( - makeOpenFrame(makeManifest(), 500, 2000))); - expectOpeningFrames(*active_stream); - - backend->blockApply(); - ASSERT_TRUE(active_stream->Write(makeSetpoint(1, 400000))); - ASSERT_TRUE(backend->waitForApply(1, 1s)); - - const auto stop_all_ticket = admission.beginStopAll(); - ASSERT_TRUE(stop_all_ticket.valid()); - - grpc::ClientContext blocked_context; - blocked_context.set_deadline( - std::chrono::system_clock::now() + 2s); - auto blocked_stream = harness.stub().Teleoperate(&blocked_context); - ASSERT_TRUE(blocked_stream->Write(makeOpenFrame(makeManifest()))); - ASSERT_TRUE(blocked_stream->WritesDone()); - arm_teleop::ServerFrame response; - ASSERT_TRUE(blocked_stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_REJECTED); - const auto blocked_status = blocked_stream->Finish(); - EXPECT_EQ( - blocked_status.error_code(), grpc::StatusCode::UNAVAILABLE); - EXPECT_EQ(backend->openCalls(), 1); - - const auto safety_lease = authority.preemptAcquire( - makeManifest().robot_id(), "stop-all-test", - std::chrono::hours(1)); - ASSERT_TRUE(safety_lease.acquired) << safety_lease.detail; - const auto safety_token = safety_lease.token; - auto dispatch_fence = std::async( - std::launch::async, - [&authority, safety_token] { - return authority.waitForPreemptedRelease(safety_token, 1s); - }); - - EXPECT_EQ( - dispatch_fence.wait_for(50ms), std::future_status::timeout); - backend->releaseApply(); - ASSERT_EQ( - dispatch_fence.wait_for(1s), std::future_status::ready); - EXPECT_TRUE(dispatch_fence.get()); - - ASSERT_TRUE(active_stream->Read(&response)); - EXPECT_EQ(response.status().applied_sequence(), 1U); - ASSERT_TRUE(active_stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_LEASE_LOST); - EXPECT_EQ( - response.status().stop_reason(), - arm_teleop::STOP_REASON_LEASE_REVOKED); - const auto active_status = active_stream->Finish(); - EXPECT_TRUE( - active_status.error_code() == grpc::StatusCode::ABORTED || - active_status.error_code() == grpc::StatusCode::CANCELLED) - << active_status.error_message(); - - const auto applied = backend->appliedSequences(); - ASSERT_EQ(applied.size(), 1U); - EXPECT_EQ(applied.front(), 1U); - const auto stopped = backend->stopReasons(); - ASSERT_FALSE(stopped.empty()); - EXPECT_EQ( - stopped.back(), arm_teleop::STOP_REASON_LEASE_REVOKED); - - authority.release(safety_token); - ASSERT_TRUE(admission.finishStopAll(stop_all_ticket, true)); - - grpc::ClientContext resumed_context; - resumed_context.set_deadline( - std::chrono::system_clock::now() + 2s); - auto resumed_stream = harness.stub().Teleoperate(&resumed_context); - ASSERT_TRUE(resumed_stream->Write(makeOpenFrame(makeManifest()))); - expectOpeningFrames(*resumed_stream); - ASSERT_TRUE(resumed_stream->Write(makeStop())); - ASSERT_TRUE(resumed_stream->WritesDone()); - ASSERT_TRUE(resumed_stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_STOPPED); - EXPECT_TRUE(resumed_stream->Finish().ok()); - EXPECT_EQ(backend->openCalls(), 2); - - authority.clear(); - admission.clearForTesting(); -} - -TEST(ArmTeleopServiceTest, - CoordinatorInvalidationStopsExistingSessionBeforeAnotherSetpoint) -{ - safety::SafetyManagerConfig config; - config.enforcement_mode = safety::EnforcementMode::EnforceAll; - safety::SafetyManager coordinator(config); - auto endpoint = std::make_shared(); - ASSERT_TRUE(coordinator.registerDevice( - {endpoint->descriptor(), endpoint, {}})); - coordinator.updateDeviceRuntimeState( - makeManifest().robot_id(), - device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - - auto backend = std::make_shared(); - TeleopServerHarness harness(backend, &coordinator); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 2s); - auto stream = harness.stub().Teleoperate(&context); - - ASSERT_TRUE(stream->Write(makeOpenFrame(makeManifest(), 500, 1500))); - expectOpeningFrames(*stream); - EXPECT_EQ(endpoint->hardwareChecks(), 1); - - ASSERT_TRUE(stream->Write(makeSetpoint(1))); - arm_teleop::ServerFrame response; - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ(response.status().phase(), arm_teleop::SESSION_PHASE_ACTIVE); - EXPECT_EQ(response.status().applied_sequence(), 1U); - EXPECT_EQ(endpoint->hardwareChecks(), 2); - - coordinator.quarantineDevice( - makeManifest().robot_id(), - safety::SafetyReason::OutcomeUnknown, - "test-quarantine"); - - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ( - response.status().phase(), - arm_teleop::SESSION_PHASE_LEASE_LOST); - EXPECT_EQ( - response.status().stop_reason(), - arm_teleop::STOP_REASON_EMERGENCY_STOP); - const auto status = stream->Finish(); - EXPECT_TRUE( - status.error_code() == grpc::StatusCode::FAILED_PRECONDITION || - status.error_code() == grpc::StatusCode::CANCELLED) - << status.error_message(); - EXPECT_EQ(backend->appliedSequences(), - (std::vector{1U})); - ASSERT_FALSE(backend->stopReasons().empty()); - EXPECT_EQ( - backend->stopReasons().back(), - arm_teleop::STOP_REASON_EMERGENCY_STOP); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/grpc_command_transaction_test.cpp b/cmvr-es/service/grpc/server/tests/grpc_command_transaction_test.cpp deleted file mode 100644 index 3ded4775..00000000 --- a/cmvr-es/service/grpc/server/tests/grpc_command_transaction_test.cpp +++ /dev/null @@ -1,454 +0,0 @@ -#include "service/grpc/server/include/grpc_command_transaction.h" - -#include -#include -#include -#include -#include - -#include - -#include "cmvr/api/arm_command.pb.h" -#include "manager/safety_manager/include/device_safety_endpoint.h" - -namespace cmvr::service { -namespace { - -class FakeEndpoint final : public safety::DeviceSafetyEndpoint { -public: - explicit FakeEndpoint(std::string device_id) - { - descriptor_.device_id = std::move(device_id); - descriptor_.kind = device::DeviceKind::Arm; - descriptor_.default_policy = safety::SafetyPolicyFamily::Control; - descriptor_.maximum_snapshot_age = std::chrono::seconds(1); - descriptor_.supports_active_refresh = true; - } - - safety::DeviceSafetyDescriptor descriptor() const override - { - return descriptor_; - } - - void bindPublisher(safety::SafetySnapshotPublisher publisher) override - { - publisher_ = std::move(publisher); - } - - void requestSafetyRefresh() noexcept override - { - if (!publisher_) { - return; - } - safety::DeviceSafetySnapshot snapshot; - snapshot.device_id = descriptor_.device_id; - snapshot.condition = safety::SafetyCondition::Nominal; - snapshot.device_generation = 1; - snapshot.sample_sequence = ++sequence_; - snapshot.observed_at = safety::SafetyClock::now(); - snapshot.connected = safety::TriState::True; - snapshot.operational_ready = safety::TriState::True; - snapshot.quiescent = safety::TriState::True; - snapshot.motion_active = safety::TriState::False; - snapshot.actuator_enabled = safety::TriState::True; - snapshot.emergency_stop_active = safety::TriState::False; - snapshot.protective_stop_active = safety::TriState::False; - snapshot.fault_active = safety::TriState::False; - (void)publisher_(std::move(snapshot)); - } - - safety::HardwareCheckResult validateBeforeDispatch( - const safety::AdmissionPermit&) override - { - ++hardware_checks; - return final_check; - } - - safety::RecoveryCheckResult reconcileAdmissionState( - const safety::RecoveryContext&) override - { - return {true, safety::SafetyReason::None, {}}; - } - - safety::DeviceSafetyDescriptor descriptor_; - safety::SafetySnapshotPublisher publisher_; - safety::HardwareCheckResult final_check{ - true, safety::SafetyReason::None, {}}; - std::atomic sequence_{0}; - std::atomic hardware_checks{0}; -}; - -api::MoveJ_Request moveRequest( - const safety::SafetyManager& coordinator, - const std::string& command_id, - const double target = 0.25) -{ - api::MoveJ_Request request; - request.mutable_header()->set_device_id("arm"); - request.mutable_header()->set_command_id(command_id); - request.mutable_header()->set_expected_service_instance_id( - coordinator.serviceInstanceId()); - request.mutable_header()->set_valid_for_ms(1000); - request.mutable_target()->add_position(target); - return request; -} - -grpc::Status executeMove( - safety::SafetyManager& coordinator, - const api::MoveJ_Request& request, - api::MoveJ_Response& response, - int& dispatches, - const bool throw_after_dispatch = false) -{ - grpc::ServerContext context; - return executeRegisteredGrpcCommand( - makeDefaultGrpcSecurityGateway(), - &context, - coordinator, - "/cmvr.api.ArmService/moveJ", - &request, - &response, - [&](GrpcCommandTransaction& transaction) { - if (!transaction.beginDispatch()) { - return transaction.dispatchStatus(); - } - ++dispatches; - if (throw_after_dispatch) { - throw std::runtime_error("simulated lost driver acknowledgement"); - } - response.mutable_header()->set_success(true); - return grpc::Status::OK; - }); -} - -TEST(GrpcCommandTransactionTest, - DeterministicHashIgnoresRetryIdentityButIncludesPayload) -{ - safety::SafetyManager coordinator; - auto first = moveRequest(coordinator, "command-1", 0.25); - auto retry = first; - retry.mutable_header()->set_command_id("command-2"); - retry.mutable_header()->set_valid_for_ms(2000); - retry.mutable_header()->mutable_timestamp()->set_seconds(1234); - auto changed = retry; - changed.mutable_target()->set_position(0, 0.5); - - const auto first_hash = deterministicGrpcPayloadHash( - "/cmvr.api.ArmService/moveJ", first); - EXPECT_FALSE(first_hash.empty()); - EXPECT_EQ( - first_hash, - deterministicGrpcPayloadHash( - "/cmvr.api.ArmService/moveJ", retry)); - EXPECT_NE( - first_hash, - deterministicGrpcPayloadHash( - "/cmvr.api.ArmService/moveJ", changed)); - EXPECT_NE( - first_hash, - deterministicGrpcPayloadHash( - "/cmvr.api.ArmService/moveL", first)); -} - -TEST(GrpcCommandTransactionTest, SameIdReturnsCachedResponseWithoutRedispatch) -{ - safety::SafetyManager coordinator; - auto endpoint = std::make_shared("arm"); - ASSERT_TRUE(coordinator.registerDevice( - {endpoint->descriptor(), endpoint, {}})); - coordinator.markStartupComplete(); - - const auto request = moveRequest(coordinator, "command-cache"); - api::MoveJ_Response first_response; - int dispatches = 0; - ASSERT_TRUE(executeMove( - coordinator, request, first_response, dispatches).ok()); - ASSERT_TRUE(first_response.header().success()); - EXPECT_EQ(dispatches, 1); - - auto retry = request; - retry.mutable_header()->set_valid_for_ms(2500); - retry.mutable_header()->mutable_timestamp()->set_seconds(42); - api::MoveJ_Response cached_response; - ASSERT_TRUE(executeMove( - coordinator, retry, cached_response, dispatches).ok()); - EXPECT_EQ(dispatches, 1); - EXPECT_TRUE(cached_response.header().success()); - EXPECT_EQ( - cached_response.header().execution_state(), - api::COMMAND_EXECUTION_STATE_COMPLETED); - EXPECT_EQ(cached_response.header().command_id(), "command-cache"); - - auto conflict = request; - conflict.mutable_target()->set_position(0, 0.75); - api::MoveJ_Response conflict_response; - const auto conflict_status = executeMove( - coordinator, conflict, conflict_response, dispatches); - EXPECT_EQ(conflict_status.error_code(), grpc::StatusCode::ALREADY_EXISTS); - EXPECT_EQ(dispatches, 1); - EXPECT_EQ( - conflict_response.header().reason_code(), - api::COMMAND_REASON_CODE_COMMAND_ID_CONFLICT); -} - -TEST(GrpcCommandTransactionTest, - EnforcedCommandRequiresIdentityAndRunsFinalHardwareCheck) -{ - safety::SafetyManagerConfig config; - config.enforcement_mode = safety::EnforcementMode::EnforceAll; - safety::SafetyManager coordinator(config); - auto endpoint = std::make_shared("arm"); - ASSERT_TRUE(coordinator.registerDevice( - {endpoint->descriptor(), endpoint, {}})); - coordinator.updateDeviceRuntimeState( - "arm", - device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - - auto missing_identity = moveRequest(coordinator, ""); - api::MoveJ_Response rejected; - int dispatches = 0; - const auto rejected_status = executeMove( - coordinator, missing_identity, rejected, dispatches); - EXPECT_EQ( - rejected_status.error_code(), grpc::StatusCode::INVALID_ARGUMENT); - EXPECT_EQ(dispatches, 0); - EXPECT_EQ( - rejected.header().reason_code(), - api::COMMAND_REASON_CODE_COMMAND_ID_REQUIRED); - - auto accepted = moveRequest(coordinator, "command-enforced"); - api::MoveJ_Response accepted_response; - ASSERT_TRUE(executeMove( - coordinator, accepted, accepted_response, dispatches).ok()); - EXPECT_EQ(dispatches, 1); - EXPECT_EQ(endpoint->hardware_checks.load(), 1); - EXPECT_EQ( - accepted_response.header().device_generation(), 1U); -} - -TEST(GrpcCommandTransactionTest, - ExceptionAfterDispatchIsQuarantinedAndNeverRedispatched) -{ - safety::SafetyManagerConfig config; - config.enforcement_mode = safety::EnforcementMode::EnforceAll; - safety::SafetyManager coordinator(config); - auto endpoint = std::make_shared("arm"); - ASSERT_TRUE(coordinator.registerDevice( - {endpoint->descriptor(), endpoint, {}})); - coordinator.updateDeviceRuntimeState( - "arm", - device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - - const auto request = moveRequest(coordinator, "command-unknown"); - api::MoveJ_Response response; - int dispatches = 0; - ASSERT_TRUE(executeMove( - coordinator, request, response, dispatches, true).ok()); - EXPECT_EQ(dispatches, 1); - EXPECT_EQ( - response.header().reason_code(), - api::COMMAND_REASON_CODE_OUTCOME_UNKNOWN); - ASSERT_EQ(coordinator.snapshot().devices.size(), 1U); - EXPECT_EQ( - coordinator.snapshot().devices.front().admission_state, - safety::DeviceAdmissionState::Quarantined); - - api::MoveJ_Response retry_response; - ASSERT_TRUE(executeMove( - coordinator, request, retry_response, dispatches).ok()); - EXPECT_EQ(dispatches, 1); - EXPECT_EQ( - retry_response.header().execution_state(), - api::COMMAND_EXECUTION_STATE_OUTCOME_UNKNOWN); -} - -TEST(GrpcCommandTransactionTest, - ScopedDispatchChecksHardwareForEverySubmission) -{ - safety::SafetyManagerConfig config; - config.enforcement_mode = safety::EnforcementMode::EnforceAll; - safety::SafetyManager coordinator(config); - auto endpoint = std::make_shared("arm"); - ASSERT_TRUE(coordinator.registerDevice( - {endpoint->descriptor(), endpoint, {}})); - coordinator.updateDeviceRuntimeState( - "arm", - device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - - const auto request = moveRequest(coordinator, "command-scoped"); - api::MoveJ_Response response; - grpc::ServerContext context; - int dispatches = 0; - const auto status = executeRegisteredGrpcCommand( - makeDefaultGrpcSecurityGateway(), - &context, - coordinator, - "/cmvr.api.ArmService/moveJ", - &request, - &response, - [&](GrpcCommandTransaction& transaction) { - for (int index = 0; index < 2; ++index) { - auto dispatch = transaction.beginScopedDispatch(); - if (!dispatch.acquired()) { - return transaction.dispatchStatus(); - } - ++dispatches; - } - response.mutable_header()->set_success(true); - return grpc::Status::OK; - }); - - EXPECT_TRUE(status.ok()); - EXPECT_TRUE(response.header().success()); - EXPECT_EQ(dispatches, 2); - EXPECT_EQ(endpoint->hardware_checks.load(), 2); -} - -TEST(GrpcCommandTransactionTest, - RevokedActuationPermitCannotSuppressInternalSafetyStop) -{ - safety::SafetyManagerConfig config; - config.enforcement_mode = safety::EnforcementMode::EnforceAll; - safety::SafetyManager coordinator(config); - auto endpoint = std::make_shared("arm"); - ASSERT_TRUE(coordinator.registerDevice( - {endpoint->descriptor(), endpoint, {}})); - coordinator.updateDeviceRuntimeState( - "arm", - device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - - const auto request = moveRequest(coordinator, "command-revoked"); - api::MoveJ_Response response; - grpc::ServerContext context; - int actuations = 0; - int safety_stops = 0; - const auto status = executeRegisteredGrpcCommand( - makeDefaultGrpcSecurityGateway(), - &context, - coordinator, - "/cmvr.api.ArmService/moveJ", - &request, - &response, - [&](GrpcCommandTransaction& transaction) { - { - auto dispatch = transaction.beginScopedDispatch(); - if (!dispatch.acquired()) { - return transaction.dispatchStatus(); - } - ++actuations; - } - - const auto stop_all = coordinator.stopAll("revoke-scoped-permit"); - EXPECT_TRUE(stop_all.success); - EXPECT_FALSE(transaction.revalidate()); - const auto revoked_status = transaction.dispatchStatus(); - EXPECT_FALSE(transaction.beginScopedDispatch().acquired()); - - auto stop_dispatch = transaction.beginSafetyStopDispatch(); - if (stop_dispatch.acquired()) { - ++safety_stops; - } - response.mutable_header()->set_success(false); - return revoked_status; - }); - - // Ledger-backed commands report their terminal outcome in Feedback. - EXPECT_TRUE(status.ok()); - EXPECT_FALSE(response.header().success()); - EXPECT_EQ( - response.header().reason_code(), - api::COMMAND_REASON_CODE_SAFETY_LATCHED); - EXPECT_EQ(actuations, 1); - EXPECT_EQ(safety_stops, 1); - EXPECT_EQ(endpoint->hardware_checks.load(), 2); -} - -TEST(GrpcCommandTransactionTest, - ServerDerivedStopRemainsDispatchableWhenActuationIsQuarantined) -{ - safety::SafetyManagerConfig config; - config.enforcement_mode = safety::EnforcementMode::EnforceAll; - safety::SafetyManager coordinator(config); - auto endpoint = std::make_shared("arm"); - ASSERT_TRUE(coordinator.registerDevice( - {endpoint->descriptor(), endpoint, {}})); - coordinator.updateDeviceRuntimeState( - "arm", - device::ManagedDeviceState::Running, - {device::DeviceHealthState::Healthy, {}}); - coordinator.markStartupComplete(); - coordinator.quarantineDevice( - "arm", safety::SafetyReason::OutcomeUnknown, - "uncertain-ptz-start"); - - const auto registered = defaultGrpcMethodPolicyRegistry().find( - "/cmvr.api.CameraService/ControlPtz"); - ASSERT_TRUE(registered.has_value()); - - auto start_request = moveRequest(coordinator, "ptz-start"); - api::MoveJ_Response start_response; - grpc::ServerContext start_context; - int start_dispatches = 0; - const auto start_status = executeServerDerivedGrpcCommand( - makeDefaultGrpcSecurityGateway(), - &start_context, - coordinator, - "/cmvr.api.CameraService/ControlPtz", - *registered, - &start_request, - &start_response, - [&](GrpcCommandTransaction& transaction) { - if (!transaction.beginDispatch()) { - return transaction.dispatchStatus(); - } - ++start_dispatches; - start_response.mutable_header()->set_success(true); - return grpc::Status::OK; - }); - EXPECT_TRUE(start_status.ok()); - EXPECT_EQ(start_dispatches, 0); - EXPECT_FALSE(start_response.header().success()); - EXPECT_EQ( - start_response.header().reason_code(), - api::COMMAND_REASON_CODE_SAFETY_LATCHED); - - auto stop_request = moveRequest(coordinator, "ptz-stop"); - api::MoveJ_Response stop_response; - grpc::ServerContext stop_context; - auto stop_policy = *registered; - stop_policy.access = GrpcAccessClass::Stop; - stop_policy.command_intent = safety::CommandIntent::Stop; - stop_policy.safety_lane = true; - int stop_dispatches = 0; - const auto stop_status = executeServerDerivedGrpcCommand( - makeDefaultGrpcSecurityGateway(), - &stop_context, - coordinator, - "/cmvr.api.CameraService/ControlPtz", - std::move(stop_policy), - &stop_request, - &stop_response, - [&](GrpcCommandTransaction& transaction) { - if (!transaction.beginDispatch()) { - return transaction.dispatchStatus(); - } - ++stop_dispatches; - stop_response.mutable_header()->set_success(true); - return grpc::Status::OK; - }); - EXPECT_TRUE(stop_status.ok()); - EXPECT_TRUE(stop_response.header().success()); - EXPECT_EQ(stop_dispatches, 1); - EXPECT_EQ(endpoint->hardware_checks.load(), 1); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/grpc_dexhand_service_test.cpp b/cmvr-es/service/grpc/server/tests/grpc_dexhand_service_test.cpp deleted file mode 100644 index 6638b27e..00000000 --- a/cmvr-es/service/grpc/server/tests/grpc_dexhand_service_test.cpp +++ /dev/null @@ -1,351 +0,0 @@ -#include "service/grpc/server/include/grpc_dexhand_service.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -#include "cmvr/config/device_manager_config/device_manager_config.pb.h" -#include "manager/control_authority_manager/include/control_authority_manager.h" -#include "manager/device_manager/include/device_manager.h" -#include "service/grpc/server/include/media_activity_coordinator.h" -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" - -namespace cmvr::service { -namespace { - -using namespace std::chrono_literals; - -class FakeDexHand final : public device::AbstractDexHand { -public: - FakeDexHand() { - id_ = "test-dexhand"; - sensor_points_[0] = TactilePoint::fromFz(42); - } - - std::string typeName() const override { return "FakeDexHand"; } - Status state() const override { return Status::STREAMING; } - std::string lastError() const override { return {}; } - - bool stopOperationalActivity() override { - ++stop_operational_calls; - return true; - } - - bool resumeOperationalActivity() override { - ++resume_operational_calls; - return true; - } - - void setAngles(const std::vector&) override { - ++set_angle_calls; - std::unique_lock lock(command_mutex_); - command_entered_ = true; - command_cv_.notify_all(); - command_cv_.wait(lock, [this] { return !block_angle_command_; }); - } - - void setPositions(const std::vector&) override { - ++set_position_calls; - } - - void setVelocities(const std::vector&) override { - ++set_speed_calls; - } - - void setForce(const std::vector&) override { - ++set_force_calls; - } - - void setPresetAct(int) override { - ++set_preset_calls; - } - - void setTactilePollingRegions( - const std::vector&) override { - ++configure_sensor_calls; - } - - std::vector getSensorData() override { - ++sensor_read_calls; - return {sensorRegion()}; - } - - TactileRegionData getSensorData( - FingerType finger, TactileRegion region) override { - return finger == FingerType::INDEX && region == TactileRegion::TIP - ? sensorRegion() - : TactileRegionData{}; - } - - ResultantForce getResultantForce( - FingerType finger, TactileRegion region) override { - return finger == FingerType::INDEX && region == TactileRegion::TIP - ? sensor_points_[0] - : ResultantForce{}; - } - - void blockAngleCommand() { - std::lock_guard lock(command_mutex_); - block_angle_command_ = true; - command_entered_ = false; - } - - bool waitForAngleCommand(const std::chrono::milliseconds timeout) { - std::unique_lock lock(command_mutex_); - return command_cv_.wait_for( - lock, timeout, [this] { return command_entered_; }); - } - - void releaseAngleCommand() { - { - std::lock_guard lock(command_mutex_); - block_angle_command_ = false; - } - command_cv_.notify_all(); - } - - std::atomic set_position_calls{0}; - std::atomic set_angle_calls{0}; - std::atomic set_force_calls{0}; - std::atomic set_speed_calls{0}; - std::atomic set_preset_calls{0}; - std::atomic configure_sensor_calls{0}; - std::atomic sensor_read_calls{0}; - std::atomic stop_operational_calls{0}; - std::atomic resume_operational_calls{0}; - -private: - TactileRegionData sensorRegion() { - return TactileRegionData( - FingerType::INDEX, - TactileRegion::TIP, - TactileMatrixView{sensor_points_.data(), 1, 1}, - "fake-tactile"); - } - - std::array sensor_points_{}; - std::mutex command_mutex_; - std::condition_variable command_cv_; - bool block_angle_command_{false}; - bool command_entered_{false}; -}; - -class GrpcDexHandServiceTest : public ::testing::Test { -protected: - void SetUp() override { - device::DeviceManager::destroyInstance(); - control::ControlAuthorityManager::instance().clear(); - globalStopAllAdmissionGate().clearForTesting(); - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - hand_ = std::make_shared(); - manager.registerDevice(hand_); - service_ = std::make_unique(); - } - - void TearDown() override { - hand_->releaseAngleCommand(); - if (server_) { - server_->Shutdown(); - server_->Wait(); - } - stub_.reset(); - service_.reset(); - hand_.reset(); - if (!socket_path_.empty()) { - std::remove(socket_path_.c_str()); - } - device::DeviceManager::destroyInstance(); - control::ControlAuthorityManager::instance().clear(); - globalStopAllAdmissionGate().clearForTesting(); - } - - bool startGrpcServer() { - socket_path_ = - "/tmp/cmvr_dexhand_service_test_" + - std::to_string(static_cast(::getpid())) + ".sock"; - std::remove(socket_path_.c_str()); - const std::string address = "unix:" + socket_path_; - grpc::ServerBuilder builder; - builder.AddListeningPort( - address, - grpc::InsecureServerCredentials()); - builder.RegisterService(service_.get()); - server_ = builder.BuildAndStart(); - if (!server_) { - return false; - } - stub_ = api::DexHandService::NewStub(grpc::CreateChannel( - address, - grpc::InsecureChannelCredentials())); - return stub_ != nullptr; - } - - static api::GetSensorDataStreamCommand_Request sensorStreamRequest() { - api::GetSensorDataStreamCommand_Request request; - request.mutable_header()->set_device_id("test-dexhand"); - return request; - } - - std::shared_ptr hand_; - std::unique_ptr service_; - std::unique_ptr server_; - std::unique_ptr stub_; - std::string socket_path_; -}; - -TEST_F(GrpcDexHandServiceTest, StopAllGateRejectsEveryControlCommand) { - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - ASSERT_TRUE(ticket.valid()); - - grpc::ServerContext position_context; - api::SetDexHandPositionsCommand_Request position_request; - api::SetDexHandPositionsCommand_Feedback position_response; - position_request.mutable_header()->set_device_id("test-dexhand"); - EXPECT_TRUE(service_->SetDexHandPos( - &position_context, &position_request, &position_response).ok()); - EXPECT_FALSE(position_response.header().success()); - - grpc::ServerContext angle_context; - api::SetDexHandAnglesCommand_Request angle_request; - api::SetDexHandAnglesCommand_Feedback angle_response; - angle_request.mutable_header()->set_device_id("test-dexhand"); - EXPECT_TRUE(service_->SetDexHandAngle( - &angle_context, &angle_request, &angle_response).ok()); - EXPECT_FALSE(angle_response.header().success()); - - grpc::ServerContext force_context; - api::SetDexHandForceCommand_Request force_request; - api::SetDexHandForceCommand_Feedback force_response; - force_request.mutable_header()->set_device_id("test-dexhand"); - EXPECT_TRUE(service_->SetDexHandForce( - &force_context, &force_request, &force_response).ok()); - EXPECT_FALSE(force_response.header().success()); - - grpc::ServerContext speed_context; - api::SetDexHandSpeedCommand_Request speed_request; - api::SetDexHandSpeedCommand_Feedback speed_response; - speed_request.mutable_header()->set_device_id("test-dexhand"); - EXPECT_TRUE(service_->SetDexHandSpeed( - &speed_context, &speed_request, &speed_response).ok()); - EXPECT_FALSE(speed_response.header().success()); - - grpc::ServerContext preset_context; - api::SetDexHandPresetActCommand_Request preset_request; - api::SetDexHandPresetActCommand_Feedback preset_response; - preset_request.mutable_header()->set_device_id("test-dexhand"); - EXPECT_TRUE(service_->SetDexHandPresetAct( - &preset_context, &preset_request, &preset_response).ok()); - EXPECT_FALSE(preset_response.header().success()); - - EXPECT_EQ(hand_->set_position_calls.load(), 0); - EXPECT_EQ(hand_->set_angle_calls.load(), 0); - EXPECT_EQ(hand_->set_force_calls.load(), 0); - EXPECT_EQ(hand_->set_speed_calls.load(), 0); - EXPECT_EQ(hand_->set_preset_calls.load(), 0); - EXPECT_EQ(hand_->resume_operational_calls.load(), 0); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); -} - -TEST_F(GrpcDexHandServiceTest, - SafetyPreemptionCannotPassAnExecutingDeviceDispatch) { - hand_->blockAngleCommand(); - grpc::ServerContext context; - api::SetDexHandAnglesCommand_Request request; - api::SetDexHandAnglesCommand_Feedback response; - request.mutable_header()->set_device_id("test-dexhand"); - request.add_values()->set_value(0.5F); - - auto rpc = std::async(std::launch::async, [&] { - return service_->SetDexHandAngle(&context, &request, &response); - }); - ASSERT_TRUE(hand_->waitForAngleCommand(1s)); - - auto& authority = control::ControlAuthorityManager::instance(); - auto safety_result = authority.preemptAcquire( - "test-dexhand", - "test-stop-all", - std::chrono::duration_cast< - control::ControlAuthorityManager::Duration>(1h)); - ASSERT_TRUE(safety_result.acquired); - const auto safety_token = safety_result.token; - auto dispatch_fence = std::async(std::launch::async, - [&authority, safety_token] { - return authority.waitForPreemptedRelease(safety_token, 1s); - }); - EXPECT_EQ( - dispatch_fence.wait_for(50ms), std::future_status::timeout); - - hand_->releaseAngleCommand(); - ASSERT_EQ(rpc.wait_for(1s), std::future_status::ready); - EXPECT_TRUE(rpc.get().ok()); - EXPECT_TRUE(response.header().success()); - ASSERT_EQ(dispatch_fence.wait_for(1s), std::future_status::ready); - EXPECT_TRUE(dispatch_fence.get()); - authority.release(safety_token); -} - -TEST_F(GrpcDexHandServiceTest, - StopAllCancelsOldSensorStreamAndARecoveredStreamResumesActivity) { - ASSERT_TRUE(startGrpcServer()); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 3s); - auto stream = stub_->GetSensorDataStream(&context); - ASSERT_TRUE(stream->Write(sensorStreamRequest())); - - api::GetSensorDataStreamCommand_Feedback feedback; - ASSERT_TRUE(stream->Read(&feedback)); - ASSERT_TRUE(feedback.header().success()); - ASSERT_GE(hand_->sensor_read_calls.load(), 1); - - const auto admission_ticket = globalStopAllAdmissionGate().beginStopAll(); - const auto media_ticket = globalMediaActivityCoordinator().beginStopAll(); - ASSERT_TRUE(admission_ticket.valid()); - ASSERT_TRUE(media_ticket.valid()); - - stream->WritesDone(); - while (stream->Read(&feedback)) { - } - const auto status = stream->Finish(); - EXPECT_TRUE( - status.ok() || status.error_code() == grpc::StatusCode::CANCELLED); - EXPECT_TRUE(globalMediaActivityCoordinator().waitForStopped( - media_ticket, 1s)); - const int stopped_stream_reads = hand_->sensor_read_calls.load(); - std::this_thread::sleep_for(50ms); - EXPECT_EQ(hand_->sensor_read_calls.load(), stopped_stream_reads); - EXPECT_TRUE(globalMediaActivityCoordinator().finishStopAll( - media_ticket, true)); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll( - admission_ticket, true)); - - grpc::ClientContext resumed_context; - resumed_context.set_deadline(std::chrono::system_clock::now() + 3s); - auto resumed = stub_->GetSensorDataStream(&resumed_context); - ASSERT_TRUE(resumed->Write(sensorStreamRequest())); - ASSERT_TRUE(resumed->Read(&feedback)); - EXPECT_TRUE(feedback.header().success()); - EXPECT_GT(hand_->sensor_read_calls.load(), stopped_stream_reads); - EXPECT_GE(hand_->resume_operational_calls.load(), 2); - resumed_context.TryCancel(); - resumed->WritesDone(); - while (resumed->Read(&feedback)) { - } - (void)resumed->Finish(); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/grpc_error_logging_interceptor_test.cpp b/cmvr-es/service/grpc/server/tests/grpc_error_logging_interceptor_test.cpp deleted file mode 100644 index 2287e2d2..00000000 --- a/cmvr-es/service/grpc/server/tests/grpc_error_logging_interceptor_test.cpp +++ /dev/null @@ -1,864 +0,0 @@ -#include "service/grpc/server/include/grpc_error_logging_interceptor.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "cmvr/api/agv_service.grpc.pb.h" -#include "cmvr/api/camera_service.grpc.pb.h" -#include "cmvr/api/test_service.grpc.pb.h" -#include "common/base/logging/logger.h" - -namespace cmvr::service { -namespace { - -std::atomic g_socket_sequence{0}; - -void setRpcDeadline(grpc::ClientContext& context) -{ - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::seconds(3)); -} - -grpc::ByteBuffer byteBuffer(const std::string& payload) -{ - const grpc::Slice slice(payload); - return grpc::ByteBuffer(&slice, 1); -} - -std::string byteBufferString(const grpc::ByteBuffer& buffer) -{ - std::vector slices; - EXPECT_TRUE(buffer.Dump(&slices).ok()); - std::string payload; - for (const auto& slice : slices) { - payload.append( - reinterpret_cast(slice.begin()), slice.size()); - } - return payload; -} - -grpc::Status rawUnaryCall(const std::shared_ptr& channel, - const std::string& method, - const std::string& request_payload, - grpc::ByteBuffer& response) -{ - grpc::ClientContext context; - setRpcDeadline(context); - const auto request = byteBuffer(request_payload); - const grpc::internal::RpcMethod rpc_method( - method.c_str(), grpc::internal::RpcMethod::NORMAL_RPC); - return grpc::internal::BlockingUnaryCall( - channel.get(), rpc_method, &context, request, &response); -} - -class ErrorLoggingTestService final : public api::TestService::Service { -public: - grpc::Status Call(grpc::ServerContext* context, - const api::TestReqeust* request, - api::TestResponse* response) override - { - if (request->data() == "grpc-error") { - return grpc::Status( - grpc::StatusCode::INTERNAL, "transport sentinel"); - } - if (request->data() == "cancelled") { - return grpc::Status( - grpc::StatusCode::CANCELLED, "client closed stream"); - } - if (request->data() == "server-cancel") { - context->TryCancel(); - return grpc::Status::OK; - } - if (request->data() == "client-cancel") { - { - std::lock_guard lock(cancel_mutex_); - cancel_started_ = true; - } - cancel_started_condition_.notify_all(); - const auto timeout = - std::chrono::steady_clock::now() + std::chrono::seconds(3); - while (!context->IsCancelled() && - std::chrono::steady_clock::now() < timeout) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - return grpc::Status::OK; - } - response->set_data("ok"); - return grpc::Status::OK; - } - - bool waitForCancelableCall() - { - std::unique_lock lock(cancel_mutex_); - return cancel_started_condition_.wait_for( - lock, std::chrono::seconds(3), - [this] { return cancel_started_; }); - } - -private: - std::mutex cancel_mutex_; - std::condition_variable cancel_started_condition_; - bool cancel_started_{false}; -}; - -class ErrorLoggingAgvService final : public api::AgvService::Service { -public: - grpc::Status emergencyStop( - grpc::ServerContext*, - const api::CommandHeader_Request* request, - api::CommandHeader_Feedback* response) override - { - if (request->device_id() == "missing") { - response->set_success(false); - response->set_error_message("missing sentinel"); - return grpc::Status( - grpc::StatusCode::NOT_FOUND, "missing sentinel"); - } - response->set_success(false); - response->set_error_message("direct sentinel"); - return grpc::Status::OK; - } - - grpc::Status streamMap( - grpc::ServerContext*, - const api::AgvMapStreamCommand_Request* request, - grpc::ServerWriter* writer) override - { - const auto write_failure = [writer](const std::string& detail) { - api::AgvMapStreamCommand_Feedback response; - response.mutable_header()->set_success(false); - response.mutable_header()->set_error_message(detail); - return writer->Write(response); - }; - - if (request->resume_token() == "multiple") { - write_failure("first stream sentinel"); - write_failure("second stream sentinel"); - return grpc::Status::OK; - } - if (request->resume_token() == "hold") { - write_failure("immediate stream sentinel"); - std::unique_lock lock(stream_mutex_); - stream_released_.wait_for( - lock, std::chrono::seconds(3), - [this] { return release_stream_; }); - return grpc::Status::OK; - } - if (request->resume_token() == "different") { - write_failure("application stream sentinel"); - return grpc::Status( - grpc::StatusCode::INTERNAL, "status stream sentinel"); - } - if (request->resume_token() == "long-different") { - const std::string common_prefix(1100, 'x'); - write_failure(common_prefix + " application"); - return grpc::Status( - grpc::StatusCode::INTERNAL, - common_prefix + " status"); - } - - write_failure("stream sentinel"); - return grpc::Status( - grpc::StatusCode::INTERNAL, "stream sentinel"); - } - - void releaseHeldStream() - { - { - std::lock_guard lock(stream_mutex_); - release_stream_ = true; - } - stream_released_.notify_all(); - } - -private: - std::mutex stream_mutex_; - std::condition_variable stream_released_; - bool release_stream_{false}; -}; - -class ErrorLoggingCameraService final : public api::CameraService::Service { -public: - grpc::Status StartCamera( - grpc::ServerContext*, - const api::StartCameraCommand_Request*, - api::StartCameraCommand_Feedback* response) override - { - response->mutable_header()->set_success(false); - response->mutable_header()->set_error_message("nested sentinel"); - return grpc::Status::OK; - } - - grpc::Status GetRGBImage( - grpc::ServerContext*, - const api::GetRGBImageCommand_Request*, - api::GetRGBImageCommand_Feedback* response) override - { - response->mutable_header()->set_success(true); - response->mutable_color_frame()->set_data( - std::string(2 * 1024 * 1024, 'x')); - return grpc::Status::OK; - } -}; - -class RawCameraService final - : public api::CameraService::WithRawCallbackMethod_StartCamera< - api::CameraService::Service> { -public: - explicit RawCameraService(std::string response) - : response_(std::move(response)) - { - } - - grpc::ServerUnaryReactor* StartCamera( - grpc::CallbackServerContext* context, - const grpc::ByteBuffer*, - grpc::ByteBuffer* response) override - { - *response = byteBuffer(response_); - auto* reactor = context->DefaultReactor(); - reactor->Finish(grpc::Status::OK); - return reactor; - } - -private: - std::string response_; -}; - -struct RawCallResult { - grpc::Status status; - std::vector records; - std::string response; -}; - -class ScopedServer final { -public: - ScopedServer(std::unique_ptr server, - std::string socket_path = {}) - : server_(std::move(server)), socket_path_(std::move(socket_path)) - { - } - - ~ScopedServer() - { - if (server_) { - server_->Shutdown(); - server_->Wait(); - } - if (!socket_path_.empty()) { - std::remove(socket_path_.c_str()); - } - } - - grpc::Server* get() const { return server_.get(); } - -private: - std::unique_ptr server_; - std::string socket_path_; -}; - -class ScopedSocket final { -public: - explicit ScopedSocket(std::string path) : path_(std::move(path)) - { - std::remove(path_.c_str()); - } - - ~ScopedSocket() { std::remove(path_.c_str()); } - -private: - std::string path_; -}; - -RawCallResult callRawStartCamera(const std::string& response_payload) -{ - std::mutex records_mutex; - std::vector records; - RawCameraService service(response_payload); - grpc::ServerBuilder builder; - const std::string address = - "unix:/tmp/cmvr_grpc_error_logging_raw_" + - std::to_string(static_cast(::getpid())) + "_" + - std::to_string(g_socket_sequence.fetch_add(1U)) + ".sock"; - const std::string socket_path = address.substr(5); - ScopedSocket socket(socket_path); - builder.AddListeningPort(address, grpc::InsecureServerCredentials()); - builder.RegisterService(&service); - std::vector> factories; - factories.emplace_back(makeGrpcErrorLoggingInterceptorFactory( - [&records, &records_mutex](const GrpcFailureRecord& record) { - std::lock_guard lock(records_mutex); - records.push_back(record); - })); - builder.experimental().SetInterceptorCreators(std::move(factories)); - ScopedServer server(builder.BuildAndStart()); - EXPECT_NE(server.get(), nullptr); - if (server.get() == nullptr) { - return {}; - } - - const auto channel = grpc::CreateChannel( - address, grpc::InsecureChannelCredentials()); - api::StartCameraCommand_Request request; - grpc::ByteBuffer response; - const auto status = rawUnaryCall( - channel, "/cmvr.api.CameraService/StartCamera", - request.SerializeAsString(), response); - std::lock_guard lock(records_mutex); - return {status, records, byteBufferString(response)}; -} - -class GrpcErrorLoggingInterceptorTest : public testing::Test { -protected: - void SetUp() override - { - grpc::ServerBuilder builder; - socket_path_ = - "/tmp/cmvr_grpc_error_logging_interceptor_test_" + - std::to_string(static_cast(::getpid())) + "_" + - std::to_string(g_socket_sequence.fetch_add(1U)) + ".sock"; - std::remove(socket_path_.c_str()); - const std::string address = "unix:" + socket_path_; - builder.AddListeningPort( - address, grpc::InsecureServerCredentials()); - builder.RegisterService(&test_service_); - builder.RegisterService(&agv_service_); - builder.RegisterService(&camera_service_); - - std::vector> factories; - factories.emplace_back(makeGrpcErrorLoggingInterceptorFactory( - [this](const GrpcFailureRecord& record) { - { - std::lock_guard lock(records_mutex_); - records_.push_back(record); - } - records_changed_.notify_all(); - })); - builder.experimental().SetInterceptorCreators(std::move(factories)); - server_ = builder.BuildAndStart(); - ASSERT_NE(server_, nullptr); - - const auto channel = grpc::CreateChannel( - address, - grpc::InsecureChannelCredentials()); - test_stub_ = api::TestService::NewStub(channel); - agv_stub_ = api::AgvService::NewStub(channel); - camera_stub_ = api::CameraService::NewStub(channel); - } - - void TearDown() override - { - if (server_) { - server_->Shutdown(); - server_->Wait(); - } - test_stub_.reset(); - agv_stub_.reset(); - camera_stub_.reset(); - if (!socket_path_.empty()) { - std::remove(socket_path_.c_str()); - } - } - - std::vector records() - { - std::lock_guard lock(records_mutex_); - return records_; - } - - std::vector waitForRecords( - const std::size_t count, - const std::chrono::milliseconds timeout = std::chrono::seconds(3)) - { - std::unique_lock lock(records_mutex_); - records_changed_.wait_for( - lock, timeout, [this, count] { return records_.size() >= count; }); - return records_; - } - - ErrorLoggingTestService test_service_; - ErrorLoggingAgvService agv_service_; - ErrorLoggingCameraService camera_service_; - std::unique_ptr server_; - std::unique_ptr test_stub_; - std::unique_ptr agv_stub_; - std::unique_ptr camera_stub_; - std::string socket_path_; - std::mutex records_mutex_; - std::condition_variable records_changed_; - std::vector records_; -}; - -TEST_F(GrpcErrorLoggingInterceptorTest, RecordsNonOkGrpcStatus) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::TestReqeust request; - api::TestResponse response; - request.set_data("grpc-error"); - - const grpc::Status status = test_stub_->Call(&context, request, &response); - ASSERT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - - const auto captured = waitForRecords(1U); - ASSERT_EQ(captured.size(), 1U); - EXPECT_EQ(captured.front().kind, GrpcFailureKind::GRPC_STATUS); - EXPECT_EQ(captured.front().method, "/cmvr.api.TestService/Call"); - EXPECT_EQ(captured.front().status_code, grpc::StatusCode::INTERNAL); - EXPECT_EQ(captured.front().severity, GrpcFailureSeverity::ERROR); - EXPECT_EQ(captured.front().detail, "transport sentinel"); -} - -TEST_F(GrpcErrorLoggingInterceptorTest, RecordsDirectFeedbackFailure) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::CommandHeader_Request request; - api::CommandHeader_Feedback response; - - ASSERT_TRUE(agv_stub_->emergencyStop(&context, request, &response).ok()); - ASSERT_FALSE(response.success()); - - const auto captured = waitForRecords(1U); - ASSERT_EQ(captured.size(), 1U); - EXPECT_EQ(captured.front().kind, GrpcFailureKind::APPLICATION); - EXPECT_EQ(captured.front().method, "/cmvr.api.AgvService/emergencyStop"); - EXPECT_EQ(captured.front().status_code, grpc::StatusCode::OK); - EXPECT_EQ(captured.front().severity, GrpcFailureSeverity::ERROR); - EXPECT_EQ(captured.front().detail, "direct sentinel"); -} - -TEST_F(GrpcErrorLoggingInterceptorTest, RecordsCancellationAsWarning) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::TestReqeust request; - api::TestResponse response; - request.set_data("cancelled"); - - const grpc::Status status = test_stub_->Call(&context, request, &response); - ASSERT_EQ(status.error_code(), grpc::StatusCode::CANCELLED); - - const auto captured = waitForRecords(1U); - ASSERT_EQ(captured.size(), 1U); - EXPECT_EQ(captured.front().kind, GrpcFailureKind::GRPC_STATUS); - EXPECT_EQ(captured.front().severity, GrpcFailureSeverity::WARNING); - EXPECT_EQ(captured.front().detail, "client closed stream"); -} - -TEST(GrpcErrorLoggingInterceptorFileTest, WarningStatusIsFlushedToFile) -{ - std::array directory_pattern{}; - const std::string pattern = "/tmp/cmvr-grpc-log-test-XXXXXX"; - std::copy(pattern.begin(), pattern.end(), directory_pattern.begin()); - const char* created = ::mkdtemp(directory_pattern.data()); - ASSERT_NE(created, nullptr); - const std::filesystem::path directory(created); - - struct Cleanup { - ~Cleanup() - { - logging::shutdownLogging(); - if (!socket_path.empty()) { - std::remove(socket_path.c_str()); - } - std::error_code error; - std::filesystem::remove_all(directory, error); - } - - std::filesystem::path directory; - std::string socket_path; - } cleanup{directory, {}}; - - config::LoggerConfig config; - config.set_minimum_level(config::LOG_LEVEL_WARNING); - config.set_directory(directory.string()); - config.set_flush_interval_seconds(3600); - auto* warning_route = config.add_routes(); - warning_route->set_level(config::LOG_LEVEL_WARNING); - warning_route->set_file(true); - ASSERT_TRUE(logging::initLogging(config, "grpc_log_test", directory)); - - ErrorLoggingTestService service; - grpc::ServerBuilder builder; - const std::string socket_path = - "/tmp/cmvr_grpc_error_logging_file_test_" + - std::to_string(static_cast(::getpid())) + "_" + - std::to_string(g_socket_sequence.fetch_add(1U)) + ".sock"; - cleanup.socket_path = socket_path; - ScopedSocket socket(socket_path); - const std::string address = "unix:" + socket_path; - builder.AddListeningPort(address, grpc::InsecureServerCredentials()); - builder.RegisterService(&service); - std::vector> factories; - factories.emplace_back(makeGrpcErrorLoggingInterceptorFactory()); - builder.experimental().SetInterceptorCreators(std::move(factories)); - ScopedServer server(builder.BuildAndStart()); - ASSERT_NE(server.get(), nullptr); - - const auto channel = grpc::CreateChannel( - address, grpc::InsecureChannelCredentials()); - auto stub = api::TestService::NewStub(channel); - grpc::ClientContext context; - setRpcDeadline(context); - api::TestReqeust request; - api::TestResponse response; - request.set_data("cancelled"); - const grpc::Status status = stub->Call(&context, request, &response); - ASSERT_EQ(status.error_code(), grpc::StatusCode::CANCELLED); - - std::ifstream input(directory / "grpc_log_test.log"); - const std::string contents{ - std::istreambuf_iterator(input), - std::istreambuf_iterator()}; - EXPECT_NE(contents.find("/cmvr.api.TestService/Call"), std::string::npos); - EXPECT_NE(contents.find("code=1(CANCELLED)"), std::string::npos); - EXPECT_NE(contents.find("client closed stream"), std::string::npos); - -} - -TEST_F(GrpcErrorLoggingInterceptorTest, RecordsServerCancellationReturnedAsOk) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::TestReqeust request; - api::TestResponse response; - request.set_data("server-cancel"); - - const grpc::Status status = test_stub_->Call(&context, request, &response); - ASSERT_EQ(status.error_code(), grpc::StatusCode::CANCELLED); - - // TryCancel is best effort: the final status may be intercepted before - // the cancellation hook. Either way, the interceptor must not recurse or - // emit duplicate records. - const auto captured = waitForRecords(1U, std::chrono::milliseconds(50)); - ASSERT_LE(captured.size(), 1U); - if (!captured.empty()) { - EXPECT_EQ(captured.front().kind, GrpcFailureKind::GRPC_STATUS); - EXPECT_EQ(captured.front().status_code, grpc::StatusCode::CANCELLED); - EXPECT_EQ(captured.front().severity, GrpcFailureSeverity::WARNING); - EXPECT_EQ( - captured.front().detail, - "RPC cancellation was requested by the edge server before completion"); - } -} - -TEST_F(GrpcErrorLoggingInterceptorTest, RecordsClientCancellation) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::TestReqeust request; - api::TestResponse response; - request.set_data("client-cancel"); - - grpc::Status status; - std::thread call([&] { - status = test_stub_->Call(&context, request, &response); - }); - const bool call_started = test_service_.waitForCancelableCall(); - context.TryCancel(); - call.join(); - - ASSERT_TRUE(call_started); - ASSERT_EQ(status.error_code(), grpc::StatusCode::CANCELLED); - const auto captured = waitForRecords(1U); - ASSERT_EQ(captured.size(), 1U); - EXPECT_EQ(captured.front().kind, GrpcFailureKind::GRPC_STATUS); - EXPECT_EQ(captured.front().status_code, grpc::StatusCode::CANCELLED); - EXPECT_EQ(captured.front().severity, GrpcFailureSeverity::WARNING); - EXPECT_EQ( - captured.front().detail, - "RPC was cancelled by the client or transport before completion"); -} - -TEST_F(GrpcErrorLoggingInterceptorTest, - RecordsStatusWhenNonOkSuppressesUnaryResponse) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::CommandHeader_Request request; - api::CommandHeader_Feedback response; - request.set_device_id("missing"); - - const grpc::Status status = - agv_stub_->emergencyStop(&context, request, &response); - ASSERT_EQ(status.error_code(), grpc::StatusCode::NOT_FOUND); - - const auto captured = waitForRecords(1U); - ASSERT_EQ(captured.size(), 1U); - EXPECT_EQ(captured.front().kind, GrpcFailureKind::GRPC_STATUS); - EXPECT_EQ(captured.front().status_code, grpc::StatusCode::NOT_FOUND); - EXPECT_EQ(captured.front().severity, GrpcFailureSeverity::WARNING); - EXPECT_EQ(captured.front().detail, "missing sentinel"); -} - -TEST_F(GrpcErrorLoggingInterceptorTest, RecordsNestedFeedbackFailure) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::StartCameraCommand_Request request; - api::StartCameraCommand_Feedback response; - - ASSERT_TRUE(camera_stub_->StartCamera(&context, request, &response).ok()); - ASSERT_FALSE(response.header().success()); - - const auto captured = waitForRecords(1U); - ASSERT_EQ(captured.size(), 1U); - EXPECT_EQ(captured.front().kind, GrpcFailureKind::APPLICATION); - EXPECT_EQ(captured.front().method, "/cmvr.api.CameraService/StartCamera"); - EXPECT_EQ(captured.front().detail, "nested sentinel"); -} - -TEST_F(GrpcErrorLoggingInterceptorTest, - RecordsStreamingResponseAndFinalNonOkStatus) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::AgvMapStreamCommand_Request request; - auto reader = agv_stub_->streamMap(&context, request); - api::AgvMapStreamCommand_Feedback response; - - ASSERT_TRUE(reader->Read(&response)); - ASSERT_FALSE(response.header().success()); - const grpc::Status status = reader->Finish(); - ASSERT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - - const auto captured = waitForRecords(2U); - ASSERT_EQ(captured.size(), 2U); - EXPECT_EQ(captured[0].kind, GrpcFailureKind::APPLICATION); - EXPECT_EQ(captured[0].method, "/cmvr.api.AgvService/streamMap"); - EXPECT_EQ(captured[0].status_code, grpc::StatusCode::OK); - EXPECT_EQ(captured[0].severity, GrpcFailureSeverity::ERROR); - EXPECT_EQ(captured[0].detail, "stream sentinel"); - EXPECT_EQ(captured[1].kind, GrpcFailureKind::GRPC_STATUS); - EXPECT_EQ(captured[1].status_code, grpc::StatusCode::INTERNAL); - EXPECT_EQ(captured[1].severity, GrpcFailureSeverity::ERROR); - EXPECT_EQ(captured[1].detail, "stream sentinel"); -} - -TEST_F(GrpcErrorLoggingInterceptorTest, - RecordsStreamingFailureBeforeTheStreamFinishes) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::AgvMapStreamCommand_Request request; - request.set_resume_token("hold"); - auto reader = agv_stub_->streamMap(&context, request); - api::AgvMapStreamCommand_Feedback response; - - const bool read = reader->Read(&response); - const auto captured_before_finish = waitForRecords(1U); - agv_service_.releaseHeldStream(); - const grpc::Status status = reader->Finish(); - - ASSERT_TRUE(read); - ASSERT_TRUE(status.ok()); - ASSERT_EQ(captured_before_finish.size(), 1U); - EXPECT_EQ( - captured_before_finish.front().detail, - "immediate stream sentinel"); -} - -TEST_F(GrpcErrorLoggingInterceptorTest, - RecordsEveryStreamingFailureResponse) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::AgvMapStreamCommand_Request request; - request.set_resume_token("multiple"); - auto reader = agv_stub_->streamMap(&context, request); - api::AgvMapStreamCommand_Feedback response; - - ASSERT_TRUE(reader->Read(&response)); - ASSERT_TRUE(reader->Read(&response)); - ASSERT_TRUE(reader->Finish().ok()); - - const auto captured = waitForRecords(2U); - ASSERT_EQ(captured.size(), 2U); - EXPECT_EQ(captured[0].detail, "first stream sentinel"); - EXPECT_EQ(captured[1].detail, "second stream sentinel"); -} - -TEST_F(GrpcErrorLoggingInterceptorTest, - PreservesDifferentResponseAndStatusErrors) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::AgvMapStreamCommand_Request request; - request.set_resume_token("different"); - auto reader = agv_stub_->streamMap(&context, request); - api::AgvMapStreamCommand_Feedback response; - - ASSERT_TRUE(reader->Read(&response)); - const grpc::Status status = reader->Finish(); - ASSERT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - - const auto captured = waitForRecords(2U); - ASSERT_EQ(captured.size(), 2U); - EXPECT_EQ(captured[0].kind, GrpcFailureKind::APPLICATION); - EXPECT_EQ(captured[0].detail, "application stream sentinel"); - EXPECT_EQ(captured[1].kind, GrpcFailureKind::GRPC_STATUS); - EXPECT_EQ(captured[1].status_code, grpc::StatusCode::INTERNAL); - EXPECT_EQ(captured[1].detail, "status stream sentinel"); -} - -TEST_F(GrpcErrorLoggingInterceptorTest, - DoesNotDeduplicateLongErrorsByTruncatedPrefix) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::AgvMapStreamCommand_Request request; - request.set_resume_token("long-different"); - auto reader = agv_stub_->streamMap(&context, request); - api::AgvMapStreamCommand_Feedback response; - - ASSERT_TRUE(reader->Read(&response)); - const grpc::Status status = reader->Finish(); - ASSERT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - - const auto captured = waitForRecords(2U); - ASSERT_EQ(captured.size(), 2U); - EXPECT_EQ(captured[0].kind, GrpcFailureKind::APPLICATION); - EXPECT_EQ(captured[1].kind, GrpcFailureKind::GRPC_STATUS); -} - -TEST(GrpcErrorLoggingInterceptorWireTest, RequiresHeaderAsFirstField) -{ - api::CommandHeader_Feedback header; - header.set_success(false); - header.set_error_message("out-of-order sentinel"); - std::string payload; - payload.push_back(static_cast(0x12)); - payload.push_back(static_cast(0x01)); - payload.push_back('x'); - payload.push_back(static_cast(0x0a)); - payload.push_back(static_cast(header.ByteSizeLong())); - payload.append(header.SerializeAsString()); - - const auto result = callRawStartCamera(payload); - - ASSERT_TRUE(result.status.ok()); - ASSERT_EQ(result.response, payload); - ASSERT_EQ(result.records.size(), 1U); - EXPECT_EQ( - result.records.front().kind, - GrpcFailureKind::MALFORMED_RESPONSE); -} - -TEST(GrpcErrorLoggingInterceptorWireTest, DoesNotScanPayloadAfterHeader) -{ - api::CommandHeader_Feedback header; - header.set_success(false); - header.set_error_message("leading header sentinel"); - std::string payload; - payload.push_back(static_cast(0x0a)); - payload.push_back(static_cast(header.ByteSizeLong())); - payload.append(header.SerializeAsString()); - payload.push_back(static_cast(0x12)); - payload.push_back(static_cast(0xff)); - payload.append(2U * 1024U * 1024U, 'x'); - - const auto result = callRawStartCamera(payload); - - ASSERT_TRUE(result.status.ok()); - ASSERT_EQ(result.records.size(), 1U); - EXPECT_EQ(result.records.front().kind, GrpcFailureKind::APPLICATION); - EXPECT_EQ(result.records.front().detail, "leading header sentinel"); -} - -TEST(GrpcErrorLoggingInterceptorWireTest, TreatsExplicitEmptyHeaderAsFailure) -{ - const std::string payload{ - static_cast(0x0a), static_cast(0x00)}; - - const auto result = callRawStartCamera(payload); - - ASSERT_TRUE(result.status.ok()); - ASSERT_EQ(result.records.size(), 1U); - EXPECT_EQ(result.records.front().kind, GrpcFailureKind::APPLICATION); - EXPECT_EQ( - result.records.front().detail, - "operation failed without an error message"); -} - -TEST(GrpcErrorLoggingInterceptorWireTest, RejectsInvalidHeaderWireType) -{ - const std::string payload{ - static_cast(0x08), static_cast(0x01)}; - - const auto result = callRawStartCamera(payload); - - ASSERT_TRUE(result.status.ok()); - ASSERT_EQ(result.records.size(), 1U); - EXPECT_EQ( - result.records.front().kind, - GrpcFailureKind::MALFORMED_RESPONSE); -} - -TEST(GrpcErrorLoggingInterceptorWireTest, RejectsInvalidUtf8ErrorMessage) -{ - const std::string payload{ - static_cast(0x0a), static_cast(0x04), - static_cast(0x12), static_cast(0x02), - static_cast(0xc3), static_cast(0x28)}; - - const auto result = callRawStartCamera(payload); - - ASSERT_TRUE(result.status.ok()); - ASSERT_EQ(result.records.size(), 1U); - EXPECT_EQ( - result.records.front().kind, - GrpcFailureKind::MALFORMED_RESPONSE); -} - -TEST_F(GrpcErrorLoggingInterceptorTest, DoesNotRecordSuccessfulLargeResponse) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::GetRGBImageCommand_Request request; - api::GetRGBImageCommand_Feedback response; - - ASSERT_TRUE(camera_stub_->GetRGBImage(&context, request, &response).ok()); - ASSERT_TRUE(response.header().success()); - ASSERT_EQ(response.color_frame().data().size(), 2U * 1024U * 1024U); - EXPECT_TRUE(records().empty()); -} - -TEST_F(GrpcErrorLoggingInterceptorTest, IgnoresSuccessfulResponseWithoutHeader) -{ - grpc::ClientContext context; - setRpcDeadline(context); - api::TestReqeust request; - api::TestResponse response; - request.set_data("ok"); - - ASSERT_TRUE(test_stub_->Call(&context, request, &response).ok()); - EXPECT_EQ(response.data(), "ok"); - EXPECT_TRUE(records().empty()); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/grpc_head_service_test.cpp b/cmvr-es/service/grpc/server/tests/grpc_head_service_test.cpp deleted file mode 100644 index 0bef7581..00000000 --- a/cmvr-es/service/grpc/server/tests/grpc_head_service_test.cpp +++ /dev/null @@ -1,391 +0,0 @@ -#include "service/grpc/server/include/grpc_head_service.h" - -#include -#include -#include -#include -#include - -#include -#include - -#include "cmvr/config/device_manager_config/device_manager_config.pb.h" -#include "manager/device_manager/include/device_manager.h" -#include "service/grpc/server/include/media_activity_coordinator.h" -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" - -namespace cmvr::service { -namespace { - -using namespace std::chrono_literals; - -class FakeBiohead final : public device::AbstractBiohead { -public: - FakeBiohead() { id_ = "test-head"; } - - std::string typeName() const override { return "FakeBiohead"; } - bool stop() override - { - ++lifecycle_stop_calls; - return true; - } - - bool setExpressionPoseIfCurrent( - const OperationalToken token, - device::FacialExpressionState&, - double, - double) override - { - return recordIfCurrent(token, set_expression_calls); - } - - bool streamFacialPoseIfCurrent( - const OperationalToken token, - device::FacialExpressionState&, - double, - double) override - { - return recordIfCurrent(token, stream_expression_calls); - } - - bool speakStartIfCurrent(const OperationalToken token) override - { - return recordIfCurrent(token, speak_start_calls); - } - - bool expressionHappyIfCurrent(const OperationalToken token) override - { - return recordIfCurrent(token, happy_calls); - } - - bool expressionSurprisedIfCurrent(const OperationalToken token) override - { - return recordIfCurrent(token, surprise_calls); - } - - bool expressionTiredIfCurrent(const OperationalToken token) override - { - return recordIfCurrent(token, tired_calls); - } - - bool expressionAngryIfCurrent(const OperationalToken token) override - { - return recordIfCurrent(token, angry_calls); - } - - bool expressionSadnessIfCurrent(const OperationalToken token) override - { - return recordIfCurrent(token, sadness_calls); - } - - bool expressionYawnIfCurrent(const OperationalToken token) override - { - return recordIfCurrent(token, yawn_calls); - } - - void speakstop() override { ++speak_stop_calls; } - - bool stopOperationalActivity() override - { - invalidateOperationalActivities_(); - ++operational_stop_calls; - ++speak_stop_calls; - return stop_confirmed.load(std::memory_order_acquire); - } - - bool recordIfCurrent( - const OperationalToken token, - std::atomic& calls) - { - return runIfOperationalActivityCurrent_(token, [&] { ++calls; }); - } - - std::atomic set_expression_calls{0}; - std::atomic stream_expression_calls{0}; - std::atomic speak_start_calls{0}; - std::atomic speak_stop_calls{0}; - std::atomic happy_calls{0}; - std::atomic surprise_calls{0}; - std::atomic tired_calls{0}; - std::atomic angry_calls{0}; - std::atomic sadness_calls{0}; - std::atomic yawn_calls{0}; - std::atomic operational_stop_calls{0}; - std::atomic lifecycle_stop_calls{0}; - std::atomic stop_confirmed{true}; -}; - -class GrpcHeadServiceTest : public ::testing::Test { -protected: - void SetUp() override - { - device::DeviceManager::destroyInstance(); - globalStopAllAdmissionGate().clearForTesting(); - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - head_ = std::make_shared(); - manager.registerDevice(head_); - service_ = std::make_unique(); - } - - void TearDown() override - { - if (server_) { - server_->Shutdown(); - server_->Wait(); - } - stub_.reset(); - service_.reset(); - head_.reset(); - device::DeviceManager::destroyInstance(); - globalStopAllAdmissionGate().clearForTesting(); - } - - bool startGrpcServer() - { - int selected_port = 0; - grpc::ServerBuilder builder; - builder.AddListeningPort( - "127.0.0.1:0", - grpc::InsecureServerCredentials(), - &selected_port); - builder.RegisterService(service_.get()); - server_ = builder.BuildAndStart(); - if (!server_ || selected_port <= 0) { - return false; - } - const std::string address = - "127.0.0.1:" + std::to_string(selected_port); - stub_ = api::BioHeadService::NewStub(grpc::CreateChannel( - address, grpc::InsecureChannelCredentials())); - return stub_ != nullptr; - } - - static api::StreamFacialExpression_Request streamRequest() - { - api::StreamFacialExpression_Request request; - request.mutable_header()->set_device_id("test-head"); - request.mutable_expr()->mutable_jaw()->set_x(0.5F); - return request; - } - - std::shared_ptr head_; - std::unique_ptr service_; - std::unique_ptr server_; - std::unique_ptr stub_; -}; - -TEST_F(GrpcHeadServiceTest, - OperationalStopInvalidatesOldTokenWithoutStoppingLifecycle) -{ - const auto old_token = head_->beginOperationalActivity(); - ASSERT_TRUE(head_->recordIfCurrent(old_token, head_->happy_calls)); - - EXPECT_TRUE(head_->stopOperationalActivity()); - EXPECT_FALSE(head_->recordIfCurrent(old_token, head_->happy_calls)); - EXPECT_EQ(head_->happy_calls.load(), 1); - EXPECT_EQ(head_->operational_stop_calls.load(), 1); - EXPECT_EQ(head_->lifecycle_stop_calls.load(), 0); - - const auto current_token = head_->beginOperationalActivity(); - EXPECT_NE(current_token, old_token); - EXPECT_TRUE(head_->recordIfCurrent(current_token, head_->happy_calls)); - EXPECT_EQ(head_->happy_calls.load(), 2); -} - -TEST_F(GrpcHeadServiceTest, - StopAllGateRejectsMotionButAllowsOperationalStopRpcs) -{ - const auto ticket = globalStopAllAdmissionGate().beginStopAll(); - ASSERT_TRUE(ticket.valid()); - - api::Happy_Request happy_request; - happy_request.mutable_header()->set_device_id("test-head"); - api::Happy_Feedback happy_response; - grpc::ServerContext happy_context; - EXPECT_TRUE(service_->Happy( - &happy_context, &happy_request, &happy_response).ok()); - EXPECT_FALSE(happy_response.header().success()); - EXPECT_EQ(head_->happy_calls.load(), 0); - - api::Surprise_Request surprise_request; - surprise_request.mutable_header()->set_device_id("test-head"); - api::Surprise_Feedback surprise_response; - grpc::ServerContext surprise_context; - EXPECT_TRUE(service_->Surprise( - &surprise_context, &surprise_request, &surprise_response).ok()); - EXPECT_FALSE(surprise_response.header().success()); - EXPECT_EQ(head_->surprise_calls.load(), 0); - - api::ExpressionTired_Request tired_request; - tired_request.mutable_header()->set_device_id("test-head"); - api::ExpressionTired_Feedback tired_response; - grpc::ServerContext tired_context; - EXPECT_TRUE(service_->ExpressionTired( - &tired_context, &tired_request, &tired_response).ok()); - EXPECT_FALSE(tired_response.header().success()); - EXPECT_EQ(head_->tired_calls.load(), 0); - - api::ExpressionAngry_Request angry_request; - angry_request.mutable_header()->set_device_id("test-head"); - api::ExpressionAngry_Feedback angry_response; - grpc::ServerContext angry_context; - EXPECT_TRUE(service_->ExpressionAngry( - &angry_context, &angry_request, &angry_response).ok()); - EXPECT_FALSE(angry_response.header().success()); - EXPECT_EQ(head_->angry_calls.load(), 0); - - api::ExpressionSadness_Request sadness_request; - sadness_request.mutable_header()->set_device_id("test-head"); - api::ExpressionSadness_Feedback sadness_response; - grpc::ServerContext sadness_context; - EXPECT_TRUE(service_->ExpressionSadness( - &sadness_context, &sadness_request, &sadness_response).ok()); - EXPECT_FALSE(sadness_response.header().success()); - EXPECT_EQ(head_->sadness_calls.load(), 0); - - api::ExpressionYawn_Request yawn_request; - yawn_request.mutable_header()->set_device_id("test-head"); - api::ExpressionYawn_Feedback yawn_response; - grpc::ServerContext yawn_context; - EXPECT_TRUE(service_->ExpressionYawn( - &yawn_context, &yawn_request, &yawn_response).ok()); - EXPECT_FALSE(yawn_response.header().success()); - EXPECT_EQ(head_->yawn_calls.load(), 0); - - api::SetFacialExpression_Request expression_request; - expression_request.mutable_header()->set_device_id("test-head"); - api::SetFacialExpression_Feedback expression_response; - grpc::ServerContext expression_context; - EXPECT_TRUE(service_->SetExpression( - &expression_context, - &expression_request, - &expression_response).ok()); - EXPECT_FALSE(expression_response.header().success()); - EXPECT_EQ(head_->set_expression_calls.load(), 0); - - api::SpeakStart_Request speak_request; - speak_request.mutable_header()->set_device_id("test-head"); - api::SpeakStart_Feedback speak_response; - grpc::ServerContext speak_context; - EXPECT_TRUE(service_->SpeakStart( - &speak_context, &speak_request, &speak_response).ok()); - EXPECT_FALSE(speak_response.header().success()); - EXPECT_EQ(head_->speak_start_calls.load(), 0); - - api::SpeakStop_Request speak_stop_request; - speak_stop_request.mutable_header()->set_device_id("test-head"); - api::SpeakStop_Feedback speak_stop_response; - grpc::ServerContext speak_stop_context; - EXPECT_TRUE(service_->SpeakStop( - &speak_stop_context, - &speak_stop_request, - &speak_stop_response).ok()); - EXPECT_TRUE(speak_stop_response.header().success()); - - api::EmergencyStop_Request stop_request; - stop_request.mutable_header()->set_device_id("test-head"); - api::EmergencyStop_Feedback stop_response; - grpc::ServerContext stop_context; - EXPECT_TRUE(service_->EmergencyStop( - &stop_context, &stop_request, &stop_response).ok()); - EXPECT_TRUE(stop_response.header().success()); - EXPECT_EQ(head_->operational_stop_calls.load(), 1); - EXPECT_EQ(head_->lifecycle_stop_calls.load(), 0); - - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll(ticket, true)); -} - -TEST_F(GrpcHeadServiceTest, - StreamIsCancelledByStopAllAndNewStreamWorksAfterRecovery) -{ - ASSERT_TRUE(startGrpcServer()); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 2s); - auto stream = stub_->StreamExpression(&context); - - ASSERT_TRUE(stream->Write(streamRequest())); - api::StreamFacialExpression_Feedback feedback; - ASSERT_TRUE(stream->Read(&feedback)); - ASSERT_TRUE(feedback.header().success()); - ASSERT_EQ(head_->stream_expression_calls.load(), 1); - - const auto admission_ticket = globalStopAllAdmissionGate().beginStopAll(); - const auto media_ticket = globalMediaActivityCoordinator().beginStopAll(); - ASSERT_TRUE(admission_ticket.valid()); - ASSERT_TRUE(media_ticket.valid()); - - (void)stream->Write(streamRequest()); - stream->WritesDone(); - while (stream->Read(&feedback)) { - } - const auto status = stream->Finish(); - EXPECT_TRUE( - status.ok() || status.error_code() == grpc::StatusCode::CANCELLED); - EXPECT_TRUE(globalMediaActivityCoordinator().waitForStopped( - media_ticket, 1s)); - EXPECT_EQ(head_->stream_expression_calls.load(), 1); - EXPECT_TRUE(globalMediaActivityCoordinator().finishStopAll( - media_ticket, true)); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll( - admission_ticket, true)); - - grpc::ClientContext resumed_context; - resumed_context.set_deadline(std::chrono::system_clock::now() + 2s); - auto resumed = stub_->StreamExpression(&resumed_context); - ASSERT_TRUE(resumed->Write(streamRequest())); - ASSERT_TRUE(resumed->Read(&feedback)); - EXPECT_TRUE(feedback.header().success()); - EXPECT_EQ(head_->stream_expression_calls.load(), 2); - resumed_context.TryCancel(); - resumed->WritesDone(); - while (resumed->Read(&feedback)) { - } - (void)resumed->Finish(); -} - -TEST_F(GrpcHeadServiceTest, - StopAllCancelsStreamBeforeItsFirstFrameCanClearStopState) -{ - ASSERT_TRUE(startGrpcServer()); - grpc::ClientContext context; - context.set_deadline(std::chrono::system_clock::now() + 2s); - auto stream = stub_->StreamExpression(&context); - - std::this_thread::sleep_for(20ms); - const auto admission_ticket = globalStopAllAdmissionGate().beginStopAll(); - const auto media_ticket = globalMediaActivityCoordinator().beginStopAll(); - ASSERT_TRUE(admission_ticket.valid()); - ASSERT_TRUE(media_ticket.valid()); - - (void)stream->Write(streamRequest()); - stream->WritesDone(); - api::StreamFacialExpression_Feedback feedback; - while (stream->Read(&feedback)) { - } - (void)stream->Finish(); - EXPECT_TRUE(globalMediaActivityCoordinator().waitForStopped( - media_ticket, 1s)); - EXPECT_EQ(head_->stream_expression_calls.load(), 0); - EXPECT_TRUE(globalMediaActivityCoordinator().finishStopAll( - media_ticket, true)); - EXPECT_TRUE(globalStopAllAdmissionGate().finishStopAll( - admission_ticket, true)); -} - -TEST_F(GrpcHeadServiceTest, UnconfirmedOperationalStopIsReported) -{ - head_->stop_confirmed = false; - api::EmergencyStop_Request request; - request.mutable_header()->set_device_id("test-head"); - api::EmergencyStop_Feedback response; - grpc::ServerContext context; - - EXPECT_TRUE(service_->EmergencyStop(&context, &request, &response).ok()); - EXPECT_FALSE(response.header().success()); - EXPECT_EQ(head_->operational_stop_calls.load(), 1); - EXPECT_EQ(head_->lifecycle_stop_calls.load(), 0); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/grpc_motor_service_test.cpp b/cmvr-es/service/grpc/server/tests/grpc_motor_service_test.cpp deleted file mode 100644 index ea369cb8..00000000 --- a/cmvr-es/service/grpc/server/tests/grpc_motor_service_test.cpp +++ /dev/null @@ -1,1856 +0,0 @@ -#include "service/grpc/server/include/grpc_motor_service.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "cmvr/config/device_manager_config/device_manager_config.pb.h" -#include "cmvr/config/motor_config/motor_config.pb.h" -#include "devices/motor/manager/include/motor_manager.h" -#include "devices/motor/motor_protocol_interface.h" -#include "manager/device_manager/include/device_manager.h" -#include "service/grpc/server/include/motor_activity_coordinator.h" -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" - -namespace cmvr::service { - -class gRPCMotorServiceImplTestAccess { -public: - static void bestEffortQuickStop(gRPCMotorServiceImpl& service, - const api::MotorTarget& target, - const std::string& error) - { - service.bestEffortQuickStop(target, error); - } - - static std::unique_lock holdExceptionCleanupMutex( - gRPCMotorServiceImpl& service, - const api::MotorTarget& target) - { - gRPCMotorServiceImpl::ResolvedMotor resolved; - const auto status = service.resolveMotor(target, resolved); - if (!status.ok()) { - throw std::runtime_error(status.error_message()); - } - return std::unique_lock( - resolved.control->exception_cleanup_mutex); - } -}; - -namespace { - -class FakeMotorProtocol final : public device::MotorProtocolInterface { -public: - bool initNode(std::uint8_t) override { return true; } - void setMode(std::uint8_t, msgs::RunMode mode) override - { - if (throw_set_mode_.load()) { - throw std::runtime_error("injected setMode exception"); - } - mode_ = mode; - } - msgs::RunMode getMode(std::uint8_t) override { return mode_.load(); } - void setLimitQdd(std::uint8_t, double, double) override {} - void setLimitQd(std::uint8_t, double) override {} - void setLimitQ(std::uint8_t, double, double) override {} - bool calibrateZeroQ(std::uint8_t) override - { - calibrate_started_ = true; - if (calibrate_delay_ms_.load() > 0) { - std::this_thread::sleep_for( - std::chrono::milliseconds(calibrate_delay_ms_.load())); - } - position_ = 0.0; - calibrate_finished_ = true; - return calibrate_success_.load(); - } - bool reachedTargetQ(std::uint8_t) override { return reached_.load(); } - bool commandProfilePosition(std::uint8_t, double target_q, - double, double) override - { - command_started_ = true; - if (throw_profile_position_.load()) { - throw std::runtime_error("injected profile position exception"); - } - profile_command_order_ = ++operation_counter_; - if (profile_delay_ms_.load() > 0) { - std::this_thread::sleep_for( - std::chrono::milliseconds(profile_delay_ms_.load())); - } - if (!hold_position_.load()) { - position_ = target_q; - velocity_ = 0.0; - reached_ = true; - } - return profile_position_success_.load(); - } - bool commandProfileVelocity(std::uint8_t, double target_qd, - double) override - { - profile_velocity_started_ = true; - if (profile_velocity_delay_ms_.load() > 0) { - std::this_thread::sleep_for( - std::chrono::milliseconds(profile_velocity_delay_ms_.load())); - } - velocity_ = target_qd; - return profile_velocity_success_.load(); - } - bool commandCyclicPosition(std::uint8_t, double target_q, - double target_qd) override - { - cyclic_position_started_ = true; - if (cyclic_position_delay_ms_.load() > 0) { - std::this_thread::sleep_for( - std::chrono::milliseconds(cyclic_position_delay_ms_.load())); - } - if (throw_cyclic_position_.load()) { - throw std::runtime_error("injected cyclic position exception"); - } - position_ = target_q; - velocity_ = target_qd; - return true; - } - bool commandCyclicVelocity(std::uint8_t, double target_qd) override - { - velocity_ = target_qd; - return true; - } - bool commandCyclicTorque(std::uint8_t, double) override { return false; } - void setMotorConversion(std::uint8_t, double, double) override {} - bool torqueOn(std::uint8_t) override - { - torque_on_started_ = true; - torque_on_order_ = ++operation_counter_; - if (torque_on_delay_ms_.load() > 0) { - std::this_thread::sleep_for( - std::chrono::milliseconds(torque_on_delay_ms_.load())); - } - return torque_on_success_.load(); - } - bool torqueOff(std::uint8_t) override - { - ++torque_off_count_; - return torque_off_success_.load(); - } - bool brakeRelease(std::uint8_t) override { return true; } - bool quickStop(std::uint8_t) override - { - last_quick_stop_order_ = ++operation_counter_; - ++quick_stop_count_; - if (quick_stop_delay_ms_.load() > 0) { - std::this_thread::sleep_for( - std::chrono::milliseconds(quick_stop_delay_ms_.load())); - } - if (quick_stop_success_.load()) { - velocity_ = 0.0; - return true; - } - return false; - } - double getQ(std::uint8_t) override - { - get_q_started_ = true; - if (get_q_delay_ms_.load() > 0) { - std::this_thread::sleep_for( - std::chrono::milliseconds(get_q_delay_ms_.load())); - } - if (throw_get_q_.load()) { - throw std::runtime_error("injected getQ exception"); - } - if (nonfinite_get_q_.load()) { - return std::numeric_limits::quiet_NaN(); - } - return position_.load(); - } - double getQd(std::uint8_t) override - { - get_qd_started_ = true; - if (nonfinite_get_qd_.load()) { - return std::numeric_limits::quiet_NaN(); - } - return velocity_.load(); - } - - std::atomic hold_position_{false}; - std::atomic calibrate_started_{false}; - std::atomic calibrate_finished_{false}; - std::atomic calibrate_delay_ms_{0}; - std::atomic calibrate_success_{true}; - std::atomic command_started_{false}; - std::atomic quick_stop_count_{0}; - std::atomic quick_stop_success_{true}; - std::atomic quick_stop_delay_ms_{0}; - std::atomic throw_set_mode_{false}; - std::atomic throw_profile_position_{false}; - std::atomic throw_cyclic_position_{false}; - std::atomic throw_get_q_{false}; - std::atomic nonfinite_get_q_{false}; - std::atomic nonfinite_get_qd_{false}; - std::atomic get_qd_started_{false}; - std::atomic profile_position_success_{true}; - std::atomic profile_velocity_success_{true}; - std::atomic torque_on_success_{true}; - std::atomic torque_off_success_{true}; - std::atomic torque_off_count_{0}; - std::atomic profile_delay_ms_{0}; - std::atomic profile_velocity_delay_ms_{0}; - std::atomic profile_velocity_started_{false}; - std::atomic cyclic_position_delay_ms_{0}; - std::atomic cyclic_position_started_{false}; - std::atomic get_q_delay_ms_{0}; - std::atomic get_q_started_{false}; - std::atomic torque_on_delay_ms_{0}; - std::atomic torque_on_started_{false}; - std::atomic operation_counter_{0}; - std::atomic profile_command_order_{0}; - std::atomic torque_on_order_{0}; - std::atomic last_quick_stop_order_{0}; - -private: - std::atomic mode_{msgs::RUN_MODE_UNSPECIFIED}; - std::atomic position_{0.0}; - std::atomic velocity_{0.0}; - std::atomic reached_{false}; -}; - -class FakeMotor final : public device::AbstractMotor { -public: - explicit FakeMotor( - const std::uint8_t node_id, - std::string joint_name = "test_joint") - : AbstractMotor(node_id) - { - info_.id = node_id; - info_.joint_name = std::move(joint_name); - } - - std::string typeName() const override { return "FakeMotor"; } -}; - -class MotorServiceTest : public ::testing::Test { -protected: - void SetUp() override - { - globalStopAllAdmissionGate().clearForTesting(); - globalMotorActivityCoordinator().clearForTesting(); - config::DeviceManagerConfig device_config; - auto& device_manager = device::DeviceManager::getInstance(device_config); - - config::MotorConfig motor_config; - manager_ = std::make_shared( - "test-motor-manager", motor_config); - protocol_ = std::make_shared(); - motor_ = std::make_shared(1); - motor_->setProtocol(protocol_); - ASSERT_TRUE(manager_->addMotor(motor_)); - device_manager.registerDevice("test-motor-manager", manager_); - service_ = std::make_unique(); - } - - void TearDown() override - { - if (grpc_server_) { - grpc_server_->Shutdown(); - grpc_server_->Wait(); - grpc_server_.reset(); - } - stub_.reset(); - if (!grpc_socket_path_.empty()) { - std::remove(grpc_socket_path_.c_str()); - grpc_socket_path_.clear(); - } - service_.reset(); - manager_.reset(); - motor_.reset(); - protocol_.reset(); - device::DeviceManager::destroyInstance(); - globalMotorActivityCoordinator().clearForTesting(); - globalStopAllAdmissionGate().clearForTesting(); - } - - static api::MotorTarget makeTarget() - { - api::MotorTarget target; - target.mutable_header()->set_device_id("test-motor-manager"); - target.set_motor_id(1); - return target; - } - - bool startGrpcServer() - { - grpc_socket_path_ = - "/tmp/cmvr_motor_service_test_" + - std::to_string(static_cast(::getpid())) + ".sock"; - std::remove(grpc_socket_path_.c_str()); - const std::string server_address = "unix:" + grpc_socket_path_; - - grpc::ServerBuilder builder; - builder.AddListeningPort( - server_address, grpc::InsecureServerCredentials()); - builder.RegisterService(service_.get()); - grpc_server_ = builder.BuildAndStart(); - if (!grpc_server_) { - return false; - } - stub_ = api::MotorService::NewStub( - grpc::CreateChannel( - server_address, - grpc::InsecureChannelCredentials())); - return stub_ != nullptr; - } - - std::shared_ptr protocol_; - std::shared_ptr motor_; - std::shared_ptr manager_; - std::unique_ptr service_; - std::unique_ptr grpc_server_; - std::unique_ptr stub_; - std::string grpc_socket_path_; -}; - -TEST_F(MotorServiceTest, SetZeroBackendFailureReportsUnknownOutcome) -{ - protocol_->calibrate_success_ = false; - - api::SetMotorZeroRequest request; - *request.mutable_target() = makeTarget(); - grpc::ServerContext context; - api::MotorCommandResponse response; - const auto status = service_->setZero(&context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_FALSE(response.header().success()); - EXPECT_NE(response.header().error_message().find("outcome unknown"), - std::string::npos); - EXPECT_NE(response.header().error_message().find("device state"), - std::string::npos); - EXPECT_EQ(protocol_->quick_stop_count_.load(), 0); -} - -TEST_F(MotorServiceTest, RejectedSetZeroPreemptedInFlightReturnsAborted) -{ - protocol_->calibrate_success_ = false; - protocol_->calibrate_delay_ms_ = 100; - - api::SetMotorZeroRequest request; - *request.mutable_target() = makeTarget(); - grpc::ServerContext zero_context; - api::MotorCommandResponse zero_response; - grpc::Status zero_status; - std::thread zeroing([&]() { - zero_status = service_->setZero( - &zero_context, &request, &zero_response); - }); - const auto dispatch_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->calibrate_started_.load() && - std::chrono::steady_clock::now() < dispatch_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - ASSERT_TRUE(protocol_->calibrate_started_.load()); - - api::EmergencyStopRequest stop_request; - *stop_request.mutable_target() = makeTarget(); - grpc::ServerContext stop_context; - api::MotorCommandResponse stop_response; - const auto stop_status = service_->emergencyStop( - &stop_context, &stop_request, &stop_response); - - zeroing.join(); - ASSERT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_EQ(zero_status.error_code(), grpc::StatusCode::ABORTED); -} - -TEST_F(MotorServiceTest, SetZeroDeadlineDuringDispatchReportsDeadline) -{ - ASSERT_TRUE(startGrpcServer()); - protocol_->calibrate_success_ = false; - protocol_->calibrate_delay_ms_ = 100; - - api::SetMotorZeroRequest request; - *request.mutable_target() = makeTarget(); - grpc::ClientContext context; - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::milliseconds(50)); - api::MotorCommandResponse response; - const auto status = stub_->setZero(&context, request, &response); - EXPECT_EQ(status.error_code(), grpc::StatusCode::DEADLINE_EXCEEDED); - - const auto completion_deadline = - std::chrono::steady_clock::now() + std::chrono::milliseconds(300); - while (!protocol_->calibrate_finished_.load() && - std::chrono::steady_clock::now() < completion_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(2)); - } - EXPECT_TRUE(protocol_->calibrate_finished_.load()); - EXPECT_EQ(protocol_->quick_stop_count_.load(), 0); -} - -TEST_F(MotorServiceTest, ProfilePositionReturnsOnlyAfterTargetIsReached) -{ - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_position_rad(1.25); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(2.0); - request.mutable_wait()->set_settle_sample_count(1); - request.mutable_wait()->set_poll_period_ms(1); - - grpc::ServerContext context; - api::MotorCommandResponse response; - const auto status = service_->profilePosition(&context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()); - EXPECT_DOUBLE_EQ(response.status().position_rad(), 1.25); - EXPECT_FALSE(response.status().service_busy()); - EXPECT_EQ(response.status().active_control(), api::MOTOR_CONTROL_NONE); -} - -TEST_F(MotorServiceTest, DirectControlRejectsMotorClaimedByRobotArm) -{ - std::uint64_t claim_id = 0; - std::string claim_error; - ASSERT_TRUE(manager_->claimArmJoints( - "test_arm", {"test_joint"}, claim_id, &claim_error)) - << claim_error; - - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_position_rad(1.25); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(2.0); - grpc::ServerContext context; - api::MotorCommandResponse response; - - const auto status = service_->profilePosition( - &context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_FALSE(response.header().success()); - EXPECT_NE(status.error_message().find("test_arm"), std::string::npos); - EXPECT_NE(status.error_message().find("ArmService"), std::string::npos); - EXPECT_FALSE(protocol_->command_started_.load()); - EXPECT_EQ(protocol_->quick_stop_count_.load(), 0); -} - -TEST_F(MotorServiceTest, ClaimedArmMotorRemainsObservableWithoutStopRegistration) -{ - std::uint64_t claim_id = 0; - ASSERT_TRUE(manager_->claimArmJoints( - "test_arm", {"test_joint"}, claim_id)); - - api::GetMotorStatusRequest request; - *request.mutable_target() = makeTarget(); - grpc::ServerContext context; - api::GetMotorStatusResponse response; - const auto status = service_->getStatus(&context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()); - EXPECT_EQ(response.status().joint_name(), "test_joint"); - - auto& coordinator = globalMotorActivityCoordinator(); - const auto ticket = coordinator.beginStopAll(); - ASSERT_TRUE(ticket.valid()); - std::string stop_error; - EXPECT_TRUE(coordinator.requestStop(ticket, &stop_error)) << stop_error; - EXPECT_EQ(protocol_->quick_stop_count_.load(), 0); - EXPECT_TRUE(coordinator.waitForStopped( - ticket, std::chrono::milliseconds(50), &stop_error)) << stop_error; - EXPECT_TRUE(coordinator.finishStopAll(ticket, true)); -} - -TEST_F(MotorServiceTest, ReleasingArmClaimRestoresDirectMotorControl) -{ - std::uint64_t claim_id = 0; - ASSERT_TRUE(manager_->claimArmJoints( - "test_arm", {"test_joint"}, claim_id)); - manager_->releaseArmJoints(claim_id); - - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_position_rad(0.75); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(2.0); - request.mutable_wait()->set_settle_sample_count(1); - request.mutable_wait()->set_poll_period_ms(1); - grpc::ServerContext context; - api::MotorCommandResponse response; - - const auto status = service_->profilePosition( - &context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()); - EXPECT_DOUBLE_EQ(response.status().position_rad(), 0.75); -} - -TEST_F(MotorServiceTest, ArmClaimCannotBeDisplacedOrReleasedByAnotherToken) -{ - std::uint64_t first_claim = 0; - ASSERT_TRUE(manager_->claimArmJoints( - "first_arm", {"test_joint"}, first_claim)); - - std::uint64_t conflicting_claim = 0; - std::string claim_error; - EXPECT_FALSE(manager_->claimArmJoints( - "second_arm", {"test_joint"}, conflicting_claim, &claim_error)); - EXPECT_EQ(conflicting_claim, 0U); - EXPECT_NE(claim_error.find("first_arm"), std::string::npos); - - manager_->releaseArmJoints(first_claim + 1U); - EXPECT_EQ(manager_->armOwnerForJoint("test_joint"), "first_arm"); - - manager_->releaseArmJoints(first_claim); - EXPECT_TRUE(manager_->armOwnerForJoint("test_joint").empty()); -} - -TEST_F(MotorServiceTest, ArmClaimDoesNotRejectUnclaimedMotor) -{ - auto other_protocol = std::make_shared(); - auto other_motor = std::make_shared(2, "other_joint"); - other_motor->setProtocol(other_protocol); - ASSERT_TRUE(manager_->addMotor(other_motor)); - - std::uint64_t claim_id = 0; - ASSERT_TRUE(manager_->claimArmJoints( - "test_arm", {"test_joint"}, claim_id)); - - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.mutable_target()->set_motor_id(2); - request.set_target_position_rad(0.5); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(2.0); - request.mutable_wait()->set_settle_sample_count(1); - request.mutable_wait()->set_poll_period_ms(1); - grpc::ServerContext context; - api::MotorCommandResponse response; - - const auto status = service_->profilePosition( - &context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()); - EXPECT_DOUBLE_EQ(response.status().position_rad(), 0.5); -} - -TEST_F(MotorServiceTest, ProfileVelocityReturnsAfterTargetSettles) -{ - api::ProfileVelocityRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_velocity_rad_s(1.5); - request.set_acceleration_rad_s2(2.0); - request.mutable_wait()->set_settle_sample_count(2); - request.mutable_wait()->set_poll_period_ms(1); - request.mutable_wait()->set_velocity_tolerance_rad_s(1e-4); - - grpc::ServerContext context; - api::MotorCommandResponse response; - const auto status = service_->profileVelocity(&context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()); - EXPECT_DOUBLE_EQ(response.status().velocity_rad_s(), 1.5); - EXPECT_FALSE(response.status().service_busy()); - EXPECT_EQ(response.status().active_control(), api::MOTOR_CONTROL_NONE); -} - -TEST_F(MotorServiceTest, ProfilePositionStopsImmediatelyOnNonFiniteFeedback) -{ - protocol_->hold_position_ = true; - - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_position_rad(1.0); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(1.0); - request.mutable_wait()->set_timeout_ms(5000); - request.mutable_wait()->set_poll_period_ms(2); - - grpc::ServerContext context; - api::MotorCommandResponse response; - grpc::Status status; - const auto started = std::chrono::steady_clock::now(); - std::thread motion([&]() { - status = service_->profilePosition(&context, &request, &response); - }); - - const auto sample_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->get_q_started_.load() && - std::chrono::steady_clock::now() < sample_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - if (!protocol_->get_q_started_.load()) { - context.TryCancel(); - motion.join(); - FAIL() << "profile position feedback sampling did not start"; - return; - } - - protocol_->nonfinite_get_q_ = true; - motion.join(); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::UNAVAILABLE); - EXPECT_FALSE(response.header().success()); - EXPECT_FALSE(response.status().emergency_stopped()); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); - EXPECT_LT(std::chrono::steady_clock::now() - started, - std::chrono::seconds(1)); -} - -TEST_F(MotorServiceTest, - ProfileVelocityFailedStopOnNonFiniteFeedbackLatchesEmergency) -{ - protocol_->quick_stop_success_ = false; - - api::ProfileVelocityRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_velocity_rad_s(1.5); - request.set_acceleration_rad_s2(2.0); - request.mutable_wait()->set_timeout_ms(5000); - request.mutable_wait()->set_poll_period_ms(2); - request.mutable_wait()->set_settle_sample_count(1000); - - grpc::ServerContext context; - api::MotorCommandResponse response; - grpc::Status status; - const auto started = std::chrono::steady_clock::now(); - std::thread motion([&]() { - status = service_->profileVelocity(&context, &request, &response); - }); - - const auto sample_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->get_qd_started_.load() && - std::chrono::steady_clock::now() < sample_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - if (!protocol_->get_qd_started_.load()) { - context.TryCancel(); - motion.join(); - FAIL() << "profile velocity feedback sampling did not start"; - return; - } - - protocol_->nonfinite_get_qd_ = true; - motion.join(); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_FALSE(response.header().success()); - EXPECT_TRUE(response.status().emergency_stopped()); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); - EXPECT_LT(std::chrono::steady_clock::now() - started, - std::chrono::seconds(1)); - - api::ProfilePositionRequest blocked_request; - *blocked_request.mutable_target() = makeTarget(); - blocked_request.set_target_position_rad(1.0); - blocked_request.set_max_velocity_rad_s(1.0); - blocked_request.set_acceleration_rad_s2(1.0); - grpc::ServerContext blocked_context; - api::MotorCommandResponse blocked_response; - const auto blocked_status = service_->profilePosition( - &blocked_context, &blocked_request, &blocked_response); - EXPECT_EQ(blocked_status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_TRUE(blocked_response.status().emergency_stopped()); -} - -TEST_F(MotorServiceTest, - ProfileBackendExceptionReportsUnknownOutcomeAndQuickStops) -{ - protocol_->throw_profile_position_ = true; - - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_position_rad(1.0); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(1.0); - - grpc::ServerContext context; - api::MotorCommandResponse response; - const auto status = service_->profilePosition(&context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::ABORTED); - EXPECT_FALSE(response.header().success()); - EXPECT_EQ( - response.header().reason_code(), - api::COMMAND_REASON_CODE_OUTCOME_UNKNOWN); - EXPECT_NE(response.header().error_message().find( - "injected profile position exception"), - std::string::npos); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); - const auto safety = device::DeviceManager::getInstance() - .safetyManager() - .snapshot(); - ASSERT_EQ(safety.devices.size(), 1U); - EXPECT_EQ( - safety.devices.front().admission_state, - safety::DeviceAdmissionState::Quarantined); -} - -TEST_F(MotorServiceTest, ExceptionCleanupKeepsMotorReservedUntilQuickStopFinishes) -{ - protocol_->throw_profile_position_ = true; - protocol_->quick_stop_delay_ms_ = 100; - - api::ProfilePositionRequest failing_request; - *failing_request.mutable_target() = makeTarget(); - failing_request.set_target_position_rad(1.0); - failing_request.set_max_velocity_rad_s(1.0); - failing_request.set_acceleration_rad_s2(1.0); - grpc::ServerContext failing_context; - api::MotorCommandResponse failing_response; - grpc::Status failing_status; - std::thread failing([&]() { - failing_status = service_->profilePosition( - &failing_context, &failing_request, &failing_response); - }); - - const auto cleanup_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (protocol_->quick_stop_count_.load() == 0 && - std::chrono::steady_clock::now() < cleanup_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - if (protocol_->quick_stop_count_.load() == 0) { - failing.join(); - FAIL() << "exception cleanup did not start"; - return; - } - protocol_->throw_profile_position_ = false; - - api::ProfilePositionRequest competing_request; - *competing_request.mutable_target() = makeTarget(); - competing_request.set_target_position_rad(2.0); - competing_request.set_max_velocity_rad_s(1.0); - competing_request.set_acceleration_rad_s2(1.0); - grpc::ServerContext competing_context; - api::MotorCommandResponse competing_response; - const auto competing_status = service_->profilePosition( - &competing_context, &competing_request, &competing_response); - - failing.join(); - EXPECT_EQ(failing_status.error_code(), grpc::StatusCode::ABORTED); - EXPECT_EQ( - failing_response.header().reason_code(), - api::COMMAND_REASON_CODE_OUTCOME_UNKNOWN); - EXPECT_EQ(competing_status.error_code(), - grpc::StatusCode::RESOURCE_EXHAUSTED); -} - -TEST_F(MotorServiceTest, WaitingStaleCleanupCannotStopOrReleaseNewOwner) -{ - const auto target = makeTarget(); - gRPCMotorServiceImplTestAccess::bestEffortQuickStop( - *service_, target, "first completed exception cleanup"); - ASSERT_EQ(protocol_->quick_stop_count_.load(), 1); - - auto cleanup_gate = - gRPCMotorServiceImplTestAccess::holdExceptionCleanupMutex( - *service_, target); - std::atomic stale_cleanup_entered{false}; - std::thread stale_cleanup([&]() { - stale_cleanup_entered = true; - gRPCMotorServiceImplTestAccess::bestEffortQuickStop( - *service_, target, "second stale exception cleanup"); - }); - const auto stale_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!stale_cleanup_entered.load() && - std::chrono::steady_clock::now() < stale_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - if (!stale_cleanup_entered.load()) { - cleanup_gate.unlock(); - stale_cleanup.join(); - FAIL() << "second cleanup did not start waiting"; - return; - } - - protocol_->profile_delay_ms_ = 100; - protocol_->command_started_ = false; - api::ProfilePositionRequest request; - *request.mutable_target() = target; - request.set_target_position_rad(1.0); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(1.0); - request.mutable_wait()->set_settle_sample_count(1); - grpc::ServerContext motion_context; - api::MotorCommandResponse motion_response; - grpc::Status motion_status; - std::thread motion([&]() { - motion_status = service_->profilePosition( - &motion_context, &request, &motion_response); - }); - const auto motion_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->command_started_.load() && - std::chrono::steady_clock::now() < motion_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - if (!protocol_->command_started_.load()) { - cleanup_gate.unlock(); - stale_cleanup.join(); - motion_context.TryCancel(); - motion.join(); - FAIL() << "new owner did not dispatch while stale cleanup waited"; - return; - } - - cleanup_gate.unlock(); - stale_cleanup.join(); - EXPECT_EQ(protocol_->quick_stop_count_.load(), 1); - - motion.join(); - ASSERT_TRUE(motion_status.ok()) << motion_status.error_message(); - EXPECT_TRUE(motion_response.header().success()); - EXPECT_EQ(protocol_->quick_stop_count_.load(), 1); -} - -TEST_F(MotorServiceTest, GetStatusBackendExceptionReturnsInternal) -{ - protocol_->throw_get_q_ = true; - - api::GetMotorStatusRequest request; - *request.mutable_target() = makeTarget(); - - grpc::ServerContext context; - api::GetMotorStatusResponse response; - const auto status = service_->getStatus(&context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_FALSE(response.header().success()); - EXPECT_NE(response.header().error_message().find( - "injected getQ exception"), - std::string::npos); - EXPECT_EQ(protocol_->quick_stop_count_.load(), 0); -} - -TEST_F(MotorServiceTest, GetStatusRejectsNonFiniteFeedback) -{ - protocol_->nonfinite_get_q_ = true; - - api::GetMotorStatusRequest request; - *request.mutable_target() = makeTarget(); - - grpc::ServerContext context; - api::GetMotorStatusResponse response; - const auto status = service_->getStatus(&context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::UNAVAILABLE); - EXPECT_FALSE(response.header().success()); -} - -TEST_F(MotorServiceTest, ProfileRejectsInfiniteWaitTolerance) -{ - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_position_rad(1.0); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(1.0); - request.mutable_wait()->set_position_tolerance_rad( - std::numeric_limits::infinity()); - - grpc::ServerContext context; - api::MotorCommandResponse response; - const auto status = service_->profilePosition(&context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::INVALID_ARGUMENT); - EXPECT_FALSE(response.header().success()); - EXPECT_FALSE(protocol_->command_started_.load()); -} - -TEST_F(MotorServiceTest, ProfileRejectAckLossQuickStopsBeforeReturning) -{ - protocol_->profile_position_success_ = false; - - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_position_rad(1.0); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(1.0); - - grpc::ServerContext context; - api::MotorCommandResponse response; - const auto status = service_->profilePosition(&context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_FALSE(response.header().success()); - EXPECT_FALSE(response.status().emergency_stopped()); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); -} - -TEST_F(MotorServiceTest, ProfileRejectAckLossWithFailedStopReturnsInternal) -{ - protocol_->profile_position_success_ = false; - protocol_->quick_stop_success_ = false; - - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_position_rad(1.0); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(1.0); - - grpc::ServerContext context; - api::MotorCommandResponse response; - const auto status = service_->profilePosition(&context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_FALSE(response.header().success()); - EXPECT_TRUE(response.status().emergency_stopped()); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); - - grpc::ServerContext blocked_context; - api::MotorCommandResponse blocked_response; - const auto blocked_status = service_->profilePosition( - &blocked_context, &request, &blocked_response); - EXPECT_EQ(blocked_status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_TRUE(blocked_response.status().emergency_stopped()); - - protocol_->quick_stop_success_ = true; - protocol_->profile_position_success_ = true; - api::SetMotorEnabledRequest enable_request; - *enable_request.mutable_target() = makeTarget(); - enable_request.set_enabled(true); - grpc::ServerContext enable_context; - api::MotorCommandResponse enable_response; - const auto enable_status = service_->setEnabled( - &enable_context, &enable_request, &enable_response); - ASSERT_TRUE(enable_status.ok()) << enable_status.error_message(); - EXPECT_FALSE(enable_response.status().emergency_stopped()); - - grpc::ServerContext recovered_context; - api::MotorCommandResponse recovered_response; - const auto recovered_status = service_->profilePosition( - &recovered_context, &request, &recovered_response); - EXPECT_TRUE(recovered_status.ok()) << recovered_status.error_message(); -} - -TEST_F(MotorServiceTest, ProfileAckLossAfterDeadlineStillQuickStops) -{ - ASSERT_TRUE(startGrpcServer()); - protocol_->profile_position_success_ = false; - protocol_->profile_delay_ms_ = 100; - - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_position_rad(1.0); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(1.0); - grpc::ClientContext context; - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::milliseconds(50)); - api::MotorCommandResponse response; - const auto status = stub_->profilePosition(&context, request, &response); - EXPECT_EQ(status.error_code(), grpc::StatusCode::DEADLINE_EXCEEDED); - - const auto cleanup_deadline = - std::chrono::steady_clock::now() + std::chrono::milliseconds(300); - while (protocol_->quick_stop_count_.load() == 0 && - std::chrono::steady_clock::now() < cleanup_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(2)); - } - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); -} - -TEST_F(MotorServiceTest, RejectedProfilePositionPreemptedInFlightReturnsAborted) -{ - protocol_->profile_position_success_ = false; - protocol_->profile_delay_ms_ = 100; - - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_position_rad(1.0); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(1.0); - - grpc::ServerContext motion_context; - api::MotorCommandResponse motion_response; - grpc::Status motion_status; - std::thread motion([&]() { - motion_status = service_->profilePosition( - &motion_context, &request, &motion_response); - }); - const auto dispatch_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->command_started_.load() && - std::chrono::steady_clock::now() < dispatch_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - ASSERT_TRUE(protocol_->command_started_.load()); - - api::EmergencyStopRequest stop_request; - *stop_request.mutable_target() = makeTarget(); - grpc::ServerContext stop_context; - api::MotorCommandResponse stop_response; - const auto stop_status = service_->emergencyStop( - &stop_context, &stop_request, &stop_response); - - motion.join(); - ASSERT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_EQ(motion_status.error_code(), grpc::StatusCode::ABORTED); -} - -TEST_F(MotorServiceTest, RejectedProfileVelocityPreemptedInFlightReturnsAborted) -{ - protocol_->profile_velocity_success_ = false; - protocol_->profile_velocity_delay_ms_ = 100; - - api::ProfileVelocityRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(1.0); - - grpc::ServerContext motion_context; - api::MotorCommandResponse motion_response; - grpc::Status motion_status; - std::thread motion([&]() { - motion_status = service_->profileVelocity( - &motion_context, &request, &motion_response); - }); - const auto dispatch_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->profile_velocity_started_.load() && - std::chrono::steady_clock::now() < dispatch_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - ASSERT_TRUE(protocol_->profile_velocity_started_.load()); - - api::EmergencyStopRequest stop_request; - *stop_request.mutable_target() = makeTarget(); - grpc::ServerContext stop_context; - api::MotorCommandResponse stop_response; - const auto stop_status = service_->emergencyStop( - &stop_context, &stop_request, &stop_response); - - motion.join(); - ASSERT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_EQ(motion_status.error_code(), grpc::StatusCode::ABORTED); -} - -TEST_F(MotorServiceTest, EmergencyStopDuringProfileStatusSampleCannotReturnOk) -{ - protocol_->get_q_delay_ms_ = 100; - - api::ProfilePositionRequest motion_request; - *motion_request.mutable_target() = makeTarget(); - motion_request.set_target_position_rad(1.0); - motion_request.set_max_velocity_rad_s(1.0); - motion_request.set_acceleration_rad_s2(1.0); - motion_request.mutable_wait()->set_settle_sample_count(1); - - grpc::ServerContext motion_context; - api::MotorCommandResponse motion_response; - grpc::Status motion_status; - std::thread motion([&]() { - motion_status = service_->profilePosition( - &motion_context, &motion_request, &motion_response); - }); - - const auto sample_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->get_q_started_.load() && - std::chrono::steady_clock::now() < sample_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - if (!protocol_->get_q_started_.load()) { - motion_context.TryCancel(); - motion.join(); - FAIL() << "profile status sampling did not start"; - return; - } - - api::EmergencyStopRequest stop_request; - *stop_request.mutable_target() = makeTarget(); - grpc::ServerContext stop_context; - api::MotorCommandResponse stop_response; - const auto stop_status = service_->emergencyStop( - &stop_context, &stop_request, &stop_response); - - motion.join(); - ASSERT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_EQ(motion_status.error_code(), grpc::StatusCode::ABORTED); - EXPECT_FALSE(motion_response.header().success()); -} - -TEST_F(MotorServiceTest, EmergencyStopPreemptsBlockingProfilePosition) -{ - protocol_->hold_position_ = true; - protocol_->profile_delay_ms_ = 50; - - api::ProfilePositionRequest motion_request; - *motion_request.mutable_target() = makeTarget(); - motion_request.set_target_position_rad(2.0); - motion_request.set_max_velocity_rad_s(1.0); - motion_request.set_acceleration_rad_s2(1.0); - motion_request.mutable_wait()->set_timeout_ms(5000); - motion_request.mutable_wait()->set_poll_period_ms(1); - - grpc::ServerContext motion_context; - api::MotorCommandResponse motion_response; - grpc::Status motion_status; - std::thread motion([&]() { - motion_status = service_->profilePosition( - &motion_context, &motion_request, &motion_response); - }); - - const auto wait_until = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->command_started_.load() && - std::chrono::steady_clock::now() < wait_until) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - ASSERT_TRUE(protocol_->command_started_.load()); - - api::EmergencyStopRequest stop_request; - *stop_request.mutable_target() = makeTarget(); - grpc::ServerContext stop_context; - api::MotorCommandResponse stop_response; - const auto stop_status = service_->emergencyStop( - &stop_context, &stop_request, &stop_response); - - motion.join(); - ASSERT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_EQ(motion_status.error_code(), grpc::StatusCode::ABORTED); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); - EXPECT_GT(protocol_->last_quick_stop_order_.load(), - protocol_->profile_command_order_.load()); - EXPECT_TRUE(stop_response.status().emergency_stopped()); -} - -TEST_F(MotorServiceTest, EnableClearsEmergencyStopLatch) -{ - api::EmergencyStopRequest stop_request; - *stop_request.mutable_target() = makeTarget(); - grpc::ServerContext stop_context; - api::MotorCommandResponse stop_response; - ASSERT_TRUE(service_->emergencyStop( - &stop_context, &stop_request, &stop_response).ok()); - - api::SetMotorEnabledRequest enable_request; - *enable_request.mutable_target() = makeTarget(); - enable_request.set_enabled(true); - grpc::ServerContext enable_context; - api::MotorCommandResponse enable_response; - const auto enable_status = service_->setEnabled( - &enable_context, &enable_request, &enable_response); - - ASSERT_TRUE(enable_status.ok()) << enable_status.error_message(); - EXPECT_FALSE(enable_response.status().emergency_stopped()); -} - -TEST_F(MotorServiceTest, RejectedEnableQuickStopsAndDisables) -{ - protocol_->torque_on_success_ = false; - - api::SetMotorEnabledRequest request; - *request.mutable_target() = makeTarget(); - request.set_enabled(true); - grpc::ServerContext context; - api::MotorCommandResponse response; - const auto status = service_->setEnabled(&context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_FALSE(response.status().emergency_stopped()); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); - EXPECT_GE(protocol_->torque_off_count_.load(), 1); -} - -TEST_F(MotorServiceTest, RejectedEnableCleanupFailureReturnsInternal) -{ - protocol_->torque_on_success_ = false; - protocol_->torque_off_success_ = false; - - api::SetMotorEnabledRequest request; - *request.mutable_target() = makeTarget(); - request.set_enabled(true); - grpc::ServerContext context; - api::MotorCommandResponse response; - const auto status = service_->setEnabled(&context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_TRUE(response.status().emergency_stopped()); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); - EXPECT_GE(protocol_->torque_off_count_.load(), 1); -} - -TEST_F(MotorServiceTest, RejectedEnablePreemptedInFlightReturnsAborted) -{ - protocol_->torque_on_success_ = false; - protocol_->torque_on_delay_ms_ = 100; - - api::SetMotorEnabledRequest enable_request; - *enable_request.mutable_target() = makeTarget(); - enable_request.set_enabled(true); - grpc::ServerContext enable_context; - api::MotorCommandResponse enable_response; - grpc::Status enable_status; - std::thread enabling([&]() { - enable_status = service_->setEnabled( - &enable_context, &enable_request, &enable_response); - }); - const auto dispatch_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->torque_on_started_.load() && - std::chrono::steady_clock::now() < dispatch_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - ASSERT_TRUE(protocol_->torque_on_started_.load()); - - api::EmergencyStopRequest stop_request; - *stop_request.mutable_target() = makeTarget(); - grpc::ServerContext stop_context; - api::MotorCommandResponse stop_response; - const auto stop_status = service_->emergencyStop( - &stop_context, &stop_request, &stop_response); - - enabling.join(); - ASSERT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_EQ(enable_status.error_code(), grpc::StatusCode::ABORTED); -} - -TEST_F(MotorServiceTest, SuccessfulEnableCancelledInFlightRollsBack) -{ - ASSERT_TRUE(startGrpcServer()); - protocol_->torque_on_delay_ms_ = 100; - - api::SetMotorEnabledRequest request; - *request.mutable_target() = makeTarget(); - request.set_enabled(true); - grpc::ClientContext context; - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::milliseconds(50)); - api::MotorCommandResponse response; - const auto status = stub_->setEnabled(&context, request, &response); - EXPECT_EQ(status.error_code(), grpc::StatusCode::DEADLINE_EXCEEDED); - - const auto cleanup_deadline = - std::chrono::steady_clock::now() + std::chrono::milliseconds(400); - while ((protocol_->quick_stop_count_.load() == 0 || - protocol_->torque_off_count_.load() == 0) && - std::chrono::steady_clock::now() < cleanup_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(2)); - } - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); - EXPECT_GE(protocol_->torque_off_count_.load(), 1); -} - -TEST_F(MotorServiceTest, EmergencyStopPreemptsEnableDuringDispatch) -{ - api::EmergencyStopRequest initial_stop; - *initial_stop.mutable_target() = makeTarget(); - grpc::ServerContext initial_stop_context; - api::MotorCommandResponse initial_stop_response; - ASSERT_TRUE(service_->emergencyStop( - &initial_stop_context, &initial_stop, &initial_stop_response).ok()); - - protocol_->operation_counter_ = 0; - protocol_->last_quick_stop_order_ = 0; - protocol_->torque_on_started_ = false; - protocol_->torque_on_delay_ms_ = 50; - - api::SetMotorEnabledRequest enable_request; - *enable_request.mutable_target() = makeTarget(); - enable_request.set_enabled(true); - grpc::ServerContext enable_context; - api::MotorCommandResponse enable_response; - grpc::Status enable_status; - std::thread enabling([&]() { - enable_status = service_->setEnabled( - &enable_context, &enable_request, &enable_response); - }); - - const auto wait_until = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->torque_on_started_.load() && - std::chrono::steady_clock::now() < wait_until) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - ASSERT_TRUE(protocol_->torque_on_started_.load()); - - api::EmergencyStopRequest stop_request; - *stop_request.mutable_target() = makeTarget(); - grpc::ServerContext stop_context; - api::MotorCommandResponse stop_response; - const auto stop_status = service_->emergencyStop( - &stop_context, &stop_request, &stop_response); - - enabling.join(); - ASSERT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_EQ(enable_status.error_code(), grpc::StatusCode::ABORTED); - EXPECT_TRUE(stop_response.status().emergency_stopped()); - EXPECT_GT(protocol_->last_quick_stop_order_.load(), - protocol_->torque_on_order_.load()); - EXPECT_GE(protocol_->torque_off_count_.load(), 1); -} - -TEST_F(MotorServiceTest, SuccessfulEnablePreemptCleanupFailureReturnsInternal) -{ - protocol_->torque_on_delay_ms_ = 100; - protocol_->torque_off_success_ = false; - - api::SetMotorEnabledRequest enable_request; - *enable_request.mutable_target() = makeTarget(); - enable_request.set_enabled(true); - grpc::ServerContext enable_context; - api::MotorCommandResponse enable_response; - grpc::Status enable_status; - std::thread enabling([&]() { - enable_status = service_->setEnabled( - &enable_context, &enable_request, &enable_response); - }); - const auto dispatch_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->torque_on_started_.load() && - std::chrono::steady_clock::now() < dispatch_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - ASSERT_TRUE(protocol_->torque_on_started_.load()); - - api::EmergencyStopRequest stop_request; - *stop_request.mutable_target() = makeTarget(); - grpc::ServerContext stop_context; - api::MotorCommandResponse stop_response; - const auto stop_status = service_->emergencyStop( - &stop_context, &stop_request, &stop_response); - - enabling.join(); - ASSERT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_EQ(enable_status.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_GE(protocol_->torque_off_count_.load(), 1); -} - -TEST_F(MotorServiceTest, ConcurrentEmergencyStopsCannotBeClearedByEnable) -{ - protocol_->quick_stop_delay_ms_ = 60; - - api::EmergencyStopRequest first_request; - *first_request.mutable_target() = makeTarget(); - api::EmergencyStopRequest second_request; - *second_request.mutable_target() = makeTarget(); - grpc::ServerContext first_context; - grpc::ServerContext second_context; - api::MotorCommandResponse first_response; - api::MotorCommandResponse second_response; - grpc::Status first_status; - grpc::Status second_status; - - std::thread first([&]() { - first_status = service_->emergencyStop( - &first_context, &first_request, &first_response); - }); - const auto first_stop_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (protocol_->quick_stop_count_.load() < 1 && - std::chrono::steady_clock::now() < first_stop_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - if (protocol_->quick_stop_count_.load() < 1) { - first.join(); - FAIL() << "first emergency stop did not dispatch"; - return; - } - - std::thread second([&]() { - second_status = service_->emergencyStop( - &second_context, &second_request, &second_response); - }); - first.join(); - - const auto second_stop_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (protocol_->quick_stop_count_.load() < 3 && - std::chrono::steady_clock::now() < second_stop_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - if (protocol_->quick_stop_count_.load() < 3) { - second.join(); - FAIL() << "second emergency stop did not dispatch"; - return; - } - - api::SetMotorEnabledRequest enable_request; - *enable_request.mutable_target() = makeTarget(); - enable_request.set_enabled(true); - grpc::ServerContext enable_context; - api::MotorCommandResponse enable_response; - const auto enable_status = service_->setEnabled( - &enable_context, &enable_request, &enable_response); - - second.join(); - ASSERT_TRUE(first_status.ok()) << first_status.error_message(); - ASSERT_TRUE(second_status.ok()) << second_status.error_message(); - EXPECT_EQ(enable_status.error_code(), grpc::StatusCode::ABORTED); - - api::ProfilePositionRequest motion_request; - *motion_request.mutable_target() = makeTarget(); - motion_request.set_target_position_rad(1.0); - motion_request.set_max_velocity_rad_s(1.0); - motion_request.set_acceleration_rad_s2(1.0); - grpc::ServerContext motion_context; - api::MotorCommandResponse motion_response; - const auto motion_status = service_->profilePosition( - &motion_context, &motion_request, &motion_response); - EXPECT_EQ(motion_status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_TRUE(motion_response.status().emergency_stopped()); -} - -TEST_F(MotorServiceTest, ProfileCancellationInterruptsLongPollAndQuickStops) -{ - ASSERT_TRUE(startGrpcServer()); - protocol_->hold_position_ = true; - - api::ProfilePositionRequest request; - *request.mutable_target() = makeTarget(); - request.set_target_position_rad(1.0); - request.set_max_velocity_rad_s(1.0); - request.set_acceleration_rad_s2(1.0); - request.mutable_wait()->set_timeout_ms(5000); - request.mutable_wait()->set_poll_period_ms(1000); - - grpc::ClientContext context; - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::milliseconds(75)); - api::MotorCommandResponse response; - const auto started = std::chrono::steady_clock::now(); - const auto status = stub_->profilePosition(&context, request, &response); - EXPECT_EQ(status.error_code(), grpc::StatusCode::DEADLINE_EXCEEDED); - - const auto stop_deadline = - std::chrono::steady_clock::now() + std::chrono::milliseconds(250); - while (protocol_->quick_stop_count_.load() == 0 && - std::chrono::steady_clock::now() < stop_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(2)); - } - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); - EXPECT_LT(std::chrono::steady_clock::now() - started, - std::chrono::milliseconds(350)); -} - -TEST_F(MotorServiceTest, CyclicPositionStreamAppliesSetpointAndStopsOnWritesDone) -{ - ASSERT_TRUE(startGrpcServer()); - - grpc::ClientContext context; - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::seconds(2)); - auto stream = stub_->streamCyclicPosition(&context); - ASSERT_NE(stream, nullptr); - - api::CyclicPositionRequest open_request; - *open_request.mutable_open()->mutable_target() = makeTarget(); - open_request.mutable_open()->set_watchdog_timeout_ms(500); - ASSERT_TRUE(stream->Write(open_request)); - - api::CyclicControlResponse response; - ASSERT_TRUE(stream->Read(&response)); - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ(response.phase(), api::CYCLIC_STREAM_OPENED); - - api::CyclicPositionRequest setpoint_request; - auto* setpoint = setpoint_request.mutable_setpoint(); - setpoint->set_sequence(1); - setpoint->set_target_position_rad(0.75); - setpoint->set_target_velocity_rad_s(0.2); - ASSERT_TRUE(stream->Write(setpoint_request)); - - response.Clear(); - ASSERT_TRUE(stream->Read(&response)); - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ(response.phase(), api::CYCLIC_STREAM_APPLIED); - EXPECT_EQ(response.sequence(), 1); - EXPECT_FALSE(response.has_status()); - - ASSERT_TRUE(stream->WritesDone()); - response.Clear(); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_TRUE(response.header().success()); - EXPECT_EQ(response.phase(), api::CYCLIC_STREAM_STOPPED); - EXPECT_EQ(response.sequence(), 1); - EXPECT_FALSE(stream->Read(&response)); - - const auto finish = stream->Finish(); - EXPECT_TRUE(finish.ok()) << finish.error_message(); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); -} - -TEST_F(MotorServiceTest, CyclicVelocityStreamAppliesAndStopsOnWritesDone) -{ - ASSERT_TRUE(startGrpcServer()); - - grpc::ClientContext context; - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::seconds(2)); - auto stream = stub_->streamCyclicVelocity(&context); - ASSERT_NE(stream, nullptr); - - api::CyclicVelocityRequest open_request; - *open_request.mutable_open()->mutable_target() = makeTarget(); - open_request.mutable_open()->set_watchdog_timeout_ms(500); - ASSERT_TRUE(stream->Write(open_request)); - - api::CyclicControlResponse response; - ASSERT_TRUE(stream->Read(&response)); - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ(response.phase(), api::CYCLIC_STREAM_OPENED); - EXPECT_TRUE(response.has_status()); - - api::CyclicVelocityRequest setpoint_request; - auto* setpoint = setpoint_request.mutable_setpoint(); - setpoint->set_sequence(1); - setpoint->set_target_velocity_rad_s(0.6); - ASSERT_TRUE(stream->Write(setpoint_request)); - - response.Clear(); - ASSERT_TRUE(stream->Read(&response)); - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ(response.phase(), api::CYCLIC_STREAM_APPLIED); - EXPECT_EQ(response.sequence(), 1); - EXPECT_FALSE(response.has_status()); - - ASSERT_TRUE(stream->WritesDone()); - response.Clear(); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_TRUE(response.header().success()); - EXPECT_EQ(response.phase(), api::CYCLIC_STREAM_STOPPED); - EXPECT_EQ(response.sequence(), 1); - EXPECT_TRUE(response.has_status()); - EXPECT_FALSE(stream->Read(&response)); - - const auto finish = stream->Finish(); - EXPECT_TRUE(finish.ok()) << finish.error_message(); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); -} - -TEST_F(MotorServiceTest, EmergencyStopDuringCyclicDispatchCannotPublishApplied) -{ - ASSERT_TRUE(startGrpcServer()); - protocol_->cyclic_position_delay_ms_ = 100; - - grpc::ClientContext context; - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::seconds(3)); - auto stream = stub_->streamCyclicPosition(&context); - ASSERT_NE(stream, nullptr); - - api::CyclicPositionRequest open_request; - *open_request.mutable_open()->mutable_target() = makeTarget(); - ASSERT_TRUE(stream->Write(open_request)); - - api::CyclicControlResponse response; - ASSERT_TRUE(stream->Read(&response)); - ASSERT_EQ(response.phase(), api::CYCLIC_STREAM_OPENED); - - api::CyclicPositionRequest setpoint_request; - setpoint_request.mutable_setpoint()->set_sequence(1); - setpoint_request.mutable_setpoint()->set_target_position_rad(0.5); - ASSERT_TRUE(stream->Write(setpoint_request)); - - const auto dispatch_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->cyclic_position_started_.load() && - std::chrono::steady_clock::now() < dispatch_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - ASSERT_TRUE(protocol_->cyclic_position_started_.load()); - - api::EmergencyStopRequest stop_request; - *stop_request.mutable_target() = makeTarget(); - grpc::ServerContext stop_context; - api::MotorCommandResponse stop_response; - grpc::Status stop_status; - std::thread stopping([&]() { - stop_status = service_->emergencyStop( - &stop_context, &stop_request, &stop_response); - }); - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - stream->WritesDone(); - stopping.join(); - ASSERT_TRUE(stop_status.ok()) << stop_status.error_message(); - - response.Clear(); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_NE(response.phase(), api::CYCLIC_STREAM_APPLIED); - EXPECT_EQ(response.phase(), api::CYCLIC_STREAM_FAILED); - EXPECT_FALSE(response.header().success()); - EXPECT_FALSE(stream->Read(&response)); - const auto finish = stream->Finish(); - EXPECT_EQ(finish.error_code(), grpc::StatusCode::ABORTED); -} - -TEST_F(MotorServiceTest, CyclicOpenSetModeExceptionReturnsInternalAndQuickStops) -{ - ASSERT_TRUE(startGrpcServer()); - protocol_->throw_set_mode_ = true; - - grpc::ClientContext context; - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::seconds(2)); - auto stream = stub_->streamCyclicPosition(&context); - ASSERT_NE(stream, nullptr); - - api::CyclicPositionRequest open_request; - *open_request.mutable_open()->mutable_target() = makeTarget(); - ASSERT_TRUE(stream->Write(open_request)); - stream->WritesDone(); - - api::CyclicControlResponse response; - EXPECT_FALSE(stream->Read(&response)); - const auto finish = stream->Finish(); - EXPECT_EQ(finish.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_NE(finish.error_message().find("injected setMode exception"), - std::string::npos); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); -} - -TEST_F(MotorServiceTest, CyclicStreamReportsFailureWhenQuickStopFails) -{ - ASSERT_TRUE(startGrpcServer()); - protocol_->quick_stop_success_ = false; - - grpc::ClientContext context; - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::seconds(2)); - auto stream = stub_->streamCyclicPosition(&context); - ASSERT_NE(stream, nullptr); - - api::CyclicPositionRequest open_request; - *open_request.mutable_open()->mutable_target() = makeTarget(); - open_request.mutable_open()->set_watchdog_timeout_ms(500); - ASSERT_TRUE(stream->Write(open_request)); - - api::CyclicControlResponse response; - ASSERT_TRUE(stream->Read(&response)); - ASSERT_EQ(response.phase(), api::CYCLIC_STREAM_OPENED); - ASSERT_TRUE(stream->WritesDone()); - - response.Clear(); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_FALSE(response.header().success()); - EXPECT_EQ(response.phase(), api::CYCLIC_STREAM_FAILED); - EXPECT_FALSE(stream->Read(&response)); - const auto finish = stream->Finish(); - EXPECT_EQ(finish.error_code(), grpc::StatusCode::INTERNAL); - - api::ProfilePositionRequest profile_request; - *profile_request.mutable_target() = makeTarget(); - profile_request.set_target_position_rad(1.0); - profile_request.set_max_velocity_rad_s(1.0); - profile_request.set_acceleration_rad_s2(1.0); - grpc::ServerContext profile_context; - api::MotorCommandResponse profile_response; - const auto profile_status = service_->profilePosition( - &profile_context, &profile_request, &profile_response); - EXPECT_EQ(profile_status.error_code(), - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_TRUE(profile_response.status().emergency_stopped()); -} - -TEST_F(MotorServiceTest, CyclicDriverExceptionReturnsInternalWithoutTerminating) -{ - ASSERT_TRUE(startGrpcServer()); - protocol_->throw_cyclic_position_ = true; - - grpc::ClientContext context; - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::seconds(2)); - auto stream = stub_->streamCyclicPosition(&context); - ASSERT_NE(stream, nullptr); - - api::CyclicPositionRequest open_request; - *open_request.mutable_open()->mutable_target() = makeTarget(); - ASSERT_TRUE(stream->Write(open_request)); - - api::CyclicControlResponse response; - ASSERT_TRUE(stream->Read(&response)); - ASSERT_EQ(response.phase(), api::CYCLIC_STREAM_OPENED); - - api::CyclicPositionRequest setpoint_request; - setpoint_request.mutable_setpoint()->set_sequence(1); - setpoint_request.mutable_setpoint()->set_target_position_rad(0.5); - ASSERT_TRUE(stream->Write(setpoint_request)); - - response.Clear(); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_FALSE(response.header().success()); - EXPECT_EQ(response.phase(), api::CYCLIC_STREAM_FAILED); - EXPECT_TRUE(stream->WritesDone()); - EXPECT_FALSE(stream->Read(&response)); - const auto finish = stream->Finish(); - EXPECT_EQ(finish.error_code(), grpc::StatusCode::INTERNAL); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); -} - -TEST_F(MotorServiceTest, CyclicPositionStreamWatchdogStopsSilentClient) -{ - ASSERT_TRUE(startGrpcServer()); - - grpc::ClientContext context; - context.set_deadline( - std::chrono::system_clock::now() + std::chrono::seconds(2)); - auto stream = stub_->streamCyclicPosition(&context); - ASSERT_NE(stream, nullptr); - - api::CyclicPositionRequest open_request; - *open_request.mutable_open()->mutable_target() = makeTarget(); - open_request.mutable_open()->set_watchdog_timeout_ms(25); - ASSERT_TRUE(stream->Write(open_request)); - - api::CyclicControlResponse response; - ASSERT_TRUE(stream->Read(&response)); - EXPECT_EQ(response.phase(), api::CYCLIC_STREAM_OPENED); - - response.Clear(); - ASSERT_TRUE(stream->Read(&response)); - EXPECT_FALSE(response.header().success()); - EXPECT_EQ(response.phase(), api::CYCLIC_STREAM_WATCHDOG_EXPIRED); - EXPECT_FALSE(stream->Read(&response)); - - const auto finish = stream->Finish(); - EXPECT_TRUE( - finish.error_code() == grpc::StatusCode::DEADLINE_EXCEEDED || - finish.error_code() == grpc::StatusCode::CANCELLED) - << finish.error_message(); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); -} - -TEST_F(MotorServiceTest, SystemStopAllPreemptsProfileAndResumesControl) -{ - protocol_->hold_position_ = true; - - api::ProfilePositionRequest motion_request; - *motion_request.mutable_target() = makeTarget(); - motion_request.set_target_position_rad(2.0); - motion_request.set_max_velocity_rad_s(1.0); - motion_request.set_acceleration_rad_s2(1.0); - motion_request.mutable_wait()->set_timeout_ms(5000); - motion_request.mutable_wait()->set_poll_period_ms(1); - - grpc::ServerContext motion_context; - api::MotorCommandResponse motion_response; - grpc::Status motion_status; - std::thread motion([&]() { - motion_status = service_->profilePosition( - &motion_context, &motion_request, &motion_response); - }); - - const auto command_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (!protocol_->command_started_.load() && - std::chrono::steady_clock::now() < command_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - if (!protocol_->command_started_.load()) { - motion_context.TryCancel(); - motion.join(); - FAIL() << "profile command did not start"; - return; - } - - auto& coordinator = globalMotorActivityCoordinator(); - const auto ticket = coordinator.beginStopAll(); - ASSERT_TRUE(ticket.valid()); - std::string stop_error; - EXPECT_TRUE(coordinator.stopAndWait( - ticket, std::chrono::seconds(1), &stop_error)) - << stop_error; - EXPECT_TRUE(coordinator.finishStopAll(ticket, true)); - - motion.join(); - EXPECT_EQ(motion_status.error_code(), grpc::StatusCode::ABORTED); - EXPECT_FALSE(motion_response.header().success()); - EXPECT_FALSE(motion_response.status().emergency_stopped()); - EXPECT_GE(protocol_->quick_stop_count_.load(), 1); - EXPECT_GT(protocol_->last_quick_stop_order_.load(), - protocol_->profile_command_order_.load()); - - protocol_->hold_position_ = false; - api::ProfilePositionRequest resumed_request; - *resumed_request.mutable_target() = makeTarget(); - resumed_request.set_target_position_rad(0.5); - resumed_request.set_max_velocity_rad_s(1.0); - resumed_request.set_acceleration_rad_s2(1.0); - resumed_request.mutable_wait()->set_settle_sample_count(1); - grpc::ServerContext resumed_context; - api::MotorCommandResponse resumed_response; - const auto resumed_status = service_->profilePosition( - &resumed_context, &resumed_request, &resumed_response); - ASSERT_TRUE(resumed_status.ok()) << resumed_status.error_message(); - EXPECT_TRUE(resumed_response.header().success()); - EXPECT_FALSE(resumed_response.status().emergency_stopped()); -} - -TEST_F(MotorServiceTest, FailedSystemStopAllRemainsFailClosedUntilRecovery) -{ - // Resolve the motor once so its control state is registered even though no - // motion RPC is active when StopAll starts. - api::GetMotorStatusRequest status_request; - *status_request.mutable_target() = makeTarget(); - grpc::ServerContext status_context; - api::GetMotorStatusResponse status_response; - ASSERT_TRUE(service_->getStatus( - &status_context, &status_request, &status_response).ok()); - - auto& coordinator = globalMotorActivityCoordinator(); - protocol_->quick_stop_success_ = false; - const auto failed_ticket = coordinator.beginStopAll(); - ASSERT_TRUE(failed_ticket.valid()); - std::string stop_error; - EXPECT_FALSE(coordinator.stopAndWait( - failed_ticket, std::chrono::seconds(1), &stop_error)); - EXPECT_FALSE(stop_error.empty()); - EXPECT_FALSE(coordinator.finishStopAll(failed_ticket, false)); - - api::ProfilePositionRequest blocked_request; - *blocked_request.mutable_target() = makeTarget(); - blocked_request.set_target_position_rad(1.0); - blocked_request.set_max_velocity_rad_s(1.0); - blocked_request.set_acceleration_rad_s2(1.0); - grpc::ServerContext blocked_context; - api::MotorCommandResponse blocked_response; - const auto blocked_status = service_->profilePosition( - &blocked_context, &blocked_request, &blocked_response); - EXPECT_EQ(blocked_status.error_code(), grpc::StatusCode::ABORTED); - EXPECT_NE(blocked_status.error_message().find("StopAll"), - std::string::npos); - - protocol_->quick_stop_success_ = true; - const auto recovery_ticket = coordinator.beginStopAll(); - ASSERT_TRUE(recovery_ticket.valid()); - stop_error.clear(); - ASSERT_TRUE(coordinator.stopAndWait( - recovery_ticket, std::chrono::seconds(1), &stop_error)) - << stop_error; - ASSERT_TRUE(coordinator.finishStopAll(recovery_ticket, true)); - - blocked_request.mutable_wait()->set_settle_sample_count(1); - grpc::ServerContext resumed_context; - api::MotorCommandResponse resumed_response; - const auto resumed_status = service_->profilePosition( - &resumed_context, &blocked_request, &resumed_response); - ASSERT_TRUE(resumed_status.ok()) << resumed_status.error_message(); - EXPECT_TRUE(resumed_response.header().success()); - EXPECT_FALSE(resumed_response.status().emergency_stopped()); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/grpc_robot_arm_teleop_backend_test.cpp b/cmvr-es/service/grpc/server/tests/grpc_robot_arm_teleop_backend_test.cpp deleted file mode 100644 index b320b3b4..00000000 --- a/cmvr-es/service/grpc/server/tests/grpc_robot_arm_teleop_backend_test.cpp +++ /dev/null @@ -1,525 +0,0 @@ -#include "service/grpc/server/include/grpc_robot_arm_teleop_backend.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace cmvr::service { -namespace { - -class FakeRobotArm final : public device::RobotArm { -public: - FakeRobotArm() - { - id_ = "right_arm"; - model_.name = id_; - model_.dof = 2; - model_.joint_names = {"joint_1", "joint_2"}; - model_.joint_limits = { - {-1.0, 1.0, 2.0, 5.0, 10.0}, - {-0.5, 0.5, 3.0, 6.0, 10.0}}; - - state_.connected = true; - state_.powered_on = true; - state_.robot_mode = device::RobotMode::Idle; - state_.safety_mode = device::SafetyMode::Normal; - state_.actual_joint_state.position = {0.0, 0.0}; - state_.actual_joint_state.velocity = {0.0, 0.0}; - state_.actual_joint_state.effort = {1.0, 2.0}; - state_.actual_joint_state.sequence = 7; - state_.actual_joint_state.position_valid = true; - state_.actual_joint_state.velocity_valid = true; - state_.actual_joint_state.effort_valid = true; - } - - std::string typeName() const override { return "FakeRobotArm"; } - device::RobotModel getRobotModel() const override { return model_; } - std::size_t getDof() const override { return model_.dof; } - device::ArmState getRobotState() const override - { - ++get_state_calls; - return state_; - } - device::JointGroupState getJointState() const override - { - return state_.actual_joint_state; - } - device::CartesianPose getTcpPose( - device::FrameType = device::FrameType::Base) const override - { - return {}; - } - device::RobotMode getRobotMode() const override - { - return state_.robot_mode; - } - device::SafetyMode getSafetyMode() const override - { - return state_.safety_mode; - } - device::ControlMode getControlMode() const override - { - return device::ControlMode::Servo; - } - bool supportsTeleopGroupServo() const noexcept override - { - return group_servo_capability; - } - device::JointEffortSource jointEffortSource() const noexcept override - { - return effort_source; - } - - device::Result torqueOn() override - { - ++torque_on_calls; - return device::Result::success(); - } - device::Result torqueOff() override { return device::Result::success(); } - device::Result calibrateZeroQ(const std::string&) override - { - return device::Result::success(); - } - device::Result emergencyStop() override - { - return device::Result::success(); - } - device::Result protectiveStop() override - { - return device::Result::success(); - } - device::Result setSpeedScaling(double) override - { - return device::Result::success(); - } - double getSpeedScaling() const override { return 1.0; } - bool isProtectiveStopped() const override { return false; } - bool isEmergencyStopped() const override { return false; } - bool isFault() const override { return state_.fault; } - - device::Result moveJ( - const device::JointPositionCommand&, - const device::MotionOptions&) override - { - return device::Result::success(); - } - device::Result speedJ( - const device::JointVelocityCommand&, double, double) override - { - return device::Result::success(); - } - device::Result stopJ(double) override - { - return device::Result::success(); - } - device::Result moveL( - const device::CartesianPose&, - const device::MotionOptions&, - device::FrameType = device::FrameType::Base) override - { - return device::Result::success(); - } - device::Result speedL( - const device::CartesianVelocity&, - double, - double, - device::FrameType = device::FrameType::Base) override - { - return device::Result::success(); - } - device::Result stopL(std::optional = std::nullopt) override - { - return device::Result::success(); - } - device::Result stopMotion() override - { - ++stop_motion_calls; - return stop_motion_result; - } - - device::Result startServoMode( - const device::ServoOptions& options) override - { - ++start_servo_calls; - last_servo_period = options.period; - return start_servo_result; - } - device::Result servoJ( - const device::JointPositionCommand& target) override - { - ++servo_j_calls; - last_command = target.position; - if (servo_sleep.count() > 0) { - std::this_thread::sleep_for(servo_sleep); - } - return servo_j_result; - } - device::Result servoL( - const device::CartesianPose&, - device::FrameType = device::FrameType::Base) override - { - return device::Result::success(); - } - device::Result servoSpeedJ( - const device::JointVelocityCommand&) override - { - return device::Result::success(); - } - device::Result servoSpeedL( - const device::CartesianVelocity&, - device::FrameType = device::FrameType::Base) override - { - return device::Result::success(); - } - device::Result stopServoMode() override - { - ++stop_servo_calls; - return stop_servo_result; - } - - device::Result connect(const std::string&, int) override - { - return device::Result::success(); - } - device::Result disconnect() override - { - return device::Result::success(); - } - bool isConnected() const override { return state_.connected; } - device::Result powerOn() override { return torqueOn(); } - device::Result powerOff() override { return torqueOff(); } - device::Result brakeRelease() override - { - return device::Result::success(); - } - device::Result shutdown() override - { - return device::Result::success(); - } - device::Result clearFault() override - { - return device::Result::success(); - } - device::Result unlockProtectiveStop() override - { - return device::Result::success(); - } - device::Result loadProgram(const std::string&) override - { - return device::Result::success(); - } - device::Result playProgram() override - { - return device::Result::success(); - } - device::Result pauseProgram() override - { - return device::Result::success(); - } - device::Result stopProgram() override - { - return device::Result::success(); - } - std::vector ik( - const std::string&, - const std::string&, - const device::CartesianPose&) override - { - return {}; - } - std::shared_ptr kinematicsSolver() const override - { - return nullptr; - } - device::CartesianPose fk( - const std::string&, const std::string&) override - { - return {}; - } - device::CartesianPose fk(bool = true) override { return {}; } - device::CartesianVelocity getSpeedLCommandTwistBase() const override - { - return {}; - } - bool busy() const override { return false; } - - bool group_servo_capability{true}; - device::JointEffortSource effort_source{ - device::JointEffortSource::Unspecified}; - mutable int get_state_calls{0}; - int torque_on_calls{0}; - int start_servo_calls{0}; - int servo_j_calls{0}; - int stop_motion_calls{0}; - int stop_servo_calls{0}; - double last_servo_period{0.0}; - std::vector last_command; - std::chrono::microseconds servo_sleep{0}; - device::Result start_servo_result{device::Result::success()}; - device::Result servo_j_result{device::Result::success()}; - device::Result stop_motion_result{device::Result::success()}; - device::Result stop_servo_result{device::Result::success()}; - device::RobotModel model_; - device::ArmState state_; -}; - -config::ArmTeleopBackendConfig validConfig() -{ - config::ArmTeleopBackendConfig config; - config.set_enable(true); - config.set_device_id("right_arm"); - config.set_model_sha256(std::string(64, 'a')); - config.set_calibration_sha256(std::string(64, 'b')); - config.set_base_frame("base_link"); - config.set_tool_frame("tool_link"); - config.set_servo_period_s(0.01); - config.set_max_apply_duration_us(5000); - config.set_require_powered(true); - config.set_max_initial_position_step_rad(0.2); - config.set_max_position_step_rad(0.015); - return config; -} - -arm_teleop::JointSetpoint setpoint( - const double first, - const double second, - const double first_velocity = 0.0, - const double second_velocity = 0.0) -{ - arm_teleop::JointSetpoint value; - value.set_sequence(1); - value.add_position_rad(first); - value.add_position_rad(second); - value.add_velocity_rad_s(first_velocity); - value.add_velocity_rad_s(second_velocity); - value.set_valid_for_us(5000); - return value; -} - -arm_teleop::OpenSession openRequest() -{ - arm_teleop::OpenSession request; - request.set_requested_command_rate_hz(100); - return request; -} - -std::chrono::steady_clock::time_point liveDeadline() -{ - return std::chrono::steady_clock::now() + - std::chrono::seconds(1); -} - -TEST(RobotArmTeleopBackendTest, RejectsArmWithoutExplicitGroupServoCapability) -{ - auto arm = std::make_shared(); - arm->group_servo_capability = false; - const auto backend = - makeRobotArmTeleopBackend(arm, validConfig()); - - EXPECT_FALSE(backend->available()); - EXPECT_NE( - backend->unavailableReason().find("capability"), - std::string::npos); - EXPECT_EQ(arm->start_servo_calls, 0); -} - -TEST(RobotArmTeleopBackendTest, OpenStartsServoButNeverPowersArm) -{ - auto arm = std::make_shared(); - const auto backend = - makeRobotArmTeleopBackend(arm, validConfig()); - - ASSERT_TRUE(backend->available()) - << backend->unavailableReason(); - EXPECT_TRUE(backend->open(openRequest()).success); - EXPECT_EQ(arm->start_servo_calls, 1); - EXPECT_DOUBLE_EQ(arm->last_servo_period, 0.01); - EXPECT_EQ(arm->torque_on_calls, 0); -} - -TEST(RobotArmTeleopBackendTest, AppliesSetpointAndAlwaysRunsBothStopPaths) -{ - auto arm = std::make_shared(); - const auto backend = - makeRobotArmTeleopBackend(arm, validConfig()); - ASSERT_TRUE(backend->open(openRequest()).success); - - ASSERT_TRUE( - backend->applySetpoint( - setpoint(0.1, 0.1), liveDeadline()).success); - EXPECT_EQ(arm->servo_j_calls, 1); - EXPECT_EQ(arm->last_command, (std::vector{0.1, 0.1})); - - arm->stop_motion_result = device::Result::failure( - device::ArmErrorCode::CommandFailed, "motion stop failed"); - const auto result = backend->stop( - arm_teleop::STOP_REASON_OPERATOR_REQUEST, "test"); - EXPECT_FALSE(result.success); - EXPECT_EQ(arm->stop_motion_calls, 1); - EXPECT_EQ(arm->stop_servo_calls, 1); -} - -TEST(RobotArmTeleopBackendTest, RejectsInitialAndContinuousPositionSteps) -{ - auto arm = std::make_shared(); - const auto backend = - makeRobotArmTeleopBackend(arm, validConfig()); - ASSERT_TRUE(backend->open(openRequest()).success); - - EXPECT_EQ( - backend->applySetpoint( - setpoint(0.21, 0.0), liveDeadline()).status_code, - grpc::StatusCode::OUT_OF_RANGE); - ASSERT_TRUE( - backend->applySetpoint( - setpoint(0.1, 0.1), liveDeadline()).success); - EXPECT_EQ( - backend->applySetpoint( - setpoint(0.12, 0.1), liveDeadline()).status_code, - grpc::StatusCode::OUT_OF_RANGE); - EXPECT_EQ(arm->servo_j_calls, 1); -} - -TEST(RobotArmTeleopBackendTest, RejectsJointPositionAndVelocityLimits) -{ - auto arm = std::make_shared(); - const auto backend = - makeRobotArmTeleopBackend(arm, validConfig()); - ASSERT_TRUE(backend->open(openRequest()).success); - - EXPECT_EQ( - backend->applySetpoint( - setpoint(1.01, 0.0), liveDeadline()).status_code, - grpc::StatusCode::OUT_OF_RANGE); - EXPECT_EQ( - backend->applySetpoint( - setpoint(0.0, 0.0, 2.01, 0.0), liveDeadline()) - .status_code, - grpc::StatusCode::OUT_OF_RANGE); - EXPECT_EQ(arm->servo_j_calls, 0); -} - -TEST(RobotArmTeleopBackendTest, DetectsServoApplyTimeout) -{ - auto arm = std::make_shared(); - auto config = validConfig(); - config.set_max_apply_duration_us(500); - const auto backend = - makeRobotArmTeleopBackend(arm, config); - ASSERT_TRUE(backend->open(openRequest()).success); - arm->servo_sleep = std::chrono::microseconds(1500); - - const auto result = - backend->applySetpoint( - setpoint(0.1, 0.1), liveDeadline()); - EXPECT_FALSE(result.success); - EXPECT_EQ( - result.status_code, - grpc::StatusCode::DEADLINE_EXCEEDED); - EXPECT_EQ(arm->servo_j_calls, 1); -} - -TEST(RobotArmTeleopBackendTest, RejectsInsufficientDeadlineBudgetBeforeDispatch) -{ - auto arm = std::make_shared(); - const auto backend = - makeRobotArmTeleopBackend(arm, validConfig()); - ASSERT_TRUE(backend->open(openRequest()).success); - - const auto result = backend->applySetpoint( - setpoint(0.1, 0.1), - std::chrono::steady_clock::now() + - std::chrono::microseconds(100)); - EXPECT_FALSE(result.success); - EXPECT_EQ( - result.status_code, - grpc::StatusCode::DEADLINE_EXCEEDED); - EXPECT_EQ(arm->servo_j_calls, 0); -} - -TEST(RobotArmTeleopBackendTest, ExpiredDeadlineNeverDispatchesServoCommand) -{ - auto arm = std::make_shared(); - const auto backend = - makeRobotArmTeleopBackend(arm, validConfig()); - ASSERT_TRUE(backend->open(openRequest()).success); - - const auto result = backend->applySetpoint( - setpoint(0.1, 0.1), - std::chrono::steady_clock::now()); - EXPECT_FALSE(result.success); - EXPECT_EQ( - result.status_code, - grpc::StatusCode::DEADLINE_EXCEEDED); - EXPECT_EQ(arm->servo_j_calls, 0); -} - -TEST(RobotArmTeleopBackendTest, RejectsUnsupportedRateAndEarlyRedispatch) -{ - auto arm = std::make_shared(); - const auto backend = - makeRobotArmTeleopBackend(arm, validConfig()); - auto too_fast = openRequest(); - too_fast.set_requested_command_rate_hz(101); - EXPECT_EQ( - backend->open(too_fast).status_code, - grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ(arm->start_servo_calls, 0); - - ASSERT_TRUE(backend->open(openRequest()).success); - ASSERT_TRUE( - backend->applySetpoint( - setpoint(0.1, 0.1), liveDeadline()).success); - EXPECT_EQ( - backend->applySetpoint( - setpoint(0.105, 0.105), liveDeadline()).status_code, - grpc::StatusCode::RESOURCE_EXHAUSTED); - EXPECT_EQ(arm->servo_j_calls, 1); -} - -TEST(RobotArmTeleopBackendTest, SnapshotUsesCacheAndHidesUnverifiedEffort) -{ - auto arm = std::make_shared(); - const auto backend = - makeRobotArmTeleopBackend(arm, validConfig()); - ASSERT_TRUE(backend->open(openRequest()).success); - const int calls_after_open = arm->get_state_calls; - - const auto first = backend->snapshot(); - const auto second = backend->snapshot(); - EXPECT_EQ(arm->get_state_calls, calls_after_open); - EXPECT_TRUE(first.joint_state.position_valid()); - EXPECT_TRUE(first.joint_state.velocity_valid()); - EXPECT_FALSE(first.joint_state.effort_valid()); - EXPECT_EQ(first.joint_state.effort_nm_size(), 0); - EXPECT_EQ( - second.joint_state.effort_source(), - arm_teleop::EFFORT_SOURCE_UNSPECIFIED); -} - -TEST(RobotArmTeleopBackendTest, PublishesEffortOnlyWithExplicitSource) -{ - auto arm = std::make_shared(); - arm->effort_source = device::JointEffortSource::JointSensor; - const auto backend = - makeRobotArmTeleopBackend(arm, validConfig()); - ASSERT_TRUE(backend->open(openRequest()).success); - - const auto snapshot = backend->snapshot(); - EXPECT_TRUE(backend->supportsForceFeedback()); - EXPECT_TRUE(snapshot.joint_state.effort_valid()); - EXPECT_EQ(snapshot.joint_state.effort_nm_size(), 2); - EXPECT_EQ( - snapshot.joint_state.effort_source(), - arm_teleop::EFFORT_SOURCE_JOINT_SENSOR); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/grpc_security_test.cpp b/cmvr-es/service/grpc/server/tests/grpc_security_test.cpp deleted file mode 100644 index 17b1e1f7..00000000 --- a/cmvr-es/service/grpc/server/tests/grpc_security_test.cpp +++ /dev/null @@ -1,294 +0,0 @@ -#include "service/grpc/server/include/grpc_security.h" - -#include -#include -#include -#include - -#include -#include - -#include "cmvr/api/agv_service.pb.h" -#include "cmvr/api/arm_service.pb.h" -#include "cmvr/api/arm_teleop_v1.pb.h" -#include "cmvr/api/biohead_service.pb.h" -#include "cmvr/api/camera_service.pb.h" -#include "cmvr/api/dexhand_service.pb.h" -#include "cmvr/api/hlc_service.pb.h" -#include "cmvr/api/microphone_service.pb.h" -#include "cmvr/api/motor_service.pb.h" -#include "cmvr/api/speaker_service.pb.h" -#include "cmvr/api/system_service.pb.h" -#include "cmvr/api/test_service.pb.h" - -namespace cmvr::service { -namespace { - -GrpcMethodPolicy readPolicy() -{ - return { - "/cmvr.api.SystemService/GetSystemInfo", - GrpcAccessClass::Read, - GrpcRole::Observer}; -} - -GrpcMethodPolicy recoveryPolicy() -{ - return { - "/cmvr.api.SystemService/RecoverSafetyState", - GrpcAccessClass::Recover, - GrpcRole::SafetyAdmin}; -} - -class SafetyAdminProvider final : public GrpcAuthenticationProvider { -public: - GrpcAuthenticationResult authenticate(const GrpcCallFacts&) const override - { - GrpcPrincipal principal; - principal.id = "maintenance"; - principal.method = GrpcAuthenticationMethod::StaticToken; - principal.authenticated = true; - principal.roles = {GrpcRole::SafetyAdmin}; - return {std::move(principal), grpc::Status::OK}; - } -}; - -TEST(GrpcSecurityConfigTest, - LegacyConfigPreservesAnonymousAccessButDisablesRecovery) -{ - config::GRPCServerConfig config; - const auto result = resolveGrpcSecurityConfig(config, "0.0.0.0"); - - ASSERT_TRUE(result.valid) << result.error; - EXPECT_TRUE(result.config.legacy_compatibility); - EXPECT_TRUE(result.config.insecure_non_loopback); - EXPECT_EQ( - result.config.authentication, GrpcAuthenticationMethod::Disabled); - EXPECT_EQ( - result.config.recovery_exposure, GrpcRecoveryExposure::Disabled); - EXPECT_FALSE(result.warnings.empty()); -} - -TEST(GrpcSecurityConfigTest, - ExplicitNonLoopbackInsecureRequiresAcknowledgement) -{ - config::GRPCServerConfig config; - auto* security = config.mutable_security(); - security->set_transport_mode(config::GRPCSecurityConfig::INSECURE); - security->set_authentication_mode(config::GRPCSecurityConfig::DISABLED); - security->set_recovery_exposure( - config::GRPCSecurityConfig::RECOVERY_DISABLED); - - const auto rejected = resolveGrpcSecurityConfig(config, "0.0.0.0"); - EXPECT_FALSE(rejected.valid); - - security->set_allow_insecure_non_loopback(true); - const auto accepted = resolveGrpcSecurityConfig(config, "0.0.0.0"); - ASSERT_TRUE(accepted.valid) << accepted.error; - EXPECT_TRUE(accepted.config.insecure_non_loopback); -} - -TEST(GrpcSecurityConfigTest, - UnsupportedAuthenticationNeverFallsBackToDisabled) -{ - config::GRPCServerConfig config; - auto* security = config.mutable_security(); - security->set_transport_mode(config::GRPCSecurityConfig::INSECURE); - security->set_authentication_mode( - config::GRPCSecurityConfig::STATIC_TOKEN); - security->set_recovery_exposure( - config::GRPCSecurityConfig::RECOVERY_AUTHORIZED); - - const auto result = resolveGrpcSecurityConfig(config, "127.0.0.1"); - EXPECT_FALSE(result.valid); - EXPECT_NE(result.error.find("DISABLED"), std::string::npos); -} - -TEST(GrpcSecurityConfigTest, EnabledRecoveryRequiresPersistentAuditFile) -{ - config::GRPCServerConfig config; - auto* security = config.mutable_security(); - security->set_transport_mode(config::GRPCSecurityConfig::INSECURE); - security->set_authentication_mode(config::GRPCSecurityConfig::DISABLED); - security->set_recovery_exposure( - config::GRPCSecurityConfig::RECOVERY_LOCAL_ONLY); - - const auto rejected = - resolveGrpcSecurityConfig(config, "127.0.0.1"); - EXPECT_FALSE(rejected.valid); - EXPECT_NE(rejected.error.find("audit_file"), std::string::npos); - - security->set_audit_file("/var/lib/cmvr-es/recovery-audit.jsonl"); - const auto accepted = - resolveGrpcSecurityConfig(config, "127.0.0.1"); - ASSERT_TRUE(accepted.valid) << accepted.error; - EXPECT_EQ( - accepted.config.recovery_audit_file, - "/var/lib/cmvr-es/recovery-audit.jsonl"); -} - -TEST(GrpcSecurityGatewayTest, DisabledProviderDoesNotTrustIdentityMetadata) -{ - auto gateway = makeDefaultGrpcSecurityGateway(); - GrpcCallFacts facts; - facts.peer = "ipv4:10.0.0.5:12345"; - facts.metadata.emplace("principal", "safety-admin"); - facts.metadata.emplace("role", "SafetyAdmin"); - - const auto call = gateway->beginCall(std::move(facts), readPolicy()); - - ASSERT_TRUE(call.allowed()) << call.status().error_message(); - EXPECT_EQ(call.context().principal.id, "anonymous"); - EXPECT_FALSE(call.context().principal.authenticated); - ASSERT_EQ(call.context().principal.roles.size(), 1U); - EXPECT_EQ(call.context().principal.roles.front(), GrpcRole::Anonymous); -} - -TEST(GrpcSecurityGatewayTest, RecoveryIsDisabledBeforeLedgerAdmission) -{ - auto gateway = makeDefaultGrpcSecurityGateway(); - const auto call = gateway->beginCall(GrpcCallFacts{}, recoveryPolicy()); - - EXPECT_FALSE(call.allowed()); - EXPECT_EQ( - call.status().error_code(), grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ(call.status().error_message(), "RECOVERY_RPC_DISABLED"); -} - -TEST(GrpcSecurityGatewayTest, LocalOnlyRecoveryUsesActualPeerClassification) -{ - GrpcSecurityRuntimeConfig config; - config.recovery_exposure = GrpcRecoveryExposure::LocalOnly; - auto gateway = makeGrpcSecurityGateway(config); - - GrpcCallFacts remote; - remote.peer = "ipv4:192.168.1.20:42000"; - EXPECT_FALSE(gateway->beginCall(remote, recoveryPolicy()).allowed()); - - GrpcCallFacts local; - local.peer = "ipv4:127.0.0.1:42000"; - EXPECT_TRUE(gateway->beginCall(local, recoveryPolicy()).allowed()); - - EXPECT_TRUE(isLocalGrpcPeer("ipv6:[::1]")); - EXPECT_TRUE(isLocalGrpcPeer("unix:/run/cmvr-es.sock")); - EXPECT_FALSE(isLocalGrpcPeer("ipv4:10.0.0.1:50051")); -} - -TEST(GrpcSecurityGatewayTest, AuthorizedRecoveryAcceptsSafetyAdminProvider) -{ - GrpcSecurityRuntimeConfig config; - config.authentication = GrpcAuthenticationMethod::StaticToken; - config.recovery_exposure = GrpcRecoveryExposure::Authorized; - auto gateway = std::make_shared( - config, - std::make_shared(), - std::make_shared( - GrpcRecoveryExposure::Authorized)); - - const auto call = gateway->beginCall(GrpcCallFacts{}, recoveryPolicy()); - ASSERT_TRUE(call.allowed()) << call.status().error_message(); - EXPECT_EQ(call.context().principal.id, "maintenance"); -} - -TEST(GrpcSecurityGatewayTest, AuditUsesEffectiveServerPrincipal) -{ - std::vector records; - GrpcSecurityRuntimeConfig config; - auto gateway = makeGrpcSecurityGateway( - config, - [&records](const GrpcSecurityAuditRecord& record) { - records.push_back(record); - }); - - GrpcCallFacts facts; - facts.metadata.emplace("x-correlation-id", "request-42"); - ASSERT_TRUE(gateway->beginCall(std::move(facts), readPolicy()).allowed()); - - ASSERT_EQ(records.size(), 1U); - EXPECT_EQ(records.front().correlation_id, "request-42"); - EXPECT_EQ(records.front().principal_id, "anonymous"); - EXPECT_FALSE(records.front().authenticated); -} - -TEST(GrpcMethodPolicyRegistryTest, RejectsDuplicatesAndSortsSnapshot) -{ - GrpcMethodPolicyRegistry registry; - EXPECT_TRUE(registry.registerPolicy(recoveryPolicy())); - EXPECT_TRUE(registry.registerPolicy(readPolicy())); - EXPECT_FALSE(registry.registerPolicy(readPolicy())); - - const auto policies = registry.snapshot(); - ASSERT_EQ(policies.size(), 2U); - EXPECT_LT(policies[0].full_method_name, policies[1].full_method_name); - EXPECT_TRUE(registry.find(readPolicy().full_method_name).has_value()); - EXPECT_FALSE(registry.find("/unknown/method").has_value()); -} - -TEST(GrpcMethodPolicyRegistryTest, - DefaultRegistryCoversEveryCompiledApiMethod) -{ - const auto& registry = defaultGrpcMethodPolicyRegistry(); - const auto* pool = google::protobuf::DescriptorPool::generated_pool(); - const std::vector services{ - "cmvr.api.AgvService", - "cmvr.api.ArmService", - "cmvr.api.armteleop.v1.ArmTeleopService", - "cmvr.api.BioHeadService", - "cmvr.api.CameraService", - "cmvr.api.DexHandService", - "cmvr.api.HlcService", - "cmvr.api.MicPhoneService", - "cmvr.api.MotorService", - "cmvr.api.SpeakerService", - "cmvr.api.SystemService", - "cmvr.api.TestService"}; - - std::size_t method_count = 0; - for (const auto& service_name : services) { - const auto* service = pool->FindServiceByName(service_name); - ASSERT_NE(service, nullptr) << service_name; - for (int index = 0; index < service->method_count(); ++index) { - const auto* method = service->method(index); - const std::string full_name = - "/" + service_name + "/" + - std::string(method->name()); - const auto policy = registry.find(full_name); - ASSERT_TRUE(policy.has_value()) << full_name; - EXPECT_EQ( - policy->mutating, - policy->access != GrpcAccessClass::Read) << full_name; - if (policy->mutating) { - EXPECT_NE( - policy->command_intent, - safety::CommandIntent::Observe) << full_name; - } - ++method_count; - } - } - EXPECT_EQ(registry.snapshot().size(), method_count); -} - -TEST(GrpcMethodPolicyRegistryTest, - TouchIsAControlActuationRatherThanAReadOnlySensorCall) -{ - const auto policy = defaultGrpcMethodPolicyRegistry().find( - "/cmvr.api.HlcService/touch"); - ASSERT_TRUE(policy.has_value()); - EXPECT_EQ(policy->access, GrpcAccessClass::Mutate); - EXPECT_EQ(policy->command_intent, safety::CommandIntent::Actuate); - EXPECT_EQ(policy->policy_family, safety::SafetyPolicyFamily::Control); - EXPECT_TRUE(policy->mutating); - EXPECT_FALSE(policy->safety_lane); -} - -TEST(GrpcMethodPolicyRegistryTest, UnregisteredMethodFailsClosed) -{ - const auto call = beginRegisteredGrpcCall( - makeDefaultGrpcSecurityGateway(), nullptr, - "/cmvr.api.UnknownService/Mutate"); - EXPECT_FALSE(call.allowed()); - EXPECT_EQ(call.status().error_code(), grpc::StatusCode::INTERNAL); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/grpc_system_service_test.cpp b/cmvr-es/service/grpc/server/tests/grpc_system_service_test.cpp deleted file mode 100644 index 227355bd..00000000 --- a/cmvr-es/service/grpc/server/tests/grpc_system_service_test.cpp +++ /dev/null @@ -1,3612 +0,0 @@ -#include "service/grpc/server/include/grpc_system_service.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "cmvr/config/device_manager_config/device_manager_config.pb.h" -#include "cmvr/config/task_manager_config/task_manager_config.pb.h" -#include "devices/agv/abstract_agv.h" -#include "devices/arm/robot_arm.h" -#include "devices/camera/abstract_camera.h" -#include "devices/microphone/abstract_microphone.h" -#include "devices/speaker/abstract_speaker.h" -#include "manager/control_authority_manager/include/control_authority_manager.h" -#include "manager/device_manager/include/device_manager.h" -#include "manager/media_source_manager/include/device_media_source_adapter.h" -#include "manager/task_manager/include/task_manager.h" -#include "service/grpc/action/include/action_queue_executor.h" -#include "service/grpc/server/include/camera_operational_activity_registry.h" -#include "service/grpc/server/include/camera_ptz_activity_registry.h" -#include "service/grpc/server/include/grpc_camera_service.h" -#include "service/grpc/server/include/grpc_recovery_audit.h" -#include "service/grpc/server/include/grpc_security.h" -#include "service/grpc/server/include/media_activity_coordinator.h" -#include "service/grpc/server/include/motor_activity_coordinator.h" -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" -#include "task/task_factory.h" - -namespace cmvr::service { -namespace { - -class AllowAllAuthorizationPolicy final : public GrpcAuthorizationPolicy { -public: - GrpcAuthorizationDecision authorize( - const GrpcRequestContext&, - const GrpcMethodPolicy&) const override - { - return {true, grpc::Status::OK}; - } -}; - -class MemoryRecoveryAuditSink final : public RecoveryAuditSink { -public: - bool append( - const RecoveryAuditRecord& record, - std::string* error) noexcept override - { - if (fail) { - if (error) { - *error = "injected audit failure"; - } - return false; - } - records.push_back(record); - return true; - } - - bool fail{false}; - std::vector records; -}; - -std::shared_ptr makeAllowAllRecoveryGateway() -{ - GrpcSecurityRuntimeConfig config; - config.recovery_exposure = GrpcRecoveryExposure::LocalOnly; - return std::make_shared( - config, - std::make_shared(), - std::make_shared()); -} - -class SnapshotDevice final : public device::AbstractDevice { -public: - SnapshotDevice(std::string id, - device::DeviceKind kind, - std::string type_name, - device::DeviceHealthSnapshot health = {}) - : AbstractDevice(std::move(id)), - kind_(kind), - type_name_(std::move(type_name)), - health_(std::move(health)) - { - } - - device::DeviceKind kind() const noexcept override { return kind_; } - std::string typeName() const override { return type_name_; } - device::DeviceHealthSnapshot healthSnapshot() override - { - return health_; - } - bool stop() override - { - std::unique_lock lock(stop_mutex_); - ++stop_calls_; - if (block_next_stop_) { - block_next_stop_ = false; - stop_started_ = true; - stop_started_cv_.notify_all(); - stop_release_cv_.wait( - lock, - [this]() { return release_stop_; }); - } - return true; - } - int stopCalls() const - { - std::lock_guard lock(stop_mutex_); - return stop_calls_; - } - void blockNextStop() - { - std::lock_guard lock(stop_mutex_); - block_next_stop_ = true; - stop_started_ = false; - release_stop_ = false; - } - bool waitForStop(const std::chrono::milliseconds timeout) - { - std::unique_lock lock(stop_mutex_); - return stop_started_cv_.wait_for( - lock, timeout, [this]() { return stop_started_; }); - } - void releaseStop() - { - { - std::lock_guard lock(stop_mutex_); - release_stop_ = true; - } - stop_release_cv_.notify_all(); - } - -private: - device::DeviceKind kind_; - std::string type_name_; - device::DeviceHealthSnapshot health_; - mutable std::mutex stop_mutex_; - std::condition_variable stop_started_cv_; - std::condition_variable stop_release_cv_; - int stop_calls_{0}; - bool block_next_stop_{false}; - bool stop_started_{false}; - bool release_stop_{false}; -}; - -class StopAllTestCamera final : public device::AbstractCamera { -public: - StopAllTestCamera(std::string id, - const bool stop_clears_recording = true, - const bool stop_throws = false) - : stop_clears_recording_(stop_clears_recording), - stop_throws_(stop_throws) - { - id_ = std::move(id); - state_.is_initialized = true; - state_.is_recording = true; - } - - std::string typeName() const override { return "StopAllTestCamera"; } - - void getState(device::CameraState& state) override - { - std::lock_guard lock(mutex_); - state = state_; - } - - void stopRecording() override - { - { - std::lock_guard lock(mutex_); - ++stop_recording_calls_; - if (stop_throws_) { - stop_recording_condition_.notify_all(); - throw std::runtime_error( - "injected camera recording stop failure"); - } - if (stop_clears_recording_) { - state_.is_recording = false; - } - } - stop_recording_condition_.notify_all(); - } - - bool startOperationalActivity() override - { - std::lock_guard lock(mutex_); - operational_active_ = true; - return true; - } - - bool stopOperationalActivity() override - { - std::lock_guard lock(mutex_); - ++operational_stop_calls_; - if (state_.is_recording) { - return false; - } - operational_active_ = false; - return true; - } - - bool controlPtz(device::PtzCommand, - const bool stop, - int) override - { - std::lock_guard lock(mutex_); - ++ptz_calls_; - ptz_active_ = !stop; - return true; - } - - bool stop() override - { - std::lock_guard lock(mutex_); - ++lifecycle_stop_calls_; - return true; - } - - bool isRecording() const - { - std::lock_guard lock(mutex_); - return state_.is_recording; - } - - void setRecording(const bool recording) - { - std::lock_guard lock(mutex_); - state_.is_recording = recording; - } - - void startRecording(const std::string&) override - { - { - std::unique_lock lock(start_recording_control_mutex_); - if (block_next_start_recording_) { - block_next_start_recording_ = false; - start_recording_entered_ = true; - start_recording_entered_condition_.notify_all(); - start_recording_release_condition_.wait( - lock, [this] { return release_start_recording_; }); - } - } - { - std::lock_guard lock(mutex_); - state_.is_recording = true; - ++start_recording_calls_; - } - start_recording_condition_.notify_all(); - } - - void blockNextStartRecording() - { - std::lock_guard lock(start_recording_control_mutex_); - block_next_start_recording_ = true; - start_recording_entered_ = false; - release_start_recording_ = false; - } - - bool waitForStartRecordingEntered( - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(start_recording_control_mutex_); - return start_recording_entered_condition_.wait_for( - lock, timeout, [this] { return start_recording_entered_; }); - } - - void releaseBlockedStartRecording() - { - { - std::lock_guard lock(start_recording_control_mutex_); - release_start_recording_ = true; - } - start_recording_release_condition_.notify_all(); - } - - bool waitForStartRecordingCalls( - const int expected, - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return start_recording_condition_.wait_for( - lock, - timeout, - [this, expected] { - return start_recording_calls_ >= expected; - }); - } - - int stopRecordingCalls() const - { - std::lock_guard lock(mutex_); - return stop_recording_calls_; - } - - bool waitForStopRecordingCalls( - const int expected, - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return stop_recording_condition_.wait_for( - lock, - timeout, - [this, expected] { - return stop_recording_calls_ >= expected; - }); - } - - int lifecycleStopCalls() const - { - std::lock_guard lock(mutex_); - return lifecycle_stop_calls_; - } - - int operationalStopCalls() const - { - std::lock_guard lock(mutex_); - return operational_stop_calls_; - } - - bool operationalActive() const - { - std::lock_guard lock(mutex_); - return operational_active_; - } - - bool ptzActive() const - { - std::lock_guard lock(mutex_); - return ptz_active_; - } - - int ptzCalls() const - { - std::lock_guard lock(mutex_); - return ptz_calls_; - } - -private: - mutable std::mutex mutex_; - std::condition_variable stop_recording_condition_; - std::condition_variable start_recording_condition_; - mutable std::mutex start_recording_control_mutex_; - std::condition_variable start_recording_entered_condition_; - std::condition_variable start_recording_release_condition_; - int start_recording_calls_{0}; - int stop_recording_calls_{0}; - int lifecycle_stop_calls_{0}; - int operational_stop_calls_{0}; - int ptz_calls_{0}; - bool operational_active_{false}; - bool ptz_active_{false}; - bool block_next_start_recording_{false}; - bool start_recording_entered_{false}; - bool release_start_recording_{false}; - bool stop_clears_recording_{true}; - bool stop_throws_{false}; -}; - -class StopAllTestMicrophone final : public device::AbstractMicrophone { -public: - StopAllTestMicrophone(std::string id, - const bool stop_clears_recording = true, - const bool stop_throws = false) - : stop_clears_recording_(stop_clears_recording), - stop_throws_(stop_throws) - { - id_ = std::move(id); - state_.is_initialized = true; - state_.is_recording = true; - } - - std::string typeName() const override - { - return "StopAllTestMicrophone"; - } - - void getState(device::MicrophoneState& state) override - { - std::lock_guard lock(mutex_); - state = state_; - } - - void stopRecording() override - { - std::lock_guard lock(mutex_); - ++stop_recording_calls_; - if (stop_throws_) { - throw std::runtime_error( - "injected microphone recording stop failure"); - } - if (stop_clears_recording_) { - state_.is_recording = false; - } - } - - bool stop() override - { - std::lock_guard lock(mutex_); - ++lifecycle_stop_calls_; - return true; - } - - bool isRecording() const - { - std::lock_guard lock(mutex_); - return state_.is_recording; - } - - int stopRecordingCalls() const - { - std::lock_guard lock(mutex_); - return stop_recording_calls_; - } - - int lifecycleStopCalls() const - { - std::lock_guard lock(mutex_); - return lifecycle_stop_calls_; - } - -private: - mutable std::mutex mutex_; - int stop_recording_calls_{0}; - int lifecycle_stop_calls_{0}; - bool stop_clears_recording_{true}; - bool stop_throws_{false}; -}; - -class StopAllTestSpeaker final : public device::AbstractSpeaker { -public: - explicit StopAllTestSpeaker(std::string id, - const bool playback_stop_result = true) - : playback_stop_result_(playback_stop_result) - { - id_ = std::move(id); - state_.is_initialized = true; - state_.is_running = true; - state_.is_decoding = true; - } - - std::string typeName() const override { return "StopAllTestSpeaker"; } - - void getState(device::SpeakerState& state) override - { - std::lock_guard lock(mutex_); - state = state_; - } - - bool stopPlayback() override - { - std::lock_guard lock(mutex_); - ++stop_playback_calls_; - if (playback_stop_result_) { - state_.is_running = false; - state_.is_decoding = false; - } - return playback_stop_result_; - } - - bool stop() override - { - std::lock_guard lock(mutex_); - ++lifecycle_stop_calls_; - return true; - } - - int stopPlaybackCalls() const - { - std::lock_guard lock(mutex_); - return stop_playback_calls_; - } - - int lifecycleStopCalls() const - { - std::lock_guard lock(mutex_); - return lifecycle_stop_calls_; - } - -private: - mutable std::mutex mutex_; - int stop_playback_calls_{0}; - int lifecycle_stop_calls_{0}; - bool playback_stop_result_{true}; -}; - -class BlockingStopTask final : public task::Task { -public: - explicit BlockingStopTask(std::string id) - : id_(std::move(id)) - { - } - - const std::string& id() const override { return id_; } - task::TaskRunMode runMode() const override - { - return task::TaskRunMode::BLOCKING_SERVICE; - } - bool init() override { return true; } - bool step(double) override { return true; } - void stop() override { lifecycle_stop_calls_.fetch_add(1); } - bool stopActivity() override - { - std::unique_lock lock(mutex_); - ++stop_activity_calls_; - stop_entered_ = true; - condition_.notify_all(); - condition_.wait(lock, [this] { return release_stop_; }); - return true; - } - task::TaskState state() const override - { - return task::TaskState::IDLE; - } - bool isBusy() const override { return false; } - bool isFinished() const override { return false; } - bool isFailed() const override { return false; } - std::string stateString() const override { return "IDLE"; } - std::string detailStatusString() const override { return "IDLE"; } - - bool waitForStopActivity(const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return condition_.wait_for( - lock, timeout, [this] { return stop_entered_; }); - } - - void releaseStopActivity() - { - { - std::lock_guard lock(mutex_); - release_stop_ = true; - } - condition_.notify_all(); - } - - int stopActivityCalls() const - { - std::lock_guard lock(mutex_); - return stop_activity_calls_; - } - - int lifecycleStopCalls() const - { - return lifecycle_stop_calls_.load(); - } - -private: - std::string id_; - mutable std::mutex mutex_; - std::condition_variable condition_; - std::atomic lifecycle_stop_calls_{0}; - int stop_activity_calls_{0}; - bool stop_entered_{false}; - bool release_stop_{false}; -}; - -std::shared_ptr blocking_stop_task; - -class ActionTrace final { -public: - using TimePoint = std::chrono::steady_clock::time_point; - - struct Entry { - std::string name; - TimePoint time; - }; - - void add(std::string name) - { - std::lock_guard lock(mutex_); - entries_.push_back({std::move(name), std::chrono::steady_clock::now()}); - } - - std::vector names() const - { - std::lock_guard lock(mutex_); - std::vector result; - result.reserve(entries_.size()); - for (const auto& entry : entries_) { - result.push_back(entry.name); - } - return result; - } - - std::optional firstTime(const std::string& name) const - { - std::lock_guard lock(mutex_); - const auto found = std::find_if( - entries_.begin(), entries_.end(), - [&name](const Entry& entry) { return entry.name == name; }); - return found == entries_.end() - ? std::nullopt - : std::optional(found->time); - } - -private: - mutable std::mutex mutex_; - std::vector entries_; -}; - -class ActionTestArm final : public device::RobotArm { -public: - ActionTestArm(std::string id, std::shared_ptr trace) - : trace_(std::move(trace)) - { - id_ = std::move(id); - } - - std::string typeName() const override { return "ActionTestArm"; } - bool stop() override - { - lifecycle_stop_calls_.fetch_add(1, std::memory_order_relaxed); - return true; - } - device::DeviceHealthSnapshot healthSnapshot() override - { - std::unique_lock lock(health_mutex_); - ++health_snapshot_calls_; - health_snapshot_entered_ = true; - health_condition_.notify_all(); - health_condition_.wait( - lock, [this] { return !block_health_snapshot_; }); - return {device::DeviceHealthState::Healthy, {}}; - } - bool supportsActionQueueMotion() const noexcept override { return true; } - device::RobotModel getRobotModel() const override - { - device::RobotModel model; - model.name = "ActionTestArm"; - model.dof = kDof; - model.joint_names.assign(kDof, "joint"); - return model; - } - std::size_t getDof() const override { return kDof; } - device::ArmState getRobotState() const override - { - std::lock_guard lock(mutex_); - auto state = reported_state_; - state.moving = state.moving || active_motions_ != 0; - return state; - } - device::JointGroupState getJointState() const override { return {}; } - device::CartesianPose getTcpPose( - device::FrameType = device::FrameType::Base) const override - { - return {}; - } - device::RobotMode getRobotMode() const override - { - return device::RobotMode::Idle; - } - device::SafetyMode getSafetyMode() const override - { - return device::SafetyMode::Normal; - } - device::ControlMode getControlMode() const override - { - return device::ControlMode::Position; - } - - device::Result torqueOn() override { return device::Result::success(); } - device::Result torqueOff() override { return device::Result::success(); } - device::Result calibrateZeroQ(const std::string&) override - { - return device::Result::success(); - } - device::Result emergencyStop() override - { - return device::Result::success(); - } - device::Result protectiveStop() override - { - return device::Result::success(); - } - device::Result setSpeedScaling(double) override - { - return device::Result::success(); - } - double getSpeedScaling() const override { return 1.0; } - bool isProtectiveStopped() const override { return false; } - bool isEmergencyStopped() const override { return false; } - bool isFault() const override { return false; } - - device::Result moveJ(const device::JointPositionCommand&, - const device::MotionOptions& options) override - { - return performMotion("arm:J", options); - } - device::Result speedJ(const device::JointVelocityCommand&, - double, - double) override - { - return device::Result::success(); - } - device::Result stopJ(double) override { return stopMotion(); } - device::Result moveL( - const device::CartesianPose& target, - const device::MotionOptions& options, - device::FrameType = device::FrameType::Base) override - { - return performMotion( - "arm:L:" + std::to_string(static_cast(target.x)), - options); - } - device::Result speedL( - const device::CartesianVelocity&, - double, - double, - device::FrameType = device::FrameType::Base) override - { - return device::Result::success(); - } - device::Result stopL(std::optional = std::nullopt) override - { - return stopMotion(); - } - device::Result stopMotion() override - { - bool fail = false; - { - std::unique_lock lock(mutex_); - ++stop_motion_calls_; - stop_requested_ = true; - fail = stop_motion_fails_; - motion_condition_.notify_all(); - if (block_next_stop_motion_) { - block_next_stop_motion_ = false; - stop_motion_blocked_ = true; - stop_motion_blocked_condition_.notify_all(); - stop_motion_release_condition_.wait( - lock, - [this]() { return release_blocked_stop_motion_; }); - } - } - trace_->add("arm:stop:" + id_); - motion_condition_.notify_all(); - return fail - ? device::Result::failure( - device::ArmErrorCode::CommandFailed, - "injected RobotArm stop failure") - : device::Result::success(); - } - - device::Result startServoMode(const device::ServoOptions&) override - { - return device::Result::success(); - } - device::Result servoJ(const device::JointPositionCommand&) override - { - return device::Result::success(); - } - device::Result servoL( - const device::CartesianPose&, - device::FrameType = device::FrameType::Base) override - { - return device::Result::success(); - } - device::Result servoSpeedJ( - const device::JointVelocityCommand&) override - { - return device::Result::success(); - } - device::Result servoSpeedL( - const device::CartesianVelocity&, - device::FrameType = device::FrameType::Base) override - { - return device::Result::success(); - } - device::Result stopServoMode() override - { - return device::Result::success(); - } - - device::Result connect(const std::string&, int) override - { - return device::Result::success(); - } - device::Result disconnect() override { return device::Result::success(); } - bool isConnected() const override { return true; } - device::Result powerOn() override { return device::Result::success(); } - device::Result powerOff() override { return device::Result::success(); } - device::Result brakeRelease() override { return device::Result::success(); } - device::Result shutdown() override - { - shutdown_calls_.fetch_add(1, std::memory_order_relaxed); - return device::Result::success(); - } - device::Result clearFault() override - { - std::lock_guard lock(mutex_); - ++clear_fault_calls_; - reported_state_.connected = true; - reported_state_.powered_on = true; - reported_state_.moving = false; - reported_state_.program_running = false; - reported_state_.fault = false; - reported_state_.emergency_stopped = false; - reported_state_.protective_stopped = false; - return device::Result::success(); - } - device::Result unlockProtectiveStop() override - { - return device::Result::success(); - } - device::Result loadProgram(const std::string&) override - { - return device::Result::success(); - } - device::Result playProgram() override { return device::Result::success(); } - device::Result pauseProgram() override { return device::Result::success(); } - device::Result stopProgram() override { return device::Result::success(); } - std::vector ik(const std::string&, - const std::string&, - const device::CartesianPose&) override - { - return {}; - } - std::shared_ptr kinematicsSolver() const override - { - return nullptr; - } - device::CartesianPose fk(const std::string&, - const std::string&) override - { - return {}; - } - device::CartesianPose fk(bool = true) override { return {}; } - device::CartesianVelocity getSpeedLCommandTwistBase() const override - { - return {}; - } - bool busy() const override - { - std::lock_guard lock(mutex_); - if (busy_throws_after_stop_ && stop_motion_calls_ != 0) { - throw std::runtime_error( - "injected RobotArm busy-state failure"); - } - return active_motions_ != 0; - } - - void blockNextMotion() - { - std::lock_guard lock(mutex_); - block_next_motion_ = true; - release_blocked_motion_ = false; - stop_requested_ = false; - } - - void blockCanceledMotionReturn() - { - std::lock_guard lock(mutex_); - block_canceled_motion_return_ = true; - canceled_motion_return_blocked_ = false; - release_canceled_motion_return_ = false; - } - - bool waitForCanceledMotionReturn( - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return canceled_motion_return_condition_.wait_for( - lock, - timeout, - [this]() { return canceled_motion_return_blocked_; }); - } - - void releaseCanceledMotionReturn() - { - { - std::lock_guard lock(mutex_); - release_canceled_motion_return_ = true; - } - motion_condition_.notify_all(); - } - - void releaseBlockedMotion() - { - { - std::lock_guard lock(mutex_); - release_blocked_motion_ = true; - } - motion_condition_.notify_all(); - } - - void failOnMotionCall(const int call_index) - { - std::lock_guard lock(mutex_); - fail_on_motion_call_ = call_index; - } - - void failStopAndBusyConfirmation() - { - std::lock_guard lock(mutex_); - stop_motion_fails_ = true; - busy_throws_after_stop_ = true; - } - - void blockNextStopMotion() - { - std::lock_guard lock(mutex_); - block_next_stop_motion_ = true; - stop_motion_blocked_ = false; - release_blocked_stop_motion_ = false; - } - - bool waitForBlockedStopMotion( - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return stop_motion_blocked_condition_.wait_for( - lock, timeout, [this]() { return stop_motion_blocked_; }); - } - - void releaseBlockedStopMotion() - { - { - std::lock_guard lock(mutex_); - release_blocked_stop_motion_ = true; - } - stop_motion_release_condition_.notify_all(); - } - - bool waitForMotionCalls( - const int expected, - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return motion_started_condition_.wait_for( - lock, timeout, - [this, expected]() { return motion_calls_ >= expected; }); - } - - int motionCalls() const - { - std::lock_guard lock(mutex_); - return motion_calls_; - } - - int stopMotionCalls() const - { - std::lock_guard lock(mutex_); - return stop_motion_calls_; - } - - int lifecycleStopCalls() const - { - return lifecycle_stop_calls_.load(std::memory_order_relaxed); - } - - int shutdownCalls() const - { - return shutdown_calls_.load(std::memory_order_relaxed); - } - - int clearFaultCalls() const - { - std::lock_guard lock(mutex_); - return clear_fault_calls_; - } - - void setReportedState(const device::ArmState& state) - { - std::lock_guard lock(mutex_); - reported_state_ = state; - } - - void blockHealthSnapshot() - { - std::lock_guard lock(health_mutex_); - block_health_snapshot_ = true; - health_snapshot_entered_ = false; - } - - bool waitForHealthSnapshot( - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(health_mutex_); - return health_condition_.wait_for( - lock, timeout, [this] { return health_snapshot_entered_; }); - } - - void releaseHealthSnapshot() - { - { - std::lock_guard lock(health_mutex_); - block_health_snapshot_ = false; - } - health_condition_.notify_all(); - } - - int healthSnapshotCalls() const - { - std::lock_guard lock(health_mutex_); - return health_snapshot_calls_; - } - - bool waitForStopMotionCalls( - const int expected, - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return motion_condition_.wait_for( - lock, timeout, - [this, expected]() { return stop_motion_calls_ >= expected; }); - } - - int maxActiveMotions() const - { - std::lock_guard lock(mutex_); - return max_active_motions_; - } - -private: - device::Result performMotion( - const std::string& event, - const device::MotionOptions& options) - { - bool block = false; - bool fail = false; - { - std::lock_guard lock(mutex_); - ++motion_calls_; - ++active_motions_; - max_active_motions_ = std::max( - max_active_motions_, active_motions_); - block = block_next_motion_; - block_next_motion_ = false; - fail = motion_calls_ == fail_on_motion_call_; - } - trace_->add(event); - motion_started_condition_.notify_all(); - - bool canceled = false; - bool safety_timeout = false; - if (block) { - const auto safety_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - std::unique_lock lock(mutex_); - while (!release_blocked_motion_ && !stop_requested_ && - !(options.cancellation_requested && - options.cancellation_requested())) { - if (std::chrono::steady_clock::now() >= safety_deadline) { - safety_timeout = true; - break; - } - motion_condition_.wait_for(lock, std::chrono::milliseconds(1)); - } - canceled = stop_requested_ || - (options.cancellation_requested && - options.cancellation_requested()); - } - - { - std::unique_lock lock(mutex_); - --active_motions_; - if (canceled && block_canceled_motion_return_) { - block_canceled_motion_return_ = false; - canceled_motion_return_blocked_ = true; - canceled_motion_return_condition_.notify_all(); - motion_condition_.wait( - lock, - [this]() { return release_canceled_motion_return_; }); - } - } - if (safety_timeout) { - return device::Result::failure( - device::ArmErrorCode::Timeout, - "test arm safety wait expired"); - } - if (canceled) { - return device::Result::failure( - device::ArmErrorCode::CommandRejected, - "test arm motion canceled"); - } - if (fail) { - return device::Result::failure( - device::ArmErrorCode::CommandFailed, - "injected RobotArm failure"); - } - return device::Result::success(); - } - - static constexpr std::size_t kDof = 6U; - std::shared_ptr trace_; - mutable std::mutex mutex_; - std::condition_variable motion_condition_; - std::condition_variable motion_started_condition_; - std::condition_variable canceled_motion_return_condition_; - std::condition_variable stop_motion_blocked_condition_; - std::condition_variable stop_motion_release_condition_; - mutable std::mutex health_mutex_; - std::condition_variable health_condition_; - std::atomic lifecycle_stop_calls_{0}; - std::atomic shutdown_calls_{0}; - int motion_calls_{0}; - int stop_motion_calls_{0}; - int active_motions_{0}; - int max_active_motions_{0}; - int fail_on_motion_call_{-1}; - bool block_next_motion_{false}; - bool release_blocked_motion_{false}; - bool stop_requested_{false}; - bool block_canceled_motion_return_{false}; - bool canceled_motion_return_blocked_{false}; - bool release_canceled_motion_return_{false}; - bool stop_motion_fails_{false}; - bool busy_throws_after_stop_{false}; - bool block_next_stop_motion_{false}; - bool stop_motion_blocked_{false}; - bool release_blocked_stop_motion_{false}; - int health_snapshot_calls_{0}; - bool block_health_snapshot_{false}; - bool health_snapshot_entered_{false}; - device::ArmState reported_state_{}; - int clear_fault_calls_{0}; -}; - -class ActionTestAgv final : public device::AbstractAGV { -public: - ActionTestAgv(std::string id, std::shared_ptr trace) - : trace_(std::move(trace)) - { - id_ = std::move(id); - } - - std::string typeName() const override { return "ActionTestAgv"; } - bool supportsSynchronousAction(device::AgvActionKind) const noexcept override - { - return supports_synchronous_.load(std::memory_order_acquire); - } - device::AgvRuntimeState runtimeState() const override { return {}; } - device::AgvNavigationStatus navigationStatus() const override { return {}; } - device::AgvResult navigateToPose( - const math::Pose2d& pose, - const device::AgvMotionOptions&, - const device::AgvAdapterParams&) override - { - { - std::lock_guard lock(parameters_mutex_); - last_pose_ = pose; - } - return record("agv:pose"); - } - device::AgvResult navigateToStation( - const std::string& station_id, - const device::AgvMotionOptions&, - const device::AgvAdapterParams&) override - { - return record("agv:station:" + station_id); - } - device::AgvResult followPath( - const std::vector& path, - const device::AgvMotionOptions&) override - { - { - std::lock_guard lock(parameters_mutex_); - last_path_ = path; - } - return record("agv:path"); - } - device::AgvResult cancelNavigation() override - { - cancel_calls_.fetch_add(1, std::memory_order_relaxed); - trace_->add("agv:cancel"); - return device::AgvResult::success(); - } - device::AgvResult confirmMotionStopped() override - { - return stopped_confirmed_.load(std::memory_order_acquire) - ? device::AgvResult::success() - : device::AgvResult::failure( - device::AgvErrorCode::Timeout, - "test AGV stopped state is unconfirmed"); - } - void setSupportsSynchronous(const bool value) - { - supports_synchronous_.store(value, std::memory_order_release); - } - - void setNavigationFailure(const bool value) - { - fail_navigation_.store(value, std::memory_order_release); - } - - void setStoppedConfirmed(const bool value) - { - stopped_confirmed_.store(value, std::memory_order_release); - } - - int navigationCalls() const - { - return navigation_calls_.load(std::memory_order_relaxed); - } - - math::Pose2d lastPose() const - { - std::lock_guard lock(parameters_mutex_); - return last_pose_; - } - - std::vector lastPath() const - { - std::lock_guard lock(parameters_mutex_); - return last_path_; - } - -private: - device::AgvResult record(std::string event) - { - navigation_calls_.fetch_add(1, std::memory_order_relaxed); - trace_->add(std::move(event)); - if (fail_navigation_.load(std::memory_order_acquire)) { - return device::AgvResult::failure( - device::AgvErrorCode::TaskFailed, - "injected AGV navigation failure"); - } - return device::AgvResult::success(); - } - - std::shared_ptr trace_; - mutable std::mutex parameters_mutex_; - math::Pose2d last_pose_{}; - std::vector last_path_; - std::atomic supports_synchronous_{true}; - std::atomic fail_navigation_{false}; - std::atomic stopped_confirmed_{true}; - std::atomic navigation_calls_{0}; - std::atomic cancel_calls_{0}; -}; - -api::ActionStep* addMoveLStep( - api::ActionQueueCommand_Request& request, - const std::string& step_id, - const std::string& device_id, - const double marker, - const std::uint32_t timeout_ms = 0U, - const bool asynchronous = false) -{ - auto* step = request.add_steps(); - step->set_step_id(step_id); - step->set_timeout_ms(timeout_ms); - auto* command = step->mutable_arm_move_l(); - command->mutable_header()->set_device_id(device_id); - command->mutable_target()->set_x(marker); - command->set_frame(api::ARM_FRAME_BASE); - command->mutable_options()->set_asynchronous(asynchronous); - return step; -} - -api::ActionStep* addMoveJStep( - api::ActionQueueCommand_Request& request, - const std::string& step_id, - const std::string& device_id, - const bool asynchronous = false) -{ - auto* step = request.add_steps(); - step->set_step_id(step_id); - auto* command = step->mutable_arm_move_j(); - command->mutable_header()->set_device_id(device_id); - for (std::size_t index = 0; index < 6U; ++index) { - command->mutable_target()->add_position( - static_cast(index) * 0.1); - } - command->mutable_options()->set_asynchronous(asynchronous); - return step; -} - -api::ActionStep* addAgvStationStep( - api::ActionQueueCommand_Request& request, - const std::string& step_id, - const std::string& device_id, - const std::string& station_id, - const bool asynchronous = false) -{ - auto* step = request.add_steps(); - step->set_step_id(step_id); - auto* command = step->mutable_agv_navigate_to_station(); - command->mutable_header()->set_device_id(device_id); - command->set_station_id(station_id); - command->mutable_options()->set_asynchronous(asynchronous); - return step; -} - -api::ActionStep* addAgvPoseStep( - api::ActionQueueCommand_Request& request, - const std::string& step_id, - const std::string& device_id, - const double x, - const double y, - const double theta) -{ - auto* step = request.add_steps(); - step->set_step_id(step_id); - auto* command = step->mutable_agv_navigate_to_pose(); - command->mutable_header()->set_device_id(device_id); - command->mutable_pose()->set_x(x); - command->mutable_pose()->set_y(y); - command->mutable_pose()->set_theta(theta); - return step; -} - -api::ActionStep* addAgvPathStep( - api::ActionQueueCommand_Request& request, - const std::string& step_id, - const std::string& device_id) -{ - auto* step = request.add_steps(); - step->set_step_id(step_id); - auto* command = step->mutable_agv_follow_path(); - command->mutable_header()->set_device_id(device_id); - auto* first = command->add_path(); - first->set_source_station("start"); - first->set_target_station("middle"); - auto* second = command->add_path(); - second->set_source_station("middle"); - second->set_target_station("finish"); - return step; -} - -api::ActionStep* addDelayStep( - api::ActionQueueCommand_Request& request, - const std::string& step_id, - const std::uint32_t duration_ms) -{ - auto* step = request.add_steps(); - step->set_step_id(step_id); - step->mutable_delay()->set_duration_ms(duration_ms); - return step; -} - -std::uint64_t currentUnixTimeMs() -{ - const auto elapsed = std::chrono::duration_cast( - std::chrono::system_clock::now().time_since_epoch()); - return static_cast(elapsed.count()); -} - -const api::SystemDeviceInfo* findDevice( - const api::GetDeviceListCommand_Feedback& response, - const std::string& id) -{ - for (const auto& device : response.device_list()) { - if (device.device_id() == id) { - return &device; - } - } - return nullptr; -} - -const api::SafetyOperationTargetResult* findSafetyTarget( - const api::StopAllCommand_Feedback& response, - const std::string& id) -{ - for (const auto& target : response.targets()) { - if (target.target_id() == id) { - return ⌖ - } - } - return nullptr; -} - -const api::SafetyOperationTargetResult* findSafetyTarget( - const api::RestoreOperationalStateCommand_Feedback& response, - const std::string& id) -{ - for (const auto& target : response.targets()) { - if (target.target_id() == id) { - return ⌖ - } - } - return nullptr; -} - -class GrpcSystemServiceTest : public ::testing::Test { -protected: - void SetUp() override - { - task::TaskManager::destroyInstance(); - blocking_stop_task.reset(); - (void)media::globalMediaSourceManager().stopAllSources(); - control::ControlAuthorityManager::instance().clear(); - globalStopAllAdmissionGate().clearForTesting(); - globalCameraOperationalActivityRegistry().clearForTesting(); - globalCameraPtzActivityRegistry().clearForTesting(); - globalMediaActivityCoordinator().clearForTesting(); - globalMotorActivityCoordinator().clearForTesting(); - device::DeviceManager::destroyInstance(); - } - - void TearDown() override - { - if (blocking_stop_task) { - blocking_stop_task->releaseStopActivity(); - } - service_.reset(); - task::TaskManager::destroyInstance(); - blocking_stop_task.reset(); - action_agv_.reset(); - action_arm_.reset(); - action_trace_.reset(); - owned_devices_.clear(); - device::DeviceManager::destroyInstance(); - control::ControlAuthorityManager::instance().clear(); - globalStopAllAdmissionGate().clearForTesting(); - globalCameraOperationalActivityRegistry().clearForTesting(); - globalCameraPtzActivityRegistry().clearForTesting(); - globalMediaActivityCoordinator().clearForTesting(); - globalMotorActivityCoordinator().clearForTesting(); - (void)media::globalMediaSourceManager().stopAllSources(); - } - - api::GetDeviceListCommand_Feedback getDeviceList() - { - api::GetDeviceListCommand_Request request; - api::GetDeviceListCommand_Feedback response; - grpc::ServerContext context; - - const auto status = service_->GetDeviceList( - &context, &request, &response); - EXPECT_TRUE(status.ok()) << status.error_message(); - return response; - } - - void registerDevice(device::DeviceManager& manager, - std::shared_ptr device) - { - manager.registerDevice(device); - owned_devices_.push_back(std::move(device)); - } - - void initializeActionDevices() - { - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - action_trace_ = std::make_shared(); - action_arm_ = std::make_shared( - "action-arm", action_trace_); - action_agv_ = std::make_shared( - "action-agv", action_trace_); - manager.registerDevice(action_arm_); - manager.registerDevice(action_agv_); - service_ = std::make_unique(); - api::GetSystemInfoCommand_Request info_request; - api::GetSystemInfoCommand_Feedback info_response; - grpc::ServerContext info_context; - const auto info_status = service_->GetSystemInfo( - &info_context, &info_request, &info_response); - ASSERT_TRUE(info_status.ok()) << info_status.error_message(); - service_instance_id_ = info_response.action_service_instance_id(); - ASSERT_FALSE(service_instance_id_.empty()); - } - - api::ActionQueueCommand_Feedback executeAction( - const api::ActionQueueCommand_Request& request) - { - auto bound_request = request; - if (bound_request.expected_service_instance_id().empty()) { - bound_request.set_expected_service_instance_id( - service_instance_id_); - } - api::ActionQueueCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->ExecuteActionQueue( - &context, &bound_request, &response); - EXPECT_TRUE(status.ok()) << status.error_message(); - return response; - } - - std::unique_ptr service_; - std::vector> owned_devices_; - std::shared_ptr action_trace_; - std::shared_ptr action_arm_; - std::shared_ptr action_agv_; - std::string service_instance_id_; -}; - -TEST_F(GrpcSystemServiceTest, - ReturnsOnlyEnabledDevicesAndPreservesEnabledErrors) -{ - config::DeviceManagerConfig config; - config.set_name("system-service-test"); - config.set_version("9.2"); - config.set_description("GetDeviceList snapshot test"); - - auto* disabled = config.add_devices(); - disabled->set_id("b_disabled_camera"); - disabled->set_type(config::DeviceConfigEntry::DEVICE_TYPE_CAMERA); - disabled->set_enable(false); - - // An enabled unsupported entry remains in the manager snapshot as ERROR. - // GetDeviceList must expose it rather than filtering by lifecycle state. - auto* enabled_error = config.add_devices(); - enabled_error->set_id("c_enabled_error"); - enabled_error->set_type(config::DeviceConfigEntry::DEVICE_TYPE_UNKNOWN); - enabled_error->set_enable(true); - - auto& manager = device::DeviceManager::getInstance(config); - registerDevice( - manager, - std::make_shared( - "z_camera", - device::DeviceKind::Camera, - "VendorCamera", - device::DeviceHealthSnapshot{ - device::DeviceHealthState::Healthy, {}})); - registerDevice( - manager, - std::make_shared( - "a_unknown", - device::DeviceKind::Unknown, - "MysteryDriver", - device::DeviceHealthSnapshot{ - device::DeviceHealthState::Degraded, - "device health is degraded"})); - service_ = std::make_unique(); - - const auto response = getDeviceList(); - - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_TRUE(response.header().has_timestamp()); - EXPECT_GT(response.header().timestamp().seconds(), 0); - EXPECT_EQ(response.manager_name(), "system-service-test"); - EXPECT_EQ(response.manager_version(), "9.2"); - EXPECT_EQ(response.manager_description(), "GetDeviceList snapshot test"); - ASSERT_EQ(response.device_list_size(), 3); - - // DeviceManager::snapshot() supplies stable device-id ordering, and the - // service must preserve it while filtering disabled entries. - EXPECT_EQ(response.device_list(0).device_id(), "a_unknown"); - EXPECT_EQ(response.device_list(1).device_id(), "c_enabled_error"); - EXPECT_EQ(response.device_list(2).device_id(), "z_camera"); - EXPECT_EQ(findDevice(response, "b_disabled_camera"), nullptr); - - const auto* unknown = findDevice(response, "a_unknown"); - ASSERT_NE(unknown, nullptr); - EXPECT_TRUE(unknown->enabled()); - EXPECT_EQ(unknown->type_name(), "MysteryDriver"); - EXPECT_EQ(unknown->device_type(), - api::SYSTEM_DEVICE_TYPE_UNSPECIFIED); - EXPECT_NE(unknown->device_type(), api::SYSTEM_DEVICE_TYPE_AGV); - EXPECT_EQ(unknown->manager_state(), - api::SYSTEM_DEVICE_STATE_REGISTERED); - EXPECT_EQ(unknown->health(), api::SYSTEM_DEVICE_HEALTH_DEGRADED); - EXPECT_TRUE(unknown->has_error()); - EXPECT_EQ(unknown->error_message(), "device health is degraded"); - EXPECT_GT(unknown->status_updated_at_unix_ms(), 0U); - - const auto* error = findDevice(response, "c_enabled_error"); - ASSERT_NE(error, nullptr); - EXPECT_TRUE(error->enabled()); - EXPECT_EQ(error->type_name(), "Unknown"); - EXPECT_EQ(error->device_type(), api::SYSTEM_DEVICE_TYPE_UNSPECIFIED); - EXPECT_EQ(error->manager_state(), api::SYSTEM_DEVICE_STATE_ERROR); - EXPECT_EQ(error->health(), api::SYSTEM_DEVICE_HEALTH_UNSPECIFIED); - EXPECT_TRUE(error->has_error()); - EXPECT_FALSE(error->error_message().empty()); - EXPECT_GT(error->status_updated_at_unix_ms(), 0U); - - const auto* camera = findDevice(response, "z_camera"); - ASSERT_NE(camera, nullptr); - EXPECT_TRUE(camera->enabled()); - EXPECT_EQ(camera->type_name(), "VendorCamera"); - EXPECT_EQ(camera->device_type(), api::SYSTEM_DEVICE_TYPE_CAMERA); - EXPECT_EQ(camera->manager_state(), - api::SYSTEM_DEVICE_STATE_REGISTERED); - EXPECT_EQ(camera->health(), api::SYSTEM_DEVICE_HEALTH_HEALTHY); - EXPECT_FALSE(camera->has_error()); - EXPECT_TRUE(camera->error_message().empty()); - EXPECT_GT(camera->status_updated_at_unix_ms(), 0U); -} - -TEST_F(GrpcSystemServiceTest, EmptyListReturnsMetadataAndTimestamps) -{ - config::DeviceManagerConfig config; - config.set_name("empty-manager"); - config.set_version("1.2.3"); - config.set_description("manager without devices"); - device::DeviceManager::getInstance(config); - service_ = std::make_unique(); - - const auto before_ms = currentUnixTimeMs(); - const auto response = getDeviceList(); - const auto after_ms = currentUnixTimeMs(); - - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_TRUE(response.header().has_timestamp()); - EXPECT_GT(response.header().timestamp().seconds(), 0); - EXPECT_EQ(response.device_list_size(), 0); - EXPECT_EQ(response.manager_name(), "empty-manager"); - EXPECT_EQ(response.manager_version(), "1.2.3"); - EXPECT_EQ(response.manager_description(), "manager without devices"); - EXPECT_GE(response.sampled_at_unix_ms(), before_ms); - EXPECT_LE(response.sampled_at_unix_ms(), after_ms); -} - -TEST_F(GrpcSystemServiceTest, SafetyStateUsesCoordinatorMemorySnapshot) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - registerDevice( - manager, - std::make_shared( - "safety-camera", - device::DeviceKind::Camera, - "SafetyCamera", - device::DeviceHealthSnapshot{ - device::DeviceHealthState::Healthy, {}})); - service_ = std::make_unique(); - - api::GetSafetyStateCommand_Request request; - api::GetSafetyStateCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->GetSafetyState( - &context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_FALSE(response.control_service_instance_id().empty()); - EXPECT_EQ( - response.header().service_instance_id(), - response.control_service_instance_id()); - EXPECT_GT(response.safety_epoch(), 0U); - ASSERT_EQ(response.devices_size(), 1); - EXPECT_EQ(response.devices(0).device_id(), "safety-camera"); - EXPECT_EQ(response.devices(0).policy_family(), "Sensor"); - ASSERT_GT(response.participants_size(), 0); - EXPECT_FALSE(response.participants(0).participant_id().empty()); - EXPECT_FALSE(response.participants(0).phase().empty()); - EXPECT_TRUE(response.participants(0).registered()); - - api::GetSystemInfoCommand_Request info_request; - api::GetSystemInfoCommand_Feedback info_response; - grpc::ServerContext info_context; - ASSERT_TRUE(service_->GetSystemInfo( - &info_context, &info_request, &info_response).ok()); - EXPECT_EQ( - info_response.control_service_instance_id(), - response.control_service_instance_id()); - EXPECT_EQ(info_response.safety_schema_version(), 1U); -} - -TEST_F(GrpcSystemServiceTest, RecoveryIsDisabledByDefault) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - service_ = std::make_unique(); - - api::RecoverSafetyStateCommand_Request request; - request.set_recovery_id("recovery-disabled"); - request.mutable_scope()->set_all_devices(true); - request.set_expected_safety_epoch( - manager.safetyManager().snapshot().safety_epoch); - request.set_mode(api::RecoverSafetyStateCommand::VERIFY_ONLY); - request.set_reason("diagnostic verification"); - api::RecoverSafetyStateCommand_Feedback response; - grpc::ServerContext context; - - const auto status = service_->RecoverSafetyState( - &context, &request, &response); - EXPECT_EQ(status.error_code(), grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ(status.error_message(), "RECOVERY_RPC_DISABLED"); -} - -TEST_F(GrpcSystemServiceTest, OperationalRestoreIsDisabledByDefault) -{ - config::DeviceManagerConfig config; - (void)device::DeviceManager::getInstance(config); - service_ = std::make_unique(); - - api::RestoreOperationalStateCommand_Request request; - request.set_recovery_id("restore-disabled"); - request.set_reason("operator requested recovery"); - api::RestoreOperationalStateCommand_Feedback response; - grpc::ServerContext context; - - const auto status = service_->RestoreOperationalState( - &context, &request, &response); - - EXPECT_EQ(status.error_code(), grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ(status.error_message(), "RECOVERY_RPC_DISABLED"); -} - -TEST_F(GrpcSystemServiceTest, RecoveryRequiresDurableAuditBeforeCoordinator) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - manager.registerDevice(std::make_shared( - "audit-camera", device::DeviceKind::Camera, "AuditCamera")); - auto audit = std::make_shared(); - service_ = std::make_unique( - std::chrono::seconds(1), makeAllowAllRecoveryGateway(), audit); - - api::RecoverSafetyStateCommand_Request request; - request.set_recovery_id("recovery-audited"); - request.mutable_scope()->set_all_devices(true); - request.set_expected_safety_epoch( - manager.safetyManager().snapshot().safety_epoch); - request.set_mode(api::RecoverSafetyStateCommand::VERIFY_ONLY); - request.set_reason("verify the local work cell"); - request.set_timeout_ms(500); - api::RecoverSafetyStateCommand_Feedback response; - grpc::ServerContext context; - - const auto status = service_->RecoverSafetyState( - &context, &request, &response); - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_EQ(audit->records.size(), 2U); - EXPECT_EQ(audit->records.front().stage, "accepted"); - EXPECT_EQ(audit->records.back().stage, "completed"); - EXPECT_EQ(response.recovery_id(), "recovery-audited"); - - const auto epoch_before_failure = - manager.safetyManager().snapshot().safety_epoch; - audit->fail = true; - request.set_recovery_id("recovery-audit-fails"); - request.set_expected_safety_epoch(epoch_before_failure); - response.Clear(); - grpc::ServerContext failed_context; - const auto failed = service_->RecoverSafetyState( - &failed_context, &request, &response); - EXPECT_EQ(failed.error_code(), grpc::StatusCode::FAILED_PRECONDITION); - EXPECT_EQ( - response.header().reason_code(), - api::COMMAND_REASON_CODE_RECOVERY_AUDIT_FAILED); - EXPECT_EQ( - manager.safetyManager().snapshot().safety_epoch, - epoch_before_failure); -} - -TEST_F(GrpcSystemServiceTest, - RestoreOperationalStateRecoversArmAndClearsAdmission) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - action_trace_ = std::make_shared(); - action_arm_ = std::make_shared( - "restore-arm", action_trace_); - device::ArmState protected_state; - protected_state.connected = true; - protected_state.powered_on = true; - protected_state.moving = true; - protected_state.program_running = true; - protected_state.protective_stopped = true; - action_arm_->setReportedState(protected_state); - manager.registerDevice(action_arm_); - manager.safetyManager().quarantineDevice( - action_arm_->id(), safety::SafetyReason::OutcomeUnknown); - - auto audit = std::make_shared(); - service_ = std::make_unique( - std::chrono::seconds(1), makeAllowAllRecoveryGateway(), audit); - - api::RestoreOperationalStateCommand_Request request; - request.set_recovery_id("restore-whole-system"); - request.set_reason("operator confirmed the work cell is clear"); - request.set_timeout_ms(1000); - api::RestoreOperationalStateCommand_Feedback response; - grpc::ServerContext context; - - const auto status = service_->RestoreOperationalState( - &context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ( - response.result(), api::SAFETY_OPERATION_RESULT_RECOVERED); - EXPECT_EQ( - response.system_state(), api::SYSTEM_ADMISSION_STATE_OPEN); - EXPECT_EQ(action_arm_->clearFaultCalls(), 1); - const auto* arm_target = findSafetyTarget(response, action_arm_->id()); - ASSERT_NE(arm_target, nullptr); - EXPECT_EQ( - arm_target->result(), api::SAFETY_OPERATION_RESULT_SUCCEEDED); - ASSERT_EQ(audit->records.size(), 3U); - EXPECT_EQ(audit->records[0].stage, "accepted"); - EXPECT_EQ(audit->records[1].stage, "restore_commit"); - EXPECT_EQ(audit->records[2].stage, "completed"); - - const auto snapshot = manager.safetyManager().snapshot(); - EXPECT_EQ(snapshot.system_state, safety::SystemAdmissionState::Open); - ASSERT_EQ(snapshot.devices.size(), 1U); - EXPECT_EQ( - snapshot.devices.front().admission_state, - safety::DeviceAdmissionState::Open); -} - -TEST_F(GrpcSystemServiceTest, MapsEveryKnownDeviceKind) -{ - struct ExpectedMapping { - const char* id; - device::DeviceKind source; - api::SystemDeviceType destination; - }; - constexpr std::array mappings{{ - {"01_agv", device::DeviceKind::AGV, - api::SYSTEM_DEVICE_TYPE_AGV}, - {"02_arm", device::DeviceKind::Arm, - api::SYSTEM_DEVICE_TYPE_ARM}, - {"03_battery", device::DeviceKind::Battery, - api::SYSTEM_DEVICE_TYPE_BATTERY}, - {"04_bio_head", device::DeviceKind::BioHead, - api::SYSTEM_DEVICE_TYPE_BIO_HEAD}, - {"05_camera", device::DeviceKind::Camera, - api::SYSTEM_DEVICE_TYPE_CAMERA}, - {"06_can_bus", device::DeviceKind::CanBus, - api::SYSTEM_DEVICE_TYPE_CAN_BUS}, - {"07_dex_hand", device::DeviceKind::DexHand, - api::SYSTEM_DEVICE_TYPE_DEX_HAND}, - {"08_gripper", device::DeviceKind::Gripper, - api::SYSTEM_DEVICE_TYPE_GRIPPER}, - {"09_microphone", device::DeviceKind::Microphone, - api::SYSTEM_DEVICE_TYPE_MICROPHONE}, - {"10_motor", device::DeviceKind::Motor, - api::SYSTEM_DEVICE_TYPE_MOTOR}, - {"11_motor_system", device::DeviceKind::MotorSystem, - api::SYSTEM_DEVICE_TYPE_MOTOR_SYSTEM}, - {"12_mujoco_viewer", device::DeviceKind::MujocoViewer, - api::SYSTEM_DEVICE_TYPE_MUJOCO_VIEWER}, - {"13_mujoco_world", device::DeviceKind::MujocoWorld, - api::SYSTEM_DEVICE_TYPE_MUJOCO_WORLD}, - {"14_robot", device::DeviceKind::Robot, - api::SYSTEM_DEVICE_TYPE_ROBOT}, - {"15_speaker", device::DeviceKind::Speaker, - api::SYSTEM_DEVICE_TYPE_SPEAKER}, - }}; - - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - for (const auto& mapping : mappings) { - registerDevice( - manager, - std::make_shared( - mapping.id, mapping.source, "MappedBackend")); - } - service_ = std::make_unique(); - - const auto response = getDeviceList(); - - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - ASSERT_EQ(response.device_list_size(), - static_cast(mappings.size())); - for (std::size_t index = 0; index < mappings.size(); ++index) { - SCOPED_TRACE(mappings[index].id); - const auto& actual = response.device_list( - static_cast(index)); - EXPECT_EQ(actual.device_id(), mappings[index].id); - EXPECT_EQ(actual.device_type(), mappings[index].destination); - EXPECT_NE(actual.device_type(), - api::SYSTEM_DEVICE_TYPE_UNSPECIFIED); - } -} - -TEST_F(GrpcSystemServiceTest, ActionQueueExecutesFourMoveLStepsSerially) -{ - initializeActionDevices(); - api::ActionQueueCommand_Request request; - request.set_action_id("four-movel"); - for (int marker = 1; marker <= 4; ++marker) { - addMoveLStep( - request, - "move-" + std::to_string(marker), - action_arm_->id(), - static_cast(marker)); - } - - const auto response = executeAction(request); - - EXPECT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ(response.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ(response.completed_steps(), 4U); - EXPECT_FALSE(response.has_failed_step_index()); - EXPECT_EQ(action_arm_->motionCalls(), 4); - EXPECT_EQ(action_arm_->maxActiveMotions(), 1); - EXPECT_EQ( - action_trace_->names(), - (std::vector{ - "arm:L:1", "arm:L:2", "arm:L:3", "arm:L:4"})); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueRejectsStaleDeviceGenerationBeforeStepDispatch) -{ - config::DeviceManagerConfig config; - config.mutable_safety()->set_mode( - config::SafetyManagerConfig::ENFORCE_ALL); - auto& manager = device::DeviceManager::getInstance(config); - action_trace_ = std::make_shared(); - action_arm_ = std::make_shared( - "action-arm", action_trace_); - manager.registerDevice(action_arm_); - manager.safetyManager().markStartupComplete(); - std::optional current_device_generation; - const auto snapshot_deadline = - std::chrono::steady_clock::now() + std::chrono::seconds(1); - while (std::chrono::steady_clock::now() < snapshot_deadline) { - const auto safety = manager.safetyManager().snapshot(); - ASSERT_EQ( - safety.system_state, safety::SystemAdmissionState::Open); - const auto safety_device = std::find_if( - safety.devices.begin(), safety.devices.end(), - [this](const auto& device) { - return device.descriptor.device_id == action_arm_->id(); - }); - if (safety_device != safety.devices.end() && - safety_device->safety.fresh) { - current_device_generation = - safety_device->safety.snapshot.device_generation; - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - } - ASSERT_TRUE(current_device_generation.has_value()); - service_ = std::make_unique(); - - api::GetSystemInfoCommand_Request info_request; - api::GetSystemInfoCommand_Feedback info_response; - grpc::ServerContext info_context; - ASSERT_TRUE(service_->GetSystemInfo( - &info_context, &info_request, &info_response).ok()); - - api::ActionQueueCommand_Request request; - request.set_action_id("stale-step-generation"); - request.set_expected_service_instance_id( - info_response.action_service_instance_id()); - auto* step = addMoveLStep( - request, "move", action_arm_->id(), 1.0); - step->mutable_arm_move_l() - ->mutable_header() - ->set_expected_device_generation( - *current_device_generation + 1U); - - api::ActionQueueCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->ExecuteActionQueue( - &context, &request, &response); - - EXPECT_TRUE(status.ok()) << status.error_message(); - EXPECT_FALSE(response.header().success()); - EXPECT_EQ(response.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_EQ(response.completed_steps(), 0U); - ASSERT_TRUE(response.has_failed_step_index()); - EXPECT_EQ(response.failed_step_index(), 0U); - EXPECT_NE( - response.header().error_message().find("generation"), - std::string::npos) - << response.header().error_message(); - EXPECT_EQ(action_arm_->motionCalls(), 0); - EXPECT_TRUE(action_trace_->names().empty()); -} - -TEST_F(GrpcSystemServiceTest, ActionQueuePreservesArmDelayAgvOrder) -{ - initializeActionDevices(); - api::ActionQueueCommand_Request request; - request.set_action_id("arm-delay-agv"); - addMoveJStep(request, "arm", action_arm_->id()); - addDelayStep(request, "settle", 25U); - addAgvStationStep( - request, "agv", action_agv_->id(), "dock"); - - const auto response = executeAction(request); - const auto arm_time = action_trace_->firstTime("arm:J"); - const auto agv_time = action_trace_->firstTime("agv:station:dock"); - - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ(response.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ(response.completed_steps(), 3U); - EXPECT_EQ( - action_trace_->names(), - (std::vector{"arm:J", "agv:station:dock"})); - ASSERT_TRUE(arm_time.has_value()); - ASSERT_TRUE(agv_time.has_value()); - EXPECT_GE( - std::chrono::duration_cast( - *agv_time - *arm_time), - std::chrono::milliseconds(15)); -} - -TEST_F(GrpcSystemServiceTest, ActionQueueExecutesAgvPoseAndPathSteps) -{ - initializeActionDevices(); - api::ActionQueueCommand_Request request; - request.set_action_id("agv-pose-and-path"); - addAgvPoseStep( - request, "pose", action_agv_->id(), 1.0, 2.0, 0.5); - addAgvPathStep(request, "path", action_agv_->id()); - - const auto response = executeAction(request); - - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ(response.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ(response.completed_steps(), 2U); - EXPECT_EQ(action_agv_->navigationCalls(), 2); - const auto pose = action_agv_->lastPose(); - EXPECT_DOUBLE_EQ(pose.x, 1.0); - EXPECT_DOUBLE_EQ(pose.y, 2.0); - EXPECT_DOUBLE_EQ(pose.theta, 0.5); - const auto path = action_agv_->lastPath(); - ASSERT_EQ(path.size(), 2U); - EXPECT_EQ(path[0].source_station, "start"); - EXPECT_EQ(path[0].target_station, "middle"); - EXPECT_EQ(path[1].source_station, "middle"); - EXPECT_EQ(path[1].target_station, "finish"); - EXPECT_EQ( - action_trace_->names(), - (std::vector{"agv:pose", "agv:path"})); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueuePrevalidatesAllStepsBeforeAnyDispatch) -{ - initializeActionDevices(); - api::ActionQueueCommand_Request request; - request.set_action_id("prevalidate-all"); - addMoveLStep(request, "valid-first", action_arm_->id(), 1.0); - addAgvStationStep( - request, "missing-second", "missing-agv", "dock"); - - const auto response = executeAction(request); - - EXPECT_FALSE(response.header().success()); - EXPECT_EQ(response.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_EQ(response.completed_steps(), 0U); - ASSERT_TRUE(response.has_failed_step_index()); - EXPECT_EQ(response.failed_step_index(), 1U); - EXPECT_EQ(action_arm_->motionCalls(), 0); - EXPECT_EQ(action_agv_->navigationCalls(), 0); - EXPECT_TRUE(action_trace_->names().empty()); -} - -TEST_F(GrpcSystemServiceTest, ActionQueueRejectsAsynchronousMotion) -{ - initializeActionDevices(); - api::ActionQueueCommand_Request arm_request; - arm_request.set_action_id("async-arm"); - addMoveLStep( - arm_request, "arm", action_arm_->id(), 1.0, 0U, true); - const auto arm_response = executeAction(arm_request); - - api::ActionQueueCommand_Request agv_request; - agv_request.set_action_id("async-agv"); - addAgvStationStep( - agv_request, "agv", action_agv_->id(), "dock", true); - const auto agv_response = executeAction(agv_request); - - EXPECT_EQ(arm_response.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_EQ(agv_response.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_EQ(action_arm_->motionCalls(), 0); - EXPECT_EQ(action_agv_->navigationCalls(), 0); - EXPECT_TRUE(action_trace_->names().empty()); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueStopsAfterFailureAndReportsFailedStep) -{ - initializeActionDevices(); - action_arm_->failOnMotionCall(2); - api::ActionQueueCommand_Request request; - request.set_action_id("fail-fast"); - addMoveLStep(request, "first", action_arm_->id(), 1.0); - addMoveLStep(request, "fails", action_arm_->id(), 2.0); - addMoveLStep(request, "must-not-run", action_arm_->id(), 3.0); - - const auto response = executeAction(request); - - EXPECT_FALSE(response.header().success()); - EXPECT_EQ(response.result(), api::ACTION_RESULT_CODE_FAILED); - EXPECT_EQ(response.completed_steps(), 1U); - ASSERT_TRUE(response.has_failed_step_index()); - EXPECT_EQ(response.failed_step_index(), 1U); - EXPECT_EQ(action_arm_->motionCalls(), 2); - const auto trace = action_trace_->names(); - ASSERT_GE(trace.size(), 2U); - EXPECT_EQ(trace[0], "arm:L:1"); - EXPECT_EQ(trace[1], "arm:L:2"); - EXPECT_GE(action_arm_->stopMotionCalls(), 1); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueQuarantinesAgvAfterUnconfirmedFailureStop) -{ - initializeActionDevices(); - action_agv_->setNavigationFailure(true); - action_agv_->setStoppedConfirmed(false); - api::ActionQueueCommand_Request request; - request.set_action_id("agv-unconfirmed-stop"); - addAgvStationStep( - request, "fails", action_agv_->id(), "dock"); - - const auto response = executeAction(request); - - EXPECT_EQ(response.result(), api::ACTION_RESULT_CODE_FAILED); - ASSERT_TRUE(response.has_failed_step_index()); - EXPECT_EQ(response.failed_step_index(), 0U); - EXPECT_NE( - response.header().error_message().find("remain quarantined"), - std::string::npos); - auto& authority = control::ControlAuthorityManager::instance(); - const auto lease = authority.tryAcquire( - action_agv_->id(), - "normal-control-after-unconfirmed-action-stop", - std::chrono::hours(1)); - EXPECT_FALSE(lease.acquired); - - const auto recovery = authority.preemptAcquire( - action_agv_->id(), - "confirmed-agv-recovery", - std::chrono::hours(1)); - ASSERT_TRUE(recovery.acquired) << recovery.detail; - ASSERT_TRUE(authority.waitForPreemptedRelease( - recovery.token, std::chrono::milliseconds::zero())); - ASSERT_TRUE(authority.recoverRetiredSafetyHolders(recovery.token)); - authority.release(recovery.token); - - const auto recovered_lease = authority.tryAcquire( - action_agv_->id(), - "normal-control-after-confirmed-recovery", - std::chrono::hours(1)); - EXPECT_TRUE(recovered_lease.acquired) << recovered_lease.detail; - authority.release(recovered_lease.token); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueIsIdempotentAndRejectsConflictingPayload) -{ - initializeActionDevices(); - api::ActionQueueCommand_Request request; - request.set_action_id("idempotent-action"); - addMoveLStep(request, "only-step", action_arm_->id(), 1.0); - - const auto first = executeAction(request); - const auto retry = executeAction(request); - auto conflicting = request; - conflicting.mutable_steps(0) - ->mutable_arm_move_l()->mutable_target()->set_x(2.0); - const auto conflict = executeAction(conflicting); - - EXPECT_EQ(first.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ( - first.deduplication_status(), - api::ACTION_DEDUPLICATION_STATUS_ACCEPTED_NEW); - EXPECT_EQ(retry.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ( - retry.deduplication_status(), - api::ACTION_DEDUPLICATION_STATUS_CACHED_RESULT); - EXPECT_EQ(retry.completed_steps(), 1U); - EXPECT_EQ(conflict.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_EQ( - conflict.deduplication_status(), - api::ACTION_DEDUPLICATION_STATUS_ACTION_ID_CONFLICT); - EXPECT_EQ(action_arm_->motionCalls(), 1); - EXPECT_EQ( - action_trace_->names(), - (std::vector{"arm:L:1"})); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueRetryAfterTerminalCacheChurnDoesNotRedispatch) -{ - initializeActionDevices(); - api::ActionQueueCommand_Request original; - original.set_action_id("idempotent-after-cache-churn"); - addMoveLStep(original, "only-step", action_arm_->id(), 1.0); - - const auto first = executeAction(original); - ASSERT_EQ(first.result(), api::ACTION_RESULT_CODE_COMPLETED); - ASSERT_EQ(action_arm_->motionCalls(), 1); - - constexpr int kActionsBeyondTerminalCacheCapacity = 257; - for (int index = 0; index < kActionsBeyondTerminalCacheCapacity; ++index) { - SCOPED_TRACE(index); - api::ActionQueueCommand_Request filler; - filler.set_action_id("terminal-cache-filler-" + std::to_string(index)); - addDelayStep(filler, "delay", 0U); - - const auto response = executeAction(filler); - ASSERT_EQ(response.result(), api::ACTION_RESULT_CODE_COMPLETED) - << response.header().error_message(); - } - - const auto retry = executeAction(original); - - EXPECT_EQ(retry.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ(retry.completed_steps(), 1U); - EXPECT_EQ(action_arm_->motionCalls(), 1); - - // submitAndWait() may wake before the worker completes terminal-cache - // rotation for the final filler. Advance one additional terminal action so - // the original ID is deterministically present in the retired-ID filter. - constexpr int kTotalActionsToRetireOriginal = 4353; - for (int index = kActionsBeyondTerminalCacheCapacity; - index < kTotalActionsToRetireOriginal; ++index) { - SCOPED_TRACE(index); - api::ActionQueueCommand_Request filler; - filler.set_action_id("terminal-cache-filler-" + std::to_string(index)); - addDelayStep(filler, "delay", 0U); - - const auto response = executeAction(filler); - ASSERT_EQ(response.result(), api::ACTION_RESULT_CODE_COMPLETED) - << response.header().error_message(); - } - - const auto retired_retry = executeAction(original); - - EXPECT_EQ(retired_retry.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_EQ( - retired_retry.deduplication_status(), - api::ACTION_DEDUPLICATION_STATUS_RESULT_EVICTED); - EXPECT_NE( - retired_retry.header().error_message().find("no longer cached"), - std::string::npos); - EXPECT_EQ(action_arm_->motionCalls(), 1); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueRejectsMissingOrStaleServiceInstance) -{ - initializeActionDevices(); - api::ActionQueueCommand_Request request; - request.set_action_id("service-instance-check"); - addMoveLStep(request, "move", action_arm_->id(), 1.0); - - api::ActionQueueCommand_Feedback missing_response; - grpc::ServerContext missing_context; - const auto missing_status = service_->ExecuteActionQueue( - &missing_context, &request, &missing_response); - - request.set_expected_service_instance_id("stale-instance"); - api::ActionQueueCommand_Feedback stale_response; - grpc::ServerContext stale_context; - const auto stale_status = service_->ExecuteActionQueue( - &stale_context, &request, &stale_response); - - EXPECT_TRUE(missing_status.ok()) << missing_status.error_message(); - EXPECT_EQ( - missing_response.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_EQ(missing_response.service_instance_id(), service_instance_id_); - EXPECT_TRUE(stale_status.ok()) << stale_status.error_message(); - EXPECT_EQ(stale_response.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_EQ( - stale_response.deduplication_status(), - api::ACTION_DEDUPLICATION_STATUS_SERVICE_INSTANCE_MISMATCH); - EXPECT_EQ(stale_response.service_instance_id(), service_instance_id_); - EXPECT_EQ(action_arm_->motionCalls(), 0); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueServiceRestartRejectsRetryBoundToPriorInstance) -{ - initializeActionDevices(); - api::ActionQueueCommand_Request request; - request.set_action_id("prior-instance-retry"); - request.set_expected_service_instance_id(service_instance_id_); - addMoveLStep(request, "move", action_arm_->id(), 1.0); - const std::string prior_instance = service_instance_id_; - - const auto first = executeAction(request); - ASSERT_EQ(first.result(), api::ACTION_RESULT_CODE_COMPLETED) - << first.header().error_message(); - ASSERT_EQ(action_arm_->motionCalls(), 1); - - service_.reset(); - service_ = std::make_unique(); - api::GetSystemInfoCommand_Request info_request; - api::GetSystemInfoCommand_Feedback info_response; - grpc::ServerContext info_context; - ASSERT_TRUE(service_->GetSystemInfo( - &info_context, &info_request, &info_response).ok()); - service_instance_id_ = info_response.action_service_instance_id(); - ASSERT_FALSE(service_instance_id_.empty()); - ASSERT_NE(service_instance_id_, prior_instance); - - api::ActionQueueCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->ExecuteActionQueue( - &context, &request, &response); - - EXPECT_TRUE(status.ok()) << status.error_message(); - EXPECT_EQ(response.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_EQ( - response.deduplication_status(), - api::ACTION_DEDUPLICATION_STATUS_SERVICE_INSTANCE_MISMATCH); - EXPECT_EQ(response.service_instance_id(), service_instance_id_); - EXPECT_EQ(action_arm_->motionCalls(), 1); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueLedgerCapacityRejectsOnlyNewIds) -{ - initializeActionDevices(); - ActionQueueExecutor executor( - device::DeviceManager::getInstance(), 2U); - const auto make_request = [&executor](const std::string& action_id) { - api::ActionQueueCommand_Request request; - request.set_action_id(action_id); - request.set_expected_service_instance_id(executor.instanceId()); - addDelayStep(request, "delay", 0U); - return request; - }; - const auto first_request = make_request("ledger-first"); - const auto second_request = make_request("ledger-second"); - const auto rejected_request = make_request("ledger-third"); - api::ActionQueueCommand_Feedback first; - api::ActionQueueCommand_Feedback second; - api::ActionQueueCommand_Feedback rejected; - api::ActionQueueCommand_Feedback retry; - - EXPECT_EQ( - executor.submitAndWait(first_request, first), - ActionQueueExecutor::WaitResult::Terminal); - EXPECT_EQ( - executor.submitAndWait(second_request, second), - ActionQueueExecutor::WaitResult::Terminal); - EXPECT_EQ( - executor.submitAndWait(rejected_request, rejected), - ActionQueueExecutor::WaitResult::Terminal); - EXPECT_EQ( - executor.submitAndWait(first_request, retry), - ActionQueueExecutor::WaitResult::Terminal); - - EXPECT_EQ(first.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ(second.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ(rejected.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_EQ( - rejected.deduplication_status(), - api::ACTION_DEDUPLICATION_STATUS_LEDGER_EXHAUSTED); - EXPECT_EQ(retry.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ( - retry.deduplication_status(), - api::ACTION_DEDUPLICATION_STATUS_CACHED_RESULT); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueCanceledWaiterLeavesAcceptedActionRunning) -{ - initializeActionDevices(); - ActionQueueExecutor executor(device::DeviceManager::getInstance()); - action_arm_->blockNextMotion(); - - api::ActionQueueCommand_Request request; - request.set_action_id("canceled-waiter-action-continues"); - request.set_expected_service_instance_id(executor.instanceId()); - request.set_total_timeout_ms(1000U); - addMoveLStep(request, "move", action_arm_->id(), 1.0); - - std::atomic waiter_canceled{false}; - api::ActionQueueCommand_Feedback abandoned_feedback; - auto waiter = std::async( - std::launch::async, - [&executor, &request, &abandoned_feedback, &waiter_canceled]() { - return executor.submitAndWait( - request, - abandoned_feedback, - [&waiter_canceled]() { - return waiter_canceled.load(std::memory_order_acquire); - }); - }); - ASSERT_TRUE(action_arm_->waitForMotionCalls( - 1, std::chrono::milliseconds(500))); - - waiter_canceled.store(true, std::memory_order_release); - const auto waiter_status = waiter.wait_for(std::chrono::milliseconds(500)); - if (waiter_status != std::future_status::ready) { - action_arm_->releaseBlockedMotion(); - } - ASSERT_EQ(waiter_status, std::future_status::ready); - EXPECT_EQ( - waiter.get(), - ActionQueueExecutor::WaitResult::CanceledAfterAdmission); - EXPECT_EQ(action_arm_->motionCalls(), 1); - - action_arm_->releaseBlockedMotion(); - ASSERT_TRUE(executor.waitForIdle(std::chrono::milliseconds(500))); - - api::ActionQueueCommand_Feedback retry_feedback; - const auto retry_result = executor.submitAndWait(request, retry_feedback); - - EXPECT_EQ(retry_result, ActionQueueExecutor::WaitResult::Terminal); - EXPECT_TRUE(retry_feedback.header().success()) - << retry_feedback.header().error_message(); - EXPECT_EQ( - retry_feedback.result(), - api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ(retry_feedback.completed_steps(), 1U); - EXPECT_EQ(action_arm_->motionCalls(), 1); -} - -TEST_F(GrpcSystemServiceTest, - ConcurrentIdenticalActionIdJoinsInFlightExecution) -{ - initializeActionDevices(); - ActionQueueExecutor executor(device::DeviceManager::getInstance()); - action_arm_->blockNextMotion(); - - api::ActionQueueCommand_Request request; - request.set_action_id("join-identical-in-flight-action"); - request.set_expected_service_instance_id(executor.instanceId()); - request.set_total_timeout_ms(1000U); - addMoveLStep(request, "move", action_arm_->id(), 1.0); - - api::ActionQueueCommand_Feedback first_feedback; - api::ActionQueueCommand_Feedback joined_feedback; - auto first = std::async( - std::launch::async, - [&executor, &request, &first_feedback]() { - return executor.submitAndWait(request, first_feedback); - }); - const bool motion_started = action_arm_->waitForMotionCalls( - 1, std::chrono::milliseconds(500)); - - std::atomic joined_wait_polls{0}; - auto joined = std::async( - std::launch::async, - [&executor, &request, &joined_feedback, &joined_wait_polls]() { - return executor.submitAndWait( - request, - joined_feedback, - [&joined_wait_polls]() { - joined_wait_polls.fetch_add( - 1, std::memory_order_acq_rel); - return false; - }); - }); - const auto poll_deadline = - std::chrono::steady_clock::now() + std::chrono::milliseconds(500); - while (joined_wait_polls.load(std::memory_order_acquire) < 2 && - std::chrono::steady_clock::now() < poll_deadline) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - const bool joined_is_waiting = - joined_wait_polls.load(std::memory_order_acquire) >= 2; - action_arm_->releaseBlockedMotion(); - - const auto first_result = first.get(); - const auto joined_result = joined.get(); - - ASSERT_TRUE(motion_started); - ASSERT_TRUE(joined_is_waiting); - EXPECT_EQ(first_result, ActionQueueExecutor::WaitResult::Terminal); - EXPECT_EQ(joined_result, ActionQueueExecutor::WaitResult::Terminal); - EXPECT_EQ(first_feedback.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ(joined_feedback.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ( - first_feedback.deduplication_status(), - api::ACTION_DEDUPLICATION_STATUS_ACCEPTED_NEW); - EXPECT_EQ( - joined_feedback.deduplication_status(), - api::ACTION_DEDUPLICATION_STATUS_JOINED_IN_FLIGHT); - EXPECT_EQ(action_arm_->motionCalls(), 1); -} - -TEST_F(GrpcSystemServiceTest, - ConcurrentActionQueuesRemainFifoAndHoldTheControlLease) -{ - initializeActionDevices(); - action_arm_->blockNextMotion(); - - api::ActionQueueCommand_Request first_request; - first_request.set_action_id("fifo-first"); - addMoveLStep(first_request, "first-1", action_arm_->id(), 10.0); - addMoveLStep(first_request, "first-2", action_arm_->id(), 11.0); - api::ActionQueueCommand_Request second_request; - second_request.set_action_id("fifo-second"); - addMoveLStep(second_request, "second-1", action_arm_->id(), 20.0); - - auto first = std::async( - std::launch::async, - [this, first_request]() { return executeAction(first_request); }); - const bool started = action_arm_->waitForMotionCalls( - 1, std::chrono::milliseconds(500)); - auto second = std::async( - std::launch::async, - [this, second_request]() { return executeAction(second_request); }); - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - - const auto competing = - control::ControlAuthorityManager::instance().tryAcquire( - action_arm_->id(), "ordinary-control", - std::chrono::seconds(1)); - if (competing.acquired) { - // Keep a failed assertion from stranding the worker behind this test - // lease and turning the diagnostic into a long timeout. - control::ControlAuthorityManager::instance().release( - competing.token); - } - action_arm_->releaseBlockedMotion(); - const auto first_response = first.get(); - const auto second_response = second.get(); - - EXPECT_TRUE(started); - EXPECT_FALSE(competing.acquired); - EXPECT_EQ(first_response.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ(second_response.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ(action_arm_->maxActiveMotions(), 1); - EXPECT_EQ( - action_trace_->names(), - (std::vector{ - "arm:L:10", "arm:L:11", "arm:L:20"})); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueTotalAndStepTimeoutsIssueTypedArmStop) -{ - initializeActionDevices(); - - action_arm_->blockNextMotion(); - api::ActionQueueCommand_Request total_timeout; - total_timeout.set_action_id("total-timeout"); - total_timeout.set_total_timeout_ms(40U); - addMoveLStep( - total_timeout, "total", action_arm_->id(), 1.0); - const auto total_response = executeAction(total_timeout); - const int stops_after_total = action_arm_->stopMotionCalls(); - - action_arm_->blockNextMotion(); - api::ActionQueueCommand_Request step_timeout; - step_timeout.set_action_id("step-timeout"); - step_timeout.set_total_timeout_ms(500U); - addMoveLStep( - step_timeout, "step", action_arm_->id(), 2.0, 30U); - const auto step_response = executeAction(step_timeout); - - EXPECT_EQ(total_response.result(), api::ACTION_RESULT_CODE_TIMED_OUT); - EXPECT_EQ(total_response.completed_steps(), 0U); - ASSERT_TRUE(total_response.has_failed_step_index()); - EXPECT_EQ(total_response.failed_step_index(), 0U); - EXPECT_GE(stops_after_total, 1); - EXPECT_EQ(step_response.result(), api::ACTION_RESULT_CODE_TIMED_OUT); - EXPECT_EQ(step_response.completed_steps(), 0U); - ASSERT_TRUE(step_response.has_failed_step_index()); - EXPECT_EQ(step_response.failed_step_index(), 0U); - EXPECT_GT(action_arm_->stopMotionCalls(), stops_after_total); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueRetiresUnconfirmedTimedOutArmStopForRecovery) -{ - initializeActionDevices(); - action_arm_->blockNextMotion(); - action_arm_->failStopAndBusyConfirmation(); - - api::ActionQueueCommand_Request request; - request.set_action_id("unconfirmed-timeout-stop"); - request.set_total_timeout_ms(40U); - addMoveLStep(request, "times-out", action_arm_->id(), 1.0); - - const auto response = executeAction(request); - - EXPECT_EQ(response.result(), api::ACTION_RESULT_CODE_TIMED_OUT); - EXPECT_NE( - response.header().error_message().find("remains quarantined"), - std::string::npos); - auto& authority = control::ControlAuthorityManager::instance(); - EXPECT_FALSE(authority.tryAcquire( - action_arm_->id(), "move-before-recovery", std::chrono::hours(1)) - .acquired); - - const auto recovery = authority.preemptAcquire( - action_arm_->id(), - "confirmed-arm-recovery", - std::chrono::hours(1)); - ASSERT_TRUE(recovery.acquired) << recovery.detail; - ASSERT_TRUE(authority.waitForPreemptedRelease( - recovery.token, std::chrono::milliseconds::zero())); - ASSERT_TRUE(authority.recoverRetiredSafetyHolders(recovery.token)); - authority.release(recovery.token); - - const auto recovered_lease = authority.tryAcquire( - action_arm_->id(), "move-after-recovery", std::chrono::hours(1)); - EXPECT_TRUE(recovered_lease.acquired) << recovered_lease.detail; - authority.release(recovered_lease.token); -} - -TEST_F(GrpcSystemServiceTest, - DelayedActionCancellationCannotStopSuccessorControlLease) -{ - initializeActionDevices(); - action_arm_->blockNextMotion(); - action_arm_->blockCanceledMotionReturn(); - - api::ActionQueueCommand_Request request; - request.set_action_id("stale-action-stop-must-not-preempt-successor"); - request.set_total_timeout_ms(2000U); - addMoveLStep(request, "active", action_arm_->id(), 1.0); - - auto action = std::async( - std::launch::async, - [this, request]() { return executeAction(request); }); - const bool motion_started = action_arm_->waitForMotionCalls( - 1, std::chrono::milliseconds(500)); - - auto& authority = control::ControlAuthorityManager::instance(); - control::ControlAcquireResult direct_stop; - if (motion_started) { - direct_stop = authority.preemptAcquire( - action_arm_->id(), - "direct-stop-before-successor", - std::chrono::seconds(30)); - } - if (direct_stop.acquired) { - (void)action_arm_->stopMotion(); - } else { - action_arm_->releaseBlockedMotion(); - } - const bool old_driver_ready_to_return = - action_arm_->waitForCanceledMotionReturn( - std::chrono::milliseconds(500)); - const auto successor_before_handler_exit = authority.tryAcquire( - action_arm_->id(), - "successor-before-old-handler-exit", - std::chrono::seconds(30)); - action_arm_->releaseCanceledMotionReturn(); - - const auto action_status = action.wait_for(std::chrono::seconds(1)); - if (action_status != std::future_status::ready) { - service_->prepareForShutdown(); - } - ASSERT_EQ(action_status, std::future_status::ready); - const auto response = action.get(); - const bool old_handler_released = direct_stop.acquired && - authority.waitForPreemptedRelease( - direct_stop.token, std::chrono::seconds(1)); - if (direct_stop.acquired) { - authority.release(direct_stop.token); - } - const auto successor = authority.tryAcquire( - action_arm_->id(), - "successor-move", - std::chrono::seconds(30)); - const bool successor_still_current = - successor.acquired && authority.validate(successor.token); - if (successor.acquired) { - authority.release(successor.token); - } - - ASSERT_TRUE(motion_started); - ASSERT_TRUE(direct_stop.acquired) << direct_stop.detail; - ASSERT_TRUE(old_driver_ready_to_return); - EXPECT_FALSE(successor_before_handler_exit.acquired); - EXPECT_TRUE(old_handler_released); - ASSERT_TRUE(successor.acquired) << successor.detail; - EXPECT_EQ(response.result(), api::ACTION_RESULT_CODE_CANCELED); - EXPECT_TRUE(successor_still_current); - EXPECT_EQ(action_arm_->stopMotionCalls(), 1); -} - -TEST_F(GrpcSystemServiceTest, - StopAllCancelsActiveActionAndSkipsRemainingSteps) -{ - initializeActionDevices(); - action_arm_->blockNextMotion(); - api::ActionQueueCommand_Request action_request; - action_request.set_action_id("stop-all-action"); - action_request.set_total_timeout_ms(500U); - addMoveLStep(action_request, "active", action_arm_->id(), 1.0); - addMoveLStep(action_request, "must-not-run", action_arm_->id(), 2.0); - - auto action = std::async( - std::launch::async, - [this, action_request]() { return executeAction(action_request); }); - const bool started = action_arm_->waitForMotionCalls( - 1, std::chrono::milliseconds(500)); - - api::StopAllCommand_Request stop_request; - api::StopAllCommand_Feedback stop_response; - grpc::ServerContext stop_context; - const auto stop_status = service_->StopAll( - &stop_context, &stop_request, &stop_response); - const auto action_response = action.get(); - - api::ActionQueueCommand_Request resumed_request; - resumed_request.set_action_id("action-after-stop-all"); - addMoveLStep( - resumed_request, "resumed", action_arm_->id(), 3.0); - const auto resumed_response = executeAction(resumed_request); - - EXPECT_TRUE(started); - ASSERT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_TRUE(stop_response.header().success()) - << stop_response.header().error_message(); - EXPECT_EQ(action_response.result(), api::ACTION_RESULT_CODE_CANCELED); - EXPECT_EQ(action_response.completed_steps(), 0U); - ASSERT_TRUE(action_response.has_failed_step_index()); - EXPECT_EQ(action_response.failed_step_index(), 0U); - EXPECT_TRUE(resumed_response.header().success()) - << resumed_response.header().error_message(); - EXPECT_EQ( - resumed_response.result(), api::ACTION_RESULT_CODE_COMPLETED); - EXPECT_EQ(resumed_response.completed_steps(), 1U); - EXPECT_EQ( - resumed_response.service_instance_id(), service_instance_id_); - EXPECT_EQ(action_arm_->motionCalls(), 2); - EXPECT_GE(action_arm_->stopMotionCalls(), 1); -} - -TEST_F(GrpcSystemServiceTest, - StopAllRequestsMotionStopBeforeWaitingForMediaHandlers) -{ - initializeActionDevices(); - auto media_session = globalMediaActivityCoordinator().beginSession(); - ASSERT_TRUE(media_session); - - api::StopAllCommand_Request request; - auto stop_all = std::async(std::launch::async, [this, &request] { - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll(&context, &request, &response); - return std::make_pair(status, response); - }); - - const bool motion_stop_requested = action_arm_->waitForStopMotionCalls( - 1, std::chrono::milliseconds(500)); - const auto status_while_media_active = - stop_all.wait_for(std::chrono::milliseconds(20)); - media_session.reset(); - - ASSERT_EQ( - stop_all.wait_for(std::chrono::seconds(1)), - std::future_status::ready); - const auto [status, response] = stop_all.get(); - - EXPECT_TRUE(motion_stop_requested); - EXPECT_EQ( - status_while_media_active, - std::future_status::timeout); - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()) - << response.header().error_message(); -} - -TEST_F(GrpcSystemServiceTest, - StopAllDoesNotReportSuccessWhenAnotherAdmissionParticipantFails) -{ - initializeActionDevices(); - auto media_session = globalMediaActivityCoordinator().beginSession(); - ASSERT_TRUE(media_session); - - api::StopAllCommand_Request request; - auto stop_all = std::async(std::launch::async, [this, &request] { - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll(&context, &request, &response); - return std::make_pair(status, response); - }); - - ASSERT_TRUE(action_arm_->waitForStopMotionCalls( - 1, std::chrono::milliseconds(500))); - auto& admission = globalStopAllAdmissionGate(); - const auto failed_participant = admission.beginStopAll(); - ASSERT_TRUE(failed_participant.valid()); - EXPECT_FALSE(admission.finishStopAll(failed_participant, false)); - media_session.reset(); - - ASSERT_EQ( - stop_all.wait_for(std::chrono::seconds(1)), - std::future_status::ready); - const auto [status, response] = stop_all.get(); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_FALSE(response.header().success()); - EXPECT_NE( - response.header().error_message().find( - "could not safely resume system admission"), - std::string::npos); - EXPECT_FALSE(admission.lockAdmission().accepting()); -} - -TEST_F(GrpcSystemServiceTest, - StopAllDoesNotWaitForADeviceHealthSnapshot) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - auto trace = std::make_shared(); - auto arm = std::make_shared( - "health-blocked-arm", trace); - arm->blockHealthSnapshot(); - auto registration = std::async( - std::launch::async, [&manager, arm] { - manager.registerDevice(arm); - }); - const bool health_call_blocked = arm->waitForHealthSnapshot( - std::chrono::milliseconds(500)); - service_ = std::make_unique(); - - api::StopAllCommand_Request request; - auto stop_all = std::async(std::launch::async, [this, &request] { - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll( - &context, &request, &response); - return std::make_pair(status, response); - }); - - const bool stop_dispatched_while_health_blocked = - arm->waitForStopMotionCalls( - 1, std::chrono::milliseconds(500)); - arm->releaseHealthSnapshot(); - - ASSERT_EQ( - registration.wait_for(std::chrono::seconds(1)), - std::future_status::ready); - registration.get(); - ASSERT_EQ( - stop_all.wait_for(std::chrono::seconds(1)), - std::future_status::ready); - const auto [status, response] = stop_all.get(); - - EXPECT_TRUE(health_call_blocked); - EXPECT_TRUE(stop_dispatched_while_health_blocked); - EXPECT_EQ(arm->healthSnapshotCalls(), 1); - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()) - << response.header().error_message(); -} - -TEST_F(GrpcSystemServiceTest, - StopAllDispatchesDeviceStopsWhileTaskActivityStopIsBlocked) -{ - task::TaskFactory::registerCreator( - config::TaskConfigEntry::TASK_TYPE_UME_TELEOP, - [](const config::TaskConfigEntry& entry) { - blocking_stop_task = - std::make_shared(entry.id()); - return blocking_stop_task; - }); - config::TaskManagerConfig task_config; - auto* task_entry = task_config.add_tasks(); - task_entry->set_id("blocking-stop-task"); - task_entry->set_type( - config::TaskConfigEntry::TASK_TYPE_UME_TELEOP); - task_entry->set_enable(true); - task_entry->set_run_mode( - config::TaskConfigEntry::TASK_RUN_MODE_BLOCKING_SERVICE); - auto& task_manager = task::TaskManager::getInstance(task_config); - ASSERT_TRUE(task_manager.initialized()); - ASSERT_NE(blocking_stop_task, nullptr); - - initializeActionDevices(); - auto camera = std::make_shared( - "camera-while-task-stop-blocked"); - device::DeviceManager::getInstance().registerDevice(camera); - api::StopAllCommand_Request request; - auto stop_all = std::async(std::launch::async, [this, &request] { - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll( - &context, &request, &response); - return std::make_pair(status, response); - }); - - const bool task_stop_entered = - blocking_stop_task->waitForStopActivity( - std::chrono::milliseconds(500)); - const bool arm_stop_dispatched = action_arm_->waitForStopMotionCalls( - 1, std::chrono::milliseconds(500)); - const bool camera_stop_dispatched = camera->waitForStopRecordingCalls( - 1, std::chrono::milliseconds(500)); - const auto status_while_task_blocked = - stop_all.wait_for(std::chrono::milliseconds::zero()); - blocking_stop_task->releaseStopActivity(); - - ASSERT_EQ( - stop_all.wait_for(std::chrono::seconds(1)), - std::future_status::ready); - const auto [status, response] = stop_all.get(); - - EXPECT_TRUE(task_stop_entered); - EXPECT_TRUE(arm_stop_dispatched); - EXPECT_TRUE(camera_stop_dispatched); - EXPECT_EQ(status_while_task_blocked, std::future_status::timeout); - EXPECT_EQ(blocking_stop_task->stopActivityCalls(), 1); - EXPECT_EQ(blocking_stop_task->lifecycleStopCalls(), 0); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()) - << response.header().error_message(); -} - -TEST_F(GrpcSystemServiceTest, - StopAllDispatchesPeerArmStopWhileAnotherDriverIsBlocked) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - auto trace = std::make_shared(); - auto blocking_arm = std::make_shared( - "a-blocking-arm", trace); - auto peer_arm = std::make_shared( - "b-peer-arm", trace); - auto peer_camera = std::make_shared( - "c-peer-camera"); - manager.registerDevice(blocking_arm); - manager.registerDevice(peer_arm); - manager.registerDevice(peer_camera); - blocking_arm->blockNextStopMotion(); - service_ = std::make_unique(); - - api::StopAllCommand_Request request; - auto stop_all = std::async(std::launch::async, [this, &request] { - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll( - &context, &request, &response); - return std::make_pair(status, response); - }); - - const bool blocking_stop_entered = - blocking_arm->waitForBlockedStopMotion( - std::chrono::milliseconds(500)); - const bool peer_stop_dispatched = peer_arm->waitForStopMotionCalls( - 1, std::chrono::milliseconds(500)); - const bool peer_camera_stop_dispatched = - peer_camera->waitForStopRecordingCalls( - 1, std::chrono::milliseconds(500)); - const auto status_before_release = - stop_all.wait_for(std::chrono::milliseconds(0)); - blocking_arm->releaseBlockedStopMotion(); - const auto completion_status = - stop_all.wait_for(std::chrono::seconds(1)); - const auto [status, response] = stop_all.get(); - - EXPECT_TRUE(blocking_stop_entered); - EXPECT_TRUE(peer_stop_dispatched); - EXPECT_TRUE(peer_camera_stop_dispatched); - EXPECT_EQ(status_before_release, std::future_status::timeout); - EXPECT_EQ(completion_status, std::future_status::ready); - EXPECT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_GE(blocking_arm->stopMotionCalls(), 2); - EXPECT_GE(peer_arm->stopMotionCalls(), 2); - EXPECT_EQ(peer_camera->lifecycleStopCalls(), 0); -} - -TEST_F(GrpcSystemServiceTest, - StopAllRoundsAreSerializedAcrossSystemServiceInstances) -{ - initializeActionDevices(); - auto second_service = std::make_unique(); - action_arm_->blockNextStopMotion(); - - api::StopAllCommand_Request request; - auto first_stop = std::async(std::launch::async, [this, &request] { - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll(&context, &request, &response); - return std::make_pair(status, response); - }); - - const bool first_stop_entered = action_arm_->waitForBlockedStopMotion( - std::chrono::milliseconds(500)); - auto second_stop = std::async( - std::launch::async, - [&second_service, &request] { - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = second_service->StopAll( - &context, &request, &response); - return std::make_pair(status, response); - }); - - const auto second_before_release = - second_stop.wait_for(std::chrono::milliseconds(50)); - const int stop_calls_before_release = action_arm_->stopMotionCalls(); - action_arm_->releaseBlockedStopMotion(); - - EXPECT_TRUE(first_stop_entered); - EXPECT_EQ(second_before_release, std::future_status::timeout); - EXPECT_EQ(stop_calls_before_release, 1); - - const auto [first_status, first_response] = first_stop.get(); - const auto [second_status, second_response] = second_stop.get(); - EXPECT_TRUE(first_status.ok()) << first_status.error_message(); - EXPECT_TRUE(first_response.header().success()) - << first_response.header().error_message(); - EXPECT_TRUE(second_status.ok()) << second_status.error_message(); - EXPECT_TRUE(second_response.header().success()) - << second_response.header().error_message(); - EXPECT_EQ(first_response.operation_id(), second_response.operation_id()); - EXPECT_EQ( - first_response.current_safety_epoch(), - second_response.current_safety_epoch()); - EXPECT_EQ(action_arm_->stopMotionCalls(), 2); -} - -TEST_F(GrpcSystemServiceTest, - PrepareForShutdownDoesNotWaitForBlockedBusinessStopAll) -{ - initializeActionDevices(); - auto media_session = globalMediaActivityCoordinator().beginSession(); - ASSERT_TRUE(media_session); - - api::StopAllCommand_Request request; - auto stop_all = std::async(std::launch::async, [this, &request] { - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll(&context, &request, &response); - return std::make_pair(status, response); - }); - - ASSERT_TRUE(action_arm_->waitForStopMotionCalls( - 1, std::chrono::milliseconds(500))); - ASSERT_EQ( - stop_all.wait_for(std::chrono::milliseconds(20)), - std::future_status::timeout); - - auto shutdown = std::async(std::launch::async, [this] { - service_->prepareForShutdown(); - }); - EXPECT_EQ( - shutdown.wait_for(std::chrono::milliseconds(500)), - std::future_status::ready); - shutdown.get(); - - media_session.reset(); - ASSERT_EQ( - stop_all.wait_for(std::chrono::seconds(1)), - std::future_status::ready); - const auto [status, response] = stop_all.get(); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_FALSE(response.header().success()); - EXPECT_NE( - response.header().error_message().find( - "could not safely resume ActionQueue admission"), - std::string::npos); -} - -TEST_F(GrpcSystemServiceTest, - StopAllFailsClosedWhenAgvStoppedStateIsUnconfirmed) -{ - initializeActionDevices(); - action_agv_->setStoppedConfirmed(false); - - api::StopAllCommand_Request request; - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll( - &context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_FALSE(response.header().success()); - const auto* agv_target = findSafetyTarget(response, action_agv_->id()); - ASSERT_NE(agv_target, nullptr); - EXPECT_EQ( - agv_target->reason_code(), - api::COMMAND_REASON_CODE_DEVICE_STILL_MOVING); - EXPECT_EQ( - agv_target->result(), api::SAFETY_OPERATION_RESULT_FAILED); - const auto lease = - control::ControlAuthorityManager::instance().tryAcquire( - action_agv_->id(), - "normal-control-after-unconfirmed-stop-all", - std::chrono::hours(1)); - EXPECT_FALSE(lease.acquired); -} - -TEST_F(GrpcSystemServiceTest, - StopAllAcceptsProtectedArmAsQuiescent) -{ - initializeActionDevices(); - device::ArmState protected_state; - protected_state.connected = true; - protected_state.powered_on = true; - protected_state.moving = true; - protected_state.program_running = true; - protected_state.protective_stopped = true; - action_arm_->setReportedState(protected_state); - - api::StopAllCommand_Request request; - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll( - &context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_TRUE(response.header().success()) - << response.header().error_message(); - const auto* arm_target = findSafetyTarget(response, action_arm_->id()); - ASSERT_NE(arm_target, nullptr); - EXPECT_EQ( - arm_target->result(), api::SAFETY_OPERATION_RESULT_SUCCEEDED); -} - -TEST_F(GrpcSystemServiceTest, - StopAllDoesNotTreatGenericArmFaultAsQuiescent) -{ - initializeActionDevices(); - device::ArmState fault_state; - fault_state.connected = true; - fault_state.powered_on = true; - fault_state.moving = true; - fault_state.program_running = true; - fault_state.fault = true; - action_arm_->setReportedState(fault_state); - - api::StopAllCommand_Request request; - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll( - &context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_FALSE(response.header().success()); - const auto* arm_target = findSafetyTarget(response, action_arm_->id()); - ASSERT_NE(arm_target, nullptr); - EXPECT_EQ( - arm_target->result(), api::SAFETY_OPERATION_RESULT_FAILED); - EXPECT_EQ( - arm_target->reason_code(), - api::COMMAND_REASON_CODE_DEVICE_STILL_MOVING); -} - -TEST_F(GrpcSystemServiceTest, - StopAllStopsActiveMediaWithoutStoppingDeviceLifecycles) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - auto camera = std::make_shared("recording-camera"); - auto microphone = - std::make_shared("recording-microphone"); - auto speaker = std::make_shared("playing-speaker"); - manager.registerDevice(camera); - manager.registerDevice(microphone); - manager.registerDevice(speaker); - ASSERT_EQ( - globalCameraOperationalActivityRegistry().start( - camera->id(), camera), - CameraOperationalActivityRegistry::DispatchResult::Success); - service_ = std::make_unique(); - - api::StopAllCommand_Request request; - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll( - &context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ(camera->stopRecordingCalls(), 1); - EXPECT_FALSE(camera->isRecording()); - EXPECT_EQ(microphone->stopRecordingCalls(), 2); - EXPECT_FALSE(microphone->isRecording()); - EXPECT_EQ(speaker->stopPlaybackCalls(), 2); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); - EXPECT_GE(camera->operationalStopCalls(), 2); - EXPECT_FALSE(camera->operationalActive()); - EXPECT_EQ(microphone->lifecycleStopCalls(), 0); - EXPECT_EQ(speaker->lifecycleStopCalls(), 0); -} - -TEST_F(GrpcSystemServiceTest, - StopAllStopsUntrackedInventoryCameraOperationalActivity) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - auto camera = std::make_shared( - "untracked-inventory-camera"); - camera->setRecording(false); - ASSERT_TRUE(camera->startOperationalActivity()); - manager.registerDevice(camera); - service_ = std::make_unique(); - - api::StopAllCommand_Request request; - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll( - &context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ(camera->operationalStopCalls(), 2); - EXPECT_FALSE(camera->operationalActive()); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); -} - -TEST_F(GrpcSystemServiceTest, - StopAllRepeatsOperationalStopAfterAnOldMediaStartFinishes) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - auto camera = std::make_shared("raced-recording-camera"); - camera->blockNextStartRecording(); - manager.registerDevice(camera); - service_ = std::make_unique(); - - gRPCCameraServiceImpl camera_service; - api::StartCameraRecordingCommand_Request start_request; - start_request.mutable_header()->set_device_id(camera->id()); - start_request.set_video_path("raced.mp4"); - auto old_start = std::async( - std::launch::async, - [&] { - api::StartCameraRecordingCommand_Feedback response; - grpc::ServerContext context; - const auto status = camera_service.StartRecording( - &context, &start_request, &response); - return std::make_pair(status, response); - }); - ASSERT_TRUE(camera->waitForStartRecordingEntered( - std::chrono::milliseconds(500))); - - api::StopAllCommand_Request request; - auto stop_all = std::async(std::launch::async, [this, &request] { - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll(&context, &request, &response); - return std::make_pair(status, response); - }); - - ASSERT_TRUE(camera->waitForStopRecordingCalls( - 1, std::chrono::milliseconds(500))); - EXPECT_EQ( - stop_all.wait_for(std::chrono::milliseconds(20)), - std::future_status::timeout); - camera->releaseBlockedStartRecording(); - - ASSERT_EQ( - old_start.wait_for(std::chrono::seconds(1)), - std::future_status::ready); - const auto [start_status, start_response] = old_start.get(); - ASSERT_TRUE(start_status.ok()) << start_status.error_message(); - EXPECT_TRUE(start_response.header().success()) - << start_response.header().error_message(); - ASSERT_TRUE(camera->waitForStartRecordingCalls( - 1, std::chrono::milliseconds(500))); - ASSERT_EQ( - stop_all.wait_for(std::chrono::seconds(1)), - std::future_status::ready); - const auto [status, response] = stop_all.get(); - - ASSERT_TRUE(status.ok()) << status.error_message(); - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ(camera->stopRecordingCalls(), 2); - EXPECT_FALSE(camera->isRecording()); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); -} - -TEST_F(GrpcSystemServiceTest, - StopAllStopsMediaActivitiesAbsentFromDeviceManager) -{ - config::DeviceManagerConfig config; - device::DeviceManager::getInstance(config); - - constexpr const char* hub_source_id = "orphan-hub-camera"; - constexpr const char* hub_track_id = "orphan-hub-camera/video/color"; - media::TrackDescriptor::Config track_config; - track_config.id = hub_track_id; - track_config.source_id = hub_source_id; - track_config.kind = media::MediaKind::VIDEO; - track_config.time_base = {1, 90000}; - auto descriptor = media::makeTrackDescriptor(std::move(track_config)); - auto hub_stop_calls = std::make_shared>(0); - media::MediaSourceManager::SourceCallbacks callbacks; - callbacks.start = []( - const media::MediaSourceManager::FrameSink&, - const media::MediaSourceManager::CancelPredicate&) { - return true; - }; - callbacks.stop_confirmed = [hub_stop_calls] { - hub_stop_calls->fetch_add(1, std::memory_order_relaxed); - return true; - }; - auto& hub = media::globalMediaSourceManager(); - ASSERT_TRUE(hub.registerSource( - descriptor, std::move(callbacks), 2)); - auto subscription = hub.subscribe(hub_track_id); - ASSERT_TRUE(subscription.valid()); - - auto operational_camera = std::make_shared( - "orphan-operational-camera"); - operational_camera->setRecording(false); - ASSERT_EQ( - globalCameraOperationalActivityRegistry().start( - operational_camera->id(), operational_camera), - CameraOperationalActivityRegistry::DispatchResult::Success); - - auto ptz_camera = std::make_shared( - "orphan-ptz-camera"); - ASSERT_EQ( - globalCameraPtzActivityRegistry().control( - ptz_camera->id(), - ptz_camera, - device::PtzCommand::PanLeft, - false, - 3), - CameraPtzActivityRegistry::DispatchResult::Success); - - service_ = std::make_unique(); - api::StopAllCommand_Request request; - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll( - &context, &request, &response); - - ASSERT_TRUE(status.ok()) << status.error_message(); - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_EQ(hub_stop_calls->load(std::memory_order_relaxed), 1); - EXPECT_FALSE(subscription.valid()); - EXPECT_TRUE(hub.trackedSourceIds().empty()); - EXPECT_EQ(operational_camera->operationalStopCalls(), 1); - EXPECT_FALSE(operational_camera->operationalActive()); - EXPECT_EQ(operational_camera->lifecycleStopCalls(), 0); - EXPECT_EQ(operational_camera->stopRecordingCalls(), 0); - EXPECT_EQ(ptz_camera->ptzCalls(), 2); - EXPECT_FALSE(ptz_camera->ptzActive()); - EXPECT_EQ(ptz_camera->lifecycleStopCalls(), 0); - EXPECT_EQ(ptz_camera->stopRecordingCalls(), 0); -} - -TEST_F(GrpcSystemServiceTest, - StopAllMediaFailuresLeaveActionQueuePaused) -{ - initializeActionDevices(); - auto& manager = device::DeviceManager::getInstance(); - auto camera = std::make_shared( - "camera-remains-recording", false); - auto microphone = std::make_shared( - "microphone-stop-throws", true, true); - auto speaker = std::make_shared( - "speaker-stop-fails", false); - manager.registerDevice(camera); - manager.registerDevice(microphone); - manager.registerDevice(speaker); - - api::StopAllCommand_Request stop_request; - api::StopAllCommand_Feedback stop_response; - grpc::ServerContext stop_context; - const auto stop_status = service_->StopAll( - &stop_context, &stop_request, &stop_response); - - api::ActionQueueCommand_Request action_request; - action_request.set_action_id("action-after-media-stop-failure"); - addMoveLStep( - action_request, "must-not-run", action_arm_->id(), 1.0); - const auto action_response = executeAction(action_request); - - ASSERT_TRUE(stop_status.ok()) << stop_status.error_message(); - EXPECT_FALSE(stop_response.header().success()); - const auto* camera_target = findSafetyTarget( - stop_response, camera->id()); - ASSERT_NE(camera_target, nullptr); - EXPECT_EQ( - camera_target->reason_code(), - api::COMMAND_REASON_CODE_STOP_UNCONFIRMED); - EXPECT_EQ(camera->stopRecordingCalls(), 2); - EXPECT_TRUE(camera->isRecording()); - EXPECT_EQ(microphone->stopRecordingCalls(), 2); - EXPECT_TRUE(microphone->isRecording()); - EXPECT_EQ(speaker->stopPlaybackCalls(), 2); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); - EXPECT_EQ(microphone->lifecycleStopCalls(), 0); - EXPECT_EQ(speaker->lifecycleStopCalls(), 0); - EXPECT_FALSE(action_response.header().success()); - EXPECT_EQ( - action_response.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_NE( - action_response.header().error_message().find( - "temporarily paused by StopAll"), - std::string::npos); - EXPECT_EQ(action_arm_->motionCalls(), 0); -} - -TEST_F(GrpcSystemServiceTest, - ActionQueueCancellationStopsActiveLaterArmBeforeEarlierArm) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - action_trace_ = std::make_shared(); - auto earlier_arm = std::make_shared( - "earlier-arm", action_trace_); - auto active_arm = std::make_shared( - "active-arm", action_trace_); - manager.registerDevice(earlier_arm); - manager.registerDevice(active_arm); - service_ = std::make_unique(); - api::GetSystemInfoCommand_Request info_request; - api::GetSystemInfoCommand_Feedback info_response; - grpc::ServerContext info_context; - ASSERT_TRUE(service_->GetSystemInfo( - &info_context, &info_request, &info_response).ok()); - service_instance_id_ = info_response.action_service_instance_id(); - ASSERT_FALSE(service_instance_id_.empty()); - - active_arm->blockNextMotion(); - api::ActionQueueCommand_Request request; - request.set_action_id("cancel-active-later-arm-first"); - request.set_total_timeout_ms(1000U); - addMoveLStep(request, "earlier-completes", earlier_arm->id(), 1.0); - addMoveLStep(request, "active-blocks", active_arm->id(), 2.0); - - auto action = std::async( - std::launch::async, - [this, request]() { return executeAction(request); }); - const bool active_started = active_arm->waitForMotionCalls( - 1, std::chrono::milliseconds(500)); - - service_->prepareForShutdown(); - const auto response = action.get(); - - api::ActionQueueCommand_Request rejected_request; - rejected_request.set_action_id("action-after-service-shutdown"); - addMoveLStep( - rejected_request, "must-not-run", earlier_arm->id(), 3.0); - const auto rejected_response = executeAction(rejected_request); - - const auto trace = action_trace_->names(); - const auto active_stop = std::find( - trace.begin(), trace.end(), "arm:stop:active-arm"); - const auto earlier_stop = std::find( - trace.begin(), trace.end(), "arm:stop:earlier-arm"); - - ASSERT_TRUE(active_started); - EXPECT_EQ(response.result(), api::ACTION_RESULT_CODE_CANCELED); - EXPECT_EQ(response.completed_steps(), 1U); - ASSERT_TRUE(response.has_failed_step_index()); - EXPECT_EQ(response.failed_step_index(), 1U); - ASSERT_NE(active_stop, trace.end()); - ASSERT_NE(earlier_stop, trace.end()); - EXPECT_LT(active_stop, earlier_stop); - EXPECT_FALSE(rejected_response.header().success()); - EXPECT_EQ( - rejected_response.result(), api::ACTION_RESULT_CODE_REJECTED); - EXPECT_NE( - rejected_response.header().error_message().find("shutting down"), - std::string::npos); - EXPECT_EQ(earlier_arm->motionCalls(), 1); - EXPECT_EQ(active_arm->motionCalls(), 1); -} - -TEST_F(GrpcSystemServiceTest, - RetriedStopAllReusesTimedOutArmBarrierAndCanRecover) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - auto trace = std::make_shared(); - auto arm = std::make_shared( - "preempted-handler-arm", trace); - manager.registerDevice(arm); - - auto& authority = control::ControlAuthorityManager::instance(); - const auto old_handler = authority.tryAcquire( - arm->id(), "blocked-control-handler", std::chrono::seconds(30)); - ASSERT_TRUE(old_handler.acquired) << old_handler.detail; - service_ = std::make_unique( - std::chrono::milliseconds(300)); - - api::StopAllCommand_Request request; - auto stop_all = std::async(std::launch::async, [this, &request] { - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll( - &context, &request, &response); - return std::make_pair(status, response); - }); - - const bool initial_stop_completed = arm->waitForStopMotionCalls( - 1, std::chrono::milliseconds(500)); - if (initial_stop_completed) { - arm->blockNextStopMotion(); - } - const auto completion = stop_all.wait_for(std::chrono::seconds(1)); - const bool final_stop_started = initial_stop_completed && - arm->waitForBlockedStopMotion(std::chrono::milliseconds(500)); - - ASSERT_EQ(completion, std::future_status::ready); - const auto [status, response] = stop_all.get(); - const auto stop_calls_before_retry = arm->stopMotionCalls(); - const auto control_while_failed_closed = authority.tryAcquire( - arm->id(), "control-after-timed-out-stop-all", - std::chrono::seconds(30)); - - // Let the deadline-overrunning final typed stop finish before retrying the - // retained barrier. The old control owner is then allowed to drain. - arm->releaseBlockedStopMotion(); - authority.release(old_handler.token); - - auto second_service = std::make_unique( - std::chrono::seconds(1)); - api::StopAllCommand_Feedback second_response; - grpc::ServerContext second_context; - const auto second_status = second_service->StopAll( - &second_context, &request, &second_response); - const auto recovered_control = authority.tryAcquire( - arm->id(), "control-after-retried-stop-all", - std::chrono::seconds(30)); - if (recovered_control.acquired) { - authority.release(recovered_control.token); - } - - EXPECT_TRUE(initial_stop_completed); - EXPECT_TRUE(final_stop_started); - ASSERT_TRUE(status.ok()) << status.error_message(); - EXPECT_FALSE(response.header().success()); - const auto* failed_arm = findSafetyTarget(response, arm->id()); - ASSERT_NE(failed_arm, nullptr); - EXPECT_EQ( - failed_arm->reason_code(), - api::COMMAND_REASON_CODE_PARTICIPANT_TIMEOUT); - ASSERT_TRUE(second_status.ok()) << second_status.error_message(); - EXPECT_TRUE(second_response.header().success()) - << second_response.header().error_message(); - EXPECT_EQ(stop_calls_before_retry, 2); - EXPECT_GE(arm->stopMotionCalls(), 4); - EXPECT_FALSE(control_while_failed_closed.acquired); - EXPECT_TRUE(recovered_control.acquired) << recovered_control.detail; -} - -TEST_F(GrpcSystemServiceTest, - StopAllDoesNotStopDeviceLifecyclesAndRevokesOnlyArmLease) -{ - config::DeviceManagerConfig config; - auto& manager = device::DeviceManager::getInstance(config); - auto trace = std::make_shared(); - auto arm = std::make_shared("leased_arm", trace); - auto camera = std::make_shared("leased_camera"); - auto already_stopping_arm = std::make_shared( - "already_stopping_arm", trace); - manager.registerDevice(arm); - manager.registerDevice(camera); - manager.registerDevice(already_stopping_arm); - - auto& authority = control::ControlAuthorityManager::instance(); - const auto arm_lease = authority.tryAcquire( - arm->id(), "arm-session", std::chrono::seconds(30)); - const auto camera_lease = authority.tryAcquire( - camera->id(), "camera-session", std::chrono::seconds(30)); - const auto existing_stop_barrier = authority.preemptAcquire( - already_stopping_arm->id(), - "existing-stop", - std::chrono::seconds(30)); - ASSERT_TRUE(arm_lease.acquired) << arm_lease.detail; - ASSERT_TRUE(camera_lease.acquired) << camera_lease.detail; - ASSERT_TRUE(existing_stop_barrier.acquired) - << existing_stop_barrier.detail; - ASSERT_TRUE(authority.validate(arm_lease.token)); - ASSERT_TRUE(authority.validate(camera_lease.token)); - - service_ = std::make_unique(); - api::StopAllCommand_Request request; - auto stop_all = std::async(std::launch::async, [this, &request] { - api::StopAllCommand_Feedback response; - grpc::ServerContext context; - const auto status = service_->StopAll( - &context, &request, &response); - return std::make_pair(status, response); - }); - ASSERT_TRUE(arm->waitForStopMotionCalls( - 1, std::chrono::milliseconds(500))); - EXPECT_FALSE(authority.validate(arm_lease.token)); - EXPECT_EQ( - stop_all.wait_for(std::chrono::milliseconds(20)), - std::future_status::timeout); - authority.release(arm_lease.token); - ASSERT_EQ( - stop_all.wait_for(std::chrono::seconds(1)), - std::future_status::ready); - const auto [status, response] = stop_all.get(); - - ASSERT_TRUE(status.ok()) << status.error_message(); - ASSERT_TRUE(response.header().success()) - << response.header().error_message(); - EXPECT_GE(arm->stopMotionCalls(), 2); - EXPECT_EQ(arm->lifecycleStopCalls(), 0); - EXPECT_EQ(arm->shutdownCalls(), 0); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); - EXPECT_EQ(camera->stopRecordingCalls(), 1); - EXPECT_FALSE(camera->isRecording()); - EXPECT_GE(already_stopping_arm->stopMotionCalls(), 2); - EXPECT_EQ(already_stopping_arm->lifecycleStopCalls(), 0); - EXPECT_EQ(already_stopping_arm->shutdownCalls(), 0); - EXPECT_FALSE(authority.validate(arm_lease.token)); - EXPECT_FALSE(authority.isLeased(arm->id())); - EXPECT_TRUE(authority.validate(camera_lease.token)); - EXPECT_TRUE(authority.isLeased(camera->id())); - EXPECT_TRUE(authority.validate(existing_stop_barrier.token)); - EXPECT_TRUE(authority.isLeased(already_stopping_arm->id())); - const auto move_after_stop = authority.tryAcquire( - arm->id(), "move-after-stop", std::chrono::seconds(30)); - EXPECT_TRUE(move_after_stop.acquired) << move_after_stop.detail; - authority.release(move_after_stop.token); - authority.release(existing_stop_barrier.token); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/server/tests/media_activity_coordinator_test.cpp b/cmvr-es/service/grpc/server/tests/media_activity_coordinator_test.cpp deleted file mode 100644 index 17ca7db1..00000000 --- a/cmvr-es/service/grpc/server/tests/media_activity_coordinator_test.cpp +++ /dev/null @@ -1,279 +0,0 @@ -#include "service/grpc/server/include/media_activity_coordinator.h" - -#include -#include -#include -#include -#include -#include - -namespace { - -bool check(const bool condition, const char* expression, const int line) -{ - if (condition) { - return true; - } - std::cerr << "CHECK failed at line " << line << ": " << expression << '\n'; - return false; -} - -#define CHECK_TRUE(expression) \ - do { \ - if (!check(static_cast(expression), #expression, __LINE__)) { \ - return 1; \ - } \ - } while (false) - -} // namespace - -int main() -{ - using namespace std::chrono_literals; - - { - cmvr::service::MediaActivityCoordinator dispatch_coordinator; - auto dispatch_session = dispatch_coordinator.beginSession(); - CHECK_TRUE(dispatch_session); - - std::promise dispatch_entered; - auto dispatch_entered_future = dispatch_entered.get_future(); - std::promise release_dispatch; - auto release_dispatch_future = release_dispatch.get_future(); - auto dispatch_future = std::async(std::launch::async, [&] { - return dispatch_session.runIfCurrent([&] { - dispatch_entered.set_value(); - release_dispatch_future.wait(); - }); - }); - dispatch_entered_future.wait(); - - const auto dispatch_ticket = dispatch_coordinator.beginStopAll(); - CHECK_TRUE(dispatch_ticket.valid()); - CHECK_TRUE(!dispatch_coordinator.waitForStopped( - dispatch_ticket, 20ms)); - - release_dispatch.set_value(); - CHECK_TRUE(dispatch_future.get()); - - dispatch_session.reset(); - CHECK_TRUE(dispatch_coordinator.waitForStopped(dispatch_ticket, 100ms)); - CHECK_TRUE(dispatch_coordinator.finishStopAll(dispatch_ticket, true)); - } - - { - cmvr::service::MediaActivityCoordinator generation_coordinator; - auto old_generation_session = generation_coordinator.beginSession(); - CHECK_TRUE(old_generation_session); - - const auto generation_ticket = generation_coordinator.beginStopAll(); - CHECK_TRUE(generation_ticket.valid()); - - std::atomic dispatched_operations{0}; - CHECK_TRUE(!old_generation_session.runIfCurrent( - [&] { ++dispatched_operations; })); - CHECK_TRUE(dispatched_operations.load(std::memory_order_acquire) == 0); - - old_generation_session.reset(); - CHECK_TRUE( - generation_coordinator.waitForStopped(generation_ticket, 100ms)); - CHECK_TRUE(generation_coordinator.finishStopAll(generation_ticket, true)); - - auto current_generation_session = generation_coordinator.beginSession(); - CHECK_TRUE(current_generation_session); - CHECK_TRUE(current_generation_session.runIfCurrent( - [&] { ++dispatched_operations; })); - CHECK_TRUE(dispatched_operations.load(std::memory_order_acquire) == 1); - } - - { - cmvr::service::MediaActivityCoordinator deferred_coordinator; - std::atomic deferred_cancel_calls{0}; - auto deferred_session = deferred_coordinator.beginSession( - [&] { ++deferred_cancel_calls; }); - CHECK_TRUE(deferred_session); - - const auto deferred_ticket = - deferred_coordinator.beginStopAll(true); - CHECK_TRUE(deferred_ticket.valid()); - CHECK_TRUE(deferred_session.cancelled()); - CHECK_TRUE(!deferred_session.runIfCurrent([] {})); - CHECK_TRUE( - deferred_cancel_calls.load(std::memory_order_acquire) == 0); - CHECK_TRUE( - deferred_coordinator.requestCancellation(deferred_ticket)); - CHECK_TRUE( - deferred_cancel_calls.load(std::memory_order_acquire) == 1); - CHECK_TRUE( - deferred_coordinator.requestCancellation(deferred_ticket)); - CHECK_TRUE( - deferred_cancel_calls.load(std::memory_order_acquire) == 1); - - deferred_session.reset(); - CHECK_TRUE( - deferred_coordinator.waitForStopped(deferred_ticket, 100ms)); - CHECK_TRUE( - deferred_coordinator.finishStopAll(deferred_ticket, true)); - CHECK_TRUE( - !deferred_coordinator.requestCancellation(deferred_ticket)); - } - - { - cmvr::service::MediaActivityCoordinator parallel_coordinator; - std::promise blocked_cancel_entered; - auto blocked_cancel_entered_future = - blocked_cancel_entered.get_future(); - std::promise release_blocked_cancel; - auto release_blocked_cancel_future = - release_blocked_cancel.get_future().share(); - std::promise peer_cancel_entered; - auto peer_cancel_entered_future = peer_cancel_entered.get_future(); - std::atomic blocked_cancel_calls{0}; - std::atomic peer_cancel_calls{0}; - - auto blocked_session = parallel_coordinator.beginSession([&] { - ++blocked_cancel_calls; - blocked_cancel_entered.set_value(); - release_blocked_cancel_future.wait(); - }); - auto peer_session = parallel_coordinator.beginSession([&] { - ++peer_cancel_calls; - peer_cancel_entered.set_value(); - }); - CHECK_TRUE(blocked_session && peer_session); - - const auto ticket = parallel_coordinator.beginStopAll(true); - std::vector operations; - std::string collect_error; - CHECK_TRUE(parallel_coordinator.collectCancellationOperations( - ticket, operations, &collect_error)); - CHECK_TRUE(collect_error.empty()); - CHECK_TRUE(operations.size() == 2); - CHECK_TRUE(operations[0].resource_key != operations[1].resource_key); - - auto first = std::async(std::launch::async, operations[0].operation); - auto second = std::async(std::launch::async, operations[1].operation); - CHECK_TRUE(blocked_cancel_entered_future.wait_for(100ms) == - std::future_status::ready); - CHECK_TRUE(peer_cancel_entered_future.wait_for(100ms) == - std::future_status::ready); - release_blocked_cancel.set_value(); - CHECK_TRUE(first.get().success); - CHECK_TRUE(second.get().success); - CHECK_TRUE(operations[0].operation().success); - CHECK_TRUE(operations[1].operation().success); - CHECK_TRUE(blocked_cancel_calls.load() == 1); - CHECK_TRUE(peer_cancel_calls.load() == 1); - - blocked_session.reset(); - peer_session.reset(); - CHECK_TRUE(parallel_coordinator.waitForStopped(ticket, 100ms)); - CHECK_TRUE(parallel_coordinator.finishStopAll(ticket, true)); - CHECK_TRUE(!parallel_coordinator.collectCancellationOperations( - ticket, operations, &collect_error)); - CHECK_TRUE(!collect_error.empty()); - } - - { - cmvr::service::MediaActivityCoordinator exception_coordinator; - std::atomic throwing_cancel_calls{0}; - auto throwing_session = exception_coordinator.beginSession([&] { - ++throwing_cancel_calls; - throw std::runtime_error("cancel failed"); - }); - CHECK_TRUE(throwing_session); - const auto ticket = exception_coordinator.beginStopAll(true); - std::vector operations; - CHECK_TRUE(exception_coordinator.collectCancellationOperations( - ticket, operations)); - CHECK_TRUE(operations.size() == 1); - const auto result = operations[0].operation(); - const auto cached_result = operations[0].operation(); - CHECK_TRUE(!result.success); - CHECK_TRUE(result.detail.find("cancel failed") != std::string::npos); - CHECK_TRUE(cached_result.detail == result.detail); - CHECK_TRUE(throwing_cancel_calls.load() == 1); - throwing_session.reset(); - CHECK_TRUE(exception_coordinator.waitForStopped(ticket, 100ms)); - CHECK_TRUE(!exception_coordinator.finishStopAll(ticket, false)); - } - - { - cmvr::service::DeferredStopOperation detached_operation; - cmvr::service::MediaActivityCoordinator::Session retained_session; - std::atomic detached_cancel_calls{0}; - { - cmvr::service::MediaActivityCoordinator ephemeral_coordinator; - retained_session = ephemeral_coordinator.beginSession( - [&] { ++detached_cancel_calls; }); - const auto ticket = - ephemeral_coordinator.beginStopAll(true); - std::vector operations; - CHECK_TRUE( - ephemeral_coordinator.collectCancellationOperations( - ticket, operations)); - CHECK_TRUE(operations.size() == 1); - detached_operation = std::move(operations[0]); - } - CHECK_TRUE(detached_operation.operation().success); - CHECK_TRUE(detached_cancel_calls.load() == 1); - retained_session.reset(); - } - - cmvr::service::MediaActivityCoordinator coordinator; - std::atomic cancel_calls{0}; - - auto old_session = coordinator.beginSession([&] { ++cancel_calls; }); - CHECK_TRUE(old_session); - CHECK_TRUE(old_session.claimExclusiveResource("speaker:test")); - - auto competing_session = coordinator.beginSession(); - CHECK_TRUE(competing_session); - CHECK_TRUE(!competing_session.claimExclusiveResource("speaker:test")); - competing_session.reset(); - - const auto ticket = coordinator.beginStopAll(); - CHECK_TRUE(ticket.valid()); - CHECK_TRUE(cancel_calls.load(std::memory_order_acquire) == 1); - CHECK_TRUE(old_session.cancelled()); - CHECK_TRUE(!old_session.runIfCurrent([] {})); - CHECK_TRUE(!coordinator.beginSession()); - CHECK_TRUE(!coordinator.waitForStopped(ticket, 5ms)); - - old_session.reset(); - CHECK_TRUE(coordinator.waitForStopped(ticket, 100ms)); - CHECK_TRUE(coordinator.finishStopAll(ticket, true)); - - auto resumed_session = coordinator.beginSession(); - CHECK_TRUE(resumed_session); - CHECK_TRUE(resumed_session.claimExclusiveResource("speaker:test")); - - const auto concurrent_ticket_a = coordinator.beginStopAll(); - const auto concurrent_ticket_b = coordinator.beginStopAll(); - resumed_session.reset(); - CHECK_TRUE(coordinator.waitForStopped(concurrent_ticket_a, 100ms)); - CHECK_TRUE(coordinator.finishStopAll(concurrent_ticket_a, true)); - CHECK_TRUE(!coordinator.beginSession()); - CHECK_TRUE(coordinator.finishStopAll(concurrent_ticket_b, true)); - CHECK_TRUE(coordinator.beginSession()); - - { - cmvr::service::MediaActivityCoordinator detailed_coordinator; - const auto first = detailed_coordinator.beginStopAll(true); - const auto second = detailed_coordinator.beginStopAll(true); - const auto first_result = - detailed_coordinator.finishStopAllDetailed(first, true); - CHECK_TRUE(first_result.ticket_consumed); - CHECK_TRUE(first_result.participant_stopped); - CHECK_TRUE(!first_result.admission_resumed); - const auto second_result = - detailed_coordinator.finishStopAllDetailed(second, true); - CHECK_TRUE(second_result.ticket_consumed); - CHECK_TRUE(second_result.participant_stopped); - CHECK_TRUE(second_result.admission_resumed); - CHECK_TRUE(detailed_coordinator.beginSession()); - } - - std::cout << "media_activity_coordinator_test: PASS\n"; - return 0; -} diff --git a/cmvr-es/service/grpc/server/tests/motor_activity_coordinator_test.cpp b/cmvr-es/service/grpc/server/tests/motor_activity_coordinator_test.cpp deleted file mode 100644 index 35d430f6..00000000 --- a/cmvr-es/service/grpc/server/tests/motor_activity_coordinator_test.cpp +++ /dev/null @@ -1,283 +0,0 @@ -#include "service/grpc/server/include/motor_activity_coordinator.h" - -#include -#include -#include -#include -#include -#include - -namespace { - -bool check(const bool condition, const char* expression, const int line) -{ - if (condition) { - return true; - } - std::cerr << "CHECK failed at line " << line << ": " << expression << '\n'; - return false; -} - -#define CHECK_TRUE(expression) \ - do { \ - if (!check(static_cast(expression), #expression, __LINE__)) { \ - return 1; \ - } \ - } while (false) - -} // namespace - -int main() -{ - using namespace std::chrono_literals; - using cmvr::service::MotorActivityCoordinator; - - MotorActivityCoordinator coordinator; - std::atomic cancel_calls{0}; - std::atomic quick_stop_calls{0}; - std::atomic busy{true}; - - auto registration = coordinator.registerControl( - [&] { ++cancel_calls; }, - [&] { - ++quick_stop_calls; - return true; - }, - [&] { return !busy.load(std::memory_order_acquire); }, - "test motor"); - CHECK_TRUE(registration); - - const auto ticket = coordinator.beginStopAll(); - CHECK_TRUE(ticket.valid()); - CHECK_TRUE(cancel_calls.load(std::memory_order_acquire) == 1); - CHECK_TRUE(!coordinator.lockAdmission().accepting()); - - std::string initial_error; - CHECK_TRUE(coordinator.requestStop(ticket, &initial_error)); - CHECK_TRUE(initial_error.empty()); - CHECK_TRUE(quick_stop_calls.load(std::memory_order_acquire) == 1); - - auto stop_future = std::async(std::launch::async, [&] { - std::string error; - return coordinator.waitForStopped(ticket, 1s, &error); - }); - CHECK_TRUE(stop_future.wait_for(20ms) == std::future_status::timeout); - - busy.store(false, std::memory_order_release); - coordinator.notifyStateChanged(); - CHECK_TRUE(stop_future.get()); - CHECK_TRUE(coordinator.finishStopAll(ticket, true)); - CHECK_TRUE(coordinator.lockAdmission().accepting()); - - std::atomic quick_stops_in_flight{0}; - std::atomic maximum_quick_stops{0}; - auto make_serial_registration = [&](const char* description) { - return coordinator.registerControl( - [] {}, - [&] { - const int active = ++quick_stops_in_flight; - int maximum = maximum_quick_stops.load(); - while (maximum < active && - !maximum_quick_stops.compare_exchange_weak( - maximum, active)) { - } - std::this_thread::sleep_for(5ms); - --quick_stops_in_flight; - return true; - }, - [] { return true; }, - description); - }; - auto serial_a = make_serial_registration("serial motor a"); - auto serial_b = make_serial_registration("serial motor b"); - CHECK_TRUE(serial_a && serial_b); - - const auto serial_ticket = coordinator.beginStopAll(); - CHECK_TRUE(serial_ticket.valid()); - CHECK_TRUE(coordinator.stopAndWait(serial_ticket, 1s)); - CHECK_TRUE(maximum_quick_stops.load(std::memory_order_acquire) == 1); - CHECK_TRUE(coordinator.finishStopAll(serial_ticket, true)); - - { - MotorActivityCoordinator parallel_coordinator; - std::promise blocked_stop_entered; - auto blocked_stop_entered_future = - blocked_stop_entered.get_future(); - std::promise release_blocked_stop; - auto release_blocked_stop_future = - release_blocked_stop.get_future().share(); - std::promise peer_stop_entered; - auto peer_stop_entered_future = peer_stop_entered.get_future(); - std::atomic blocked_cancel_calls{0}; - std::atomic blocked_stop_calls{0}; - std::atomic peer_cancel_calls{0}; - std::atomic peer_stop_calls{0}; - - auto blocked = parallel_coordinator.registerControl( - [&] { ++blocked_cancel_calls; }, - [&] { - if (blocked_cancel_calls.load() != 1) { - return false; - } - ++blocked_stop_calls; - blocked_stop_entered.set_value(); - release_blocked_stop_future.wait(); - return true; - }, - [] { return true; }, - "blocked motor"); - auto peer = parallel_coordinator.registerControl( - [&] { ++peer_cancel_calls; }, - [&] { - if (peer_cancel_calls.load() != 1) { - return false; - } - ++peer_stop_calls; - peer_stop_entered.set_value(); - return true; - }, - [] { return true; }, - "peer motor"); - CHECK_TRUE(blocked && peer); - - const auto parallel_ticket = - parallel_coordinator.beginStopAll(true); - CHECK_TRUE(parallel_ticket.valid()); - CHECK_TRUE(blocked_cancel_calls.load() == 0); - CHECK_TRUE(peer_cancel_calls.load() == 0); - std::vector operations; - std::string collect_error; - CHECK_TRUE(parallel_coordinator.collectStopOperations( - parallel_ticket, operations, &collect_error)); - CHECK_TRUE(collect_error.empty()); - CHECK_TRUE(operations.size() == 2); - CHECK_TRUE(operations[0].resource_key != operations[1].resource_key); - - auto first = std::async(std::launch::async, operations[0].operation); - auto second = std::async(std::launch::async, operations[1].operation); - CHECK_TRUE(blocked_stop_entered_future.wait_for(100ms) == - std::future_status::ready); - CHECK_TRUE(peer_stop_entered_future.wait_for(100ms) == - std::future_status::ready); - release_blocked_stop.set_value(); - CHECK_TRUE(first.get().success); - CHECK_TRUE(second.get().success); - CHECK_TRUE(operations[0].operation().success); - CHECK_TRUE(operations[1].operation().success); - CHECK_TRUE(blocked_cancel_calls.load() == 1); - CHECK_TRUE(blocked_stop_calls.load() == 1); - CHECK_TRUE(peer_cancel_calls.load() == 1); - CHECK_TRUE(peer_stop_calls.load() == 1); - CHECK_TRUE(parallel_coordinator.finishStopAll( - parallel_ticket, true)); - } - - { - MotorActivityCoordinator exception_coordinator; - std::atomic cancel_calls_for_exception{0}; - std::atomic stop_calls_after_exception{0}; - auto throwing = exception_coordinator.registerControl( - [&] { - ++cancel_calls_for_exception; - throw std::runtime_error("cancel failed"); - }, - [&] { - ++stop_calls_after_exception; - throw std::runtime_error("quick-stop failed"); - return false; - }, - [] { return true; }, - "throwing motor"); - CHECK_TRUE(throwing); - const auto exception_ticket = - exception_coordinator.beginStopAll(true); - std::vector operations; - CHECK_TRUE(exception_coordinator.collectStopOperations( - exception_ticket, operations)); - CHECK_TRUE(operations.size() == 1); - const auto first_result = operations[0].operation(); - const auto cached_result = operations[0].operation(); - CHECK_TRUE(!first_result.success); - CHECK_TRUE(first_result.detail.find("cancel failed") != - std::string::npos); - CHECK_TRUE(first_result.detail.find("quick-stop failed") != - std::string::npos); - CHECK_TRUE(cached_result.detail == first_result.detail); - CHECK_TRUE(cancel_calls_for_exception.load() == 1); - CHECK_TRUE(stop_calls_after_exception.load() == 1); - CHECK_TRUE(!exception_coordinator.finishStopAll( - exception_ticket, false)); - } - - { - cmvr::service::DeferredStopOperation detached_operation; - MotorActivityCoordinator::Registration retained_registration; - std::atomic detached_cancel_calls{0}; - std::atomic detached_stop_calls{0}; - { - MotorActivityCoordinator ephemeral_coordinator; - retained_registration = ephemeral_coordinator.registerControl( - [&] { ++detached_cancel_calls; }, - [&] { - ++detached_stop_calls; - return true; - }, - [] { return true; }, - "detached motor"); - const auto ticket = - ephemeral_coordinator.beginStopAll(true); - std::vector operations; - CHECK_TRUE(ephemeral_coordinator.collectStopOperations( - ticket, operations)); - CHECK_TRUE(operations.size() == 1); - detached_operation = std::move(operations[0]); - } - CHECK_TRUE(detached_operation.operation().success); - CHECK_TRUE(detached_cancel_calls.load() == 1); - CHECK_TRUE(detached_stop_calls.load() == 1); - retained_registration.reset(); - } - - std::atomic stop_succeeds{false}; - auto failing = coordinator.registerControl( - [] {}, - [&] { return stop_succeeds.load(std::memory_order_acquire); }, - [] { return true; }, - "failing motor"); - CHECK_TRUE(failing); - - const auto failed_ticket = coordinator.beginStopAll(); - CHECK_TRUE(failed_ticket.valid()); - std::string error; - CHECK_TRUE(!coordinator.stopAndWait(failed_ticket, 100ms, &error)); - CHECK_TRUE(!error.empty()); - CHECK_TRUE(!coordinator.finishStopAll(failed_ticket, false)); - CHECK_TRUE(!coordinator.lockAdmission().accepting()); - - stop_succeeds.store(true, std::memory_order_release); - const auto recovery_ticket = coordinator.beginStopAll(); - CHECK_TRUE(recovery_ticket.valid()); - CHECK_TRUE(coordinator.stopAndWait(recovery_ticket, 1s, &error)); - CHECK_TRUE(coordinator.finishStopAll(recovery_ticket, true)); - CHECK_TRUE(coordinator.lockAdmission().accepting()); - - { - MotorActivityCoordinator detailed_coordinator; - const auto first = detailed_coordinator.beginStopAll(true); - const auto second = detailed_coordinator.beginStopAll(true); - const auto first_result = - detailed_coordinator.finishStopAllDetailed(first, true); - CHECK_TRUE(first_result.ticket_consumed); - CHECK_TRUE(first_result.participant_stopped); - CHECK_TRUE(!first_result.admission_resumed); - const auto second_result = - detailed_coordinator.finishStopAllDetailed(second, true); - CHECK_TRUE(second_result.ticket_consumed); - CHECK_TRUE(second_result.participant_stopped); - CHECK_TRUE(second_result.admission_resumed); - CHECK_TRUE(detailed_coordinator.lockAdmission().accepting()); - } - - std::cout << "motor_activity_coordinator_test: PASS\n"; - return 0; -} diff --git a/cmvr-es/service/grpc/stop_all/tests/stop_all_admission_gate_test.cpp b/cmvr-es/service/grpc/stop_all/tests/stop_all_admission_gate_test.cpp deleted file mode 100644 index 21990915..00000000 --- a/cmvr-es/service/grpc/stop_all/tests/stop_all_admission_gate_test.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" - -#include - -namespace cmvr::service { -namespace { - -TEST(StopAllAdmissionGateTest, SuccessfulRoundReopensAdmission) -{ - StopAllAdmissionGate gate; - { - const auto before = gate.lockAdmission(); - EXPECT_TRUE(before.accepting()); - } - - const auto ticket = gate.beginStopAll(); - ASSERT_TRUE(ticket.valid()); - { - const auto blocked = gate.lockAdmission(); - EXPECT_FALSE(blocked.accepting()); - EXPECT_EQ(blocked.generation(), ticket.generation); - } - EXPECT_TRUE(gate.finishStopAll(ticket, true)); - EXPECT_TRUE(gate.lockAdmission().accepting()); -} - -TEST(StopAllAdmissionGateTest, FailedRoundStaysClosedAndCanBeRecovered) -{ - StopAllAdmissionGate gate; - const auto failed_ticket = gate.beginStopAll(); - ASSERT_TRUE(failed_ticket.valid()); - EXPECT_FALSE(gate.finishStopAll(failed_ticket, false)); - EXPECT_FALSE(gate.lockAdmission().accepting()); - - const auto recovery_ticket = gate.beginStopAll(); - ASSERT_TRUE(recovery_ticket.valid()); - EXPECT_TRUE(gate.finishStopAll(recovery_ticket, true)); - EXPECT_TRUE(gate.lockAdmission().accepting()); -} - -TEST(StopAllAdmissionGateTest, EveryConcurrentParticipantMustSucceed) -{ - StopAllAdmissionGate gate; - const auto first = gate.beginStopAll(); - const auto second = gate.beginStopAll(); - ASSERT_TRUE(first.valid()); - ASSERT_TRUE(second.valid()); - - EXPECT_TRUE(gate.finishStopAll(first, true)); - EXPECT_FALSE(gate.lockAdmission().accepting()); - EXPECT_FALSE(gate.finishStopAll(second, false)); - EXPECT_FALSE(gate.lockAdmission().accepting()); -} - -TEST(StopAllAdmissionGateTest, - DetailedFinishDoesNotReportRecoveryAfterAnotherParticipantFailed) -{ - StopAllAdmissionGate gate; - const auto system_ticket = gate.beginStopAll(); - const auto failed_participant = gate.beginStopAll(); - - const auto failed_result = - gate.finishStopAllDetailed(failed_participant, false); - EXPECT_TRUE(failed_result.ticket_consumed); - EXPECT_FALSE(failed_result.admission_reopened); - - const auto system_result = - gate.finishStopAllDetailed(system_ticket, true); - EXPECT_TRUE(system_result.ticket_consumed); - EXPECT_FALSE(system_result.admission_reopened); - EXPECT_FALSE(gate.lockAdmission().accepting()); -} - -TEST(StopAllAdmissionGateTest, - DetailedFinishSeparatesConsumptionFromOutstandingParticipants) -{ - StopAllAdmissionGate gate; - const auto first = gate.beginStopAll(); - const auto second = gate.beginStopAll(); - - const auto first_result = gate.finishStopAllDetailed(first, true); - EXPECT_TRUE(first_result.ticket_consumed); - EXPECT_FALSE(first_result.admission_reopened); - - const auto second_result = gate.finishStopAllDetailed(second, true); - EXPECT_TRUE(second_result.ticket_consumed); - EXPECT_TRUE(second_result.admission_reopened); - EXPECT_TRUE(gate.lockAdmission().accepting()); -} - -TEST(StopAllAdmissionGateTest, TestClearInvalidatesOutstandingTickets) -{ - StopAllAdmissionGate gate; - const auto stale = gate.beginStopAll(); - ASSERT_TRUE(stale.valid()); - - gate.clearForTesting(); - - EXPECT_TRUE(gate.lockAdmission().accepting()); - EXPECT_FALSE(gate.finishStopAll(stale, true)); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/service/grpc/stop_all/tests/stop_operation_dispatcher_test.cpp b/cmvr-es/service/grpc/stop_all/tests/stop_operation_dispatcher_test.cpp deleted file mode 100644 index 562cd05b..00000000 --- a/cmvr-es/service/grpc/stop_all/tests/stop_operation_dispatcher_test.cpp +++ /dev/null @@ -1,399 +0,0 @@ -#include "service/grpc/stop_all/include/stop_operation_dispatcher.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace cmvr::service { -namespace { - -using namespace std::chrono_literals; - -TEST(StopOperationDispatcherTest, RejectsEmptyKeysAndOperations) -{ - StopOperationDispatcher dispatcher; - StopOperationDispatcher::Operation empty_operation; - - const auto empty_key = dispatcher.submit("", [] { - return StopOperationDispatcher::OperationResult{true, {}}; - }); - const auto empty_callback = dispatcher.submit( - "arm:one", std::move(empty_operation)); - - EXPECT_FALSE(empty_key.valid()); - EXPECT_FALSE(empty_callback.valid()); - const auto invalid_result = empty_key.waitUntil( - StopOperationDispatcher::Clock::now()); - EXPECT_FALSE(invalid_result.completed); - EXPECT_FALSE(invalid_result.result); - EXPECT_FALSE(invalid_result.detail.empty()); -} - -TEST(StopOperationDispatcherTest, ReturnsOperationOutcome) -{ - StopOperationDispatcher dispatcher; - const auto handle = dispatcher.submit("arm:one", [] { - return StopOperationDispatcher::OperationResult{ - false, "driver did not confirm idle"}; - }); - - ASSERT_TRUE(handle.valid()); - const auto result = handle.waitUntil( - StopOperationDispatcher::Clock::now() + 1s); - EXPECT_TRUE(result.completed); - EXPECT_FALSE(result.result); - EXPECT_EQ(result.detail, "driver did not confirm idle"); -} - -TEST(StopOperationDispatcherTest, TimeoutDoesNotCancelTheJob) -{ - StopOperationDispatcher dispatcher; - std::promise release; - auto released = release.get_future().share(); - const auto handle = dispatcher.submit("agv:one", [released] { - released.wait(); - return StopOperationDispatcher::OperationResult{true, "stopped"}; - }); - - const auto timed_out = handle.waitUntil( - StopOperationDispatcher::Clock::now() + 20ms); - EXPECT_FALSE(timed_out.completed); - EXPECT_FALSE(timed_out.result); - - release.set_value(); - const auto completed = handle.waitUntil( - StopOperationDispatcher::Clock::now() + 1s); - EXPECT_TRUE(completed.completed); - EXPECT_TRUE(completed.result); - EXPECT_EQ(completed.detail, "stopped"); -} - -TEST(StopOperationDispatcherTest, - RunningJobKeepsItsOriginalTimeoutDetailProvider) -{ - StopOperationDispatcher dispatcher; - std::promise release; - auto released = release.get_future().share(); - std::atomic first_operation_calls{0}; - std::atomic duplicate_operation_calls{0}; - std::atomic first_provider_calls{0}; - std::atomic duplicate_provider_calls{0}; - - const auto first = dispatcher.submit( - "arm:one", - [&] { - ++first_operation_calls; - released.wait(); - return StopOperationDispatcher::OperationResult{true, {}}; - }, - [&] { - ++first_provider_calls; - return std::string("first job is waiting for its handler"); - }); - const auto duplicate = dispatcher.submit( - "arm:one", - [&] { - ++duplicate_operation_calls; - return StopOperationDispatcher::OperationResult{true, {}}; - }, - [&] { - ++duplicate_provider_calls; - return std::string("duplicate submission detail"); - }); - - const auto first_timeout = first.waitUntil( - StopOperationDispatcher::Clock::now() + 20ms); - const auto duplicate_timeout = duplicate.waitUntil( - StopOperationDispatcher::Clock::now() + 20ms); - release.set_value(); - const auto completed = first.waitUntil( - StopOperationDispatcher::Clock::now() + 1s); - - EXPECT_FALSE(first_timeout.completed); - EXPECT_EQ( - first_timeout.detail, "first job is waiting for its handler"); - EXPECT_FALSE(duplicate_timeout.completed); - EXPECT_EQ( - duplicate_timeout.detail, "first job is waiting for its handler"); - EXPECT_TRUE(completed.completed); - EXPECT_TRUE(completed.result); - EXPECT_EQ(first_operation_calls.load(), 1); - EXPECT_EQ(duplicate_operation_calls.load(), 0); - EXPECT_EQ(first_provider_calls.load(), 2); - EXPECT_EQ(duplicate_provider_calls.load(), 0); -} - -TEST(StopOperationDispatcherTest, - ThrowingTimeoutDetailProviderFallsBackToGenericDetail) -{ - StopOperationDispatcher dispatcher; - std::promise release; - auto released = release.get_future().share(); - const auto handle = dispatcher.submit( - "arm:one", - [released] { - released.wait(); - return StopOperationDispatcher::OperationResult{true, {}}; - }, - []() -> std::string { - throw std::runtime_error("diagnostic provider failed"); - }); - - const auto timed_out = handle.waitUntil( - StopOperationDispatcher::Clock::now() + 20ms); - release.set_value(); - - EXPECT_FALSE(timed_out.completed); - EXPECT_FALSE(timed_out.result); - EXPECT_EQ( - timed_out.detail, - "stop operation did not complete before the deadline"); -} - -TEST(StopOperationDispatcherTest, RunningSubmissionsForAKeyShareOneJob) -{ - StopOperationDispatcher dispatcher; - std::promise started; - std::promise release; - auto released = release.get_future().share(); - std::atomic first_calls{0}; - std::atomic duplicate_calls{0}; - - const auto first = dispatcher.submit("arm:one", [&] { - ++first_calls; - started.set_value(); - released.wait(); - return StopOperationDispatcher::OperationResult{true, "first"}; - }); - ASSERT_EQ(started.get_future().wait_for(1s), std::future_status::ready); - - const auto duplicate = dispatcher.submit("arm:one", [&] { - ++duplicate_calls; - return StopOperationDispatcher::OperationResult{false, "duplicate"}; - }); - release.set_value(); - - const auto first_result = first.waitUntil( - StopOperationDispatcher::Clock::now() + 1s); - const auto duplicate_result = duplicate.waitUntil( - StopOperationDispatcher::Clock::now() + 1s); - EXPECT_TRUE(first_result.completed); - EXPECT_TRUE(first_result.result); - EXPECT_EQ(first_result.detail, "first"); - EXPECT_TRUE(duplicate_result.completed); - EXPECT_TRUE(duplicate_result.result); - EXPECT_EQ(duplicate_result.detail, "first"); - EXPECT_EQ(first_calls.load(), 1); - EXPECT_EQ(duplicate_calls.load(), 0); -} - -TEST(StopOperationDispatcherTest, ConcurrentSubmissionsForAKeyShareOneJob) -{ - StopOperationDispatcher dispatcher; - constexpr int submitter_count = 12; - std::promise release; - auto released = release.get_future().share(); - std::atomic operation_calls{0}; - std::mutex handles_mutex; - std::vector handles; - std::vector submitters; - handles.reserve(submitter_count); - submitters.reserve(submitter_count); - - for (int index = 0; index < submitter_count; ++index) { - submitters.emplace_back([&] { - auto handle = dispatcher.submit("dexhand:one", [&] { - ++operation_calls; - released.wait(); - return StopOperationDispatcher::OperationResult{true, {}}; - }); - std::lock_guard lock(handles_mutex); - handles.emplace_back(std::move(handle)); - }); - } - for (auto& submitter : submitters) { - submitter.join(); - } - release.set_value(); - - ASSERT_EQ(handles.size(), static_cast(submitter_count)); - const auto deadline = StopOperationDispatcher::Clock::now() + 1s; - for (const auto& handle : handles) { - const auto result = handle.waitUntil(deadline); - EXPECT_TRUE(result.completed); - EXPECT_TRUE(result.result); - } - EXPECT_EQ(operation_calls.load(), 1); -} - -TEST(StopOperationDispatcherTest, CompletedJobIsReapedBeforeNextSubmission) -{ - StopOperationDispatcher dispatcher; - std::atomic calls{0}; - - const auto first = dispatcher.submit("arm:one", [&] { - ++calls; - return StopOperationDispatcher::OperationResult{true, "round one"}; - }); - const auto first_result = first.waitUntil( - StopOperationDispatcher::Clock::now() + 1s); - ASSERT_TRUE(first_result.completed); - ASSERT_TRUE(first_result.result); - - const auto second = dispatcher.submit("arm:one", [&] { - ++calls; - return StopOperationDispatcher::OperationResult{true, "round two"}; - }); - const auto second_result = second.waitUntil( - StopOperationDispatcher::Clock::now() + 1s); - - EXPECT_TRUE(second_result.completed); - EXPECT_TRUE(second_result.result); - EXPECT_EQ(second_result.detail, "round two"); - EXPECT_EQ(calls.load(), 2); - EXPECT_EQ(first.waitUntil( - StopOperationDispatcher::Clock::now()).detail, "round one"); -} - -TEST(StopOperationDispatcherTest, SubmissionReapsAllCompletedJobs) -{ - StopOperationDispatcher dispatcher; - constexpr int completed_job_count = 24; - std::promise release; - auto released = release.get_future().share(); - std::vector handles; - handles.reserve(completed_job_count); - - for (int index = 0; index < completed_job_count; ++index) { - handles.emplace_back(dispatcher.submit( - "arm:" + std::to_string(index), [released] { - released.wait(); - return StopOperationDispatcher::OperationResult{true, {}}; - })); - } - ASSERT_EQ(dispatcher.jobCountForTesting(), - static_cast(completed_job_count)); - - release.set_value(); - const auto deadline = StopOperationDispatcher::Clock::now() + 1s; - for (const auto& handle : handles) { - ASSERT_TRUE(handle.waitUntil(deadline).completed); - } - ASSERT_EQ(dispatcher.jobCountForTesting(), - static_cast(completed_job_count)); - - std::promise trigger_started; - std::promise release_trigger; - auto trigger_released = release_trigger.get_future().share(); - const auto trigger = dispatcher.submit( - "agv:cleanup-trigger", [&] { - trigger_started.set_value(); - trigger_released.wait(); - return StopOperationDispatcher::OperationResult{true, {}}; - }); - - ASSERT_EQ(trigger_started.get_future().wait_for(1s), - std::future_status::ready); - EXPECT_EQ(dispatcher.jobCountForTesting(), 1U); - - release_trigger.set_value(); - EXPECT_TRUE(trigger.waitUntil( - StopOperationDispatcher::Clock::now() + 1s).result); -} - -TEST(StopOperationDispatcherTest, DifferentKeysRunIndependently) -{ - StopOperationDispatcher dispatcher; - std::promise release_first; - auto first_released = release_first.get_future().share(); - std::promise second_started; - - const auto first = dispatcher.submit("camera:one", [first_released] { - first_released.wait(); - return StopOperationDispatcher::OperationResult{true, {}}; - }); - const auto second = dispatcher.submit("speaker:one", [&] { - second_started.set_value(); - return StopOperationDispatcher::OperationResult{true, {}}; - }); - - EXPECT_EQ( - second_started.get_future().wait_for(1s), - std::future_status::ready); - const auto second_result = second.waitUntil( - StopOperationDispatcher::Clock::now() + 1s); - EXPECT_TRUE(second_result.completed); - EXPECT_TRUE(second_result.result); - - release_first.set_value(); - EXPECT_TRUE(first.waitUntil( - StopOperationDispatcher::Clock::now() + 1s).result); -} - -TEST(StopOperationDispatcherTest, ConvertsOperationExceptionsToFailures) -{ - StopOperationDispatcher dispatcher; - const auto standard = dispatcher.submit("arm:one", []() - -> StopOperationDispatcher::OperationResult { - throw std::runtime_error("transport failed"); - }); - const auto unknown = dispatcher.submit("agv:one", []() - -> StopOperationDispatcher::OperationResult { - throw 42; - }); - - const auto deadline = StopOperationDispatcher::Clock::now() + 1s; - const auto standard_result = standard.waitUntil(deadline); - const auto unknown_result = unknown.waitUntil(deadline); - EXPECT_TRUE(standard_result.completed); - EXPECT_FALSE(standard_result.result); - EXPECT_NE(standard_result.detail.find("transport failed"), - std::string::npos); - EXPECT_TRUE(unknown_result.completed); - EXPECT_FALSE(unknown_result.result); - EXPECT_NE(unknown_result.detail.find("unknown exception"), - std::string::npos); -} - -TEST(StopOperationDispatcherTest, - DestructorWaitsForOutstandingWorkers) -{ - auto dispatcher = std::make_unique(); - std::promise started; - std::promise release; - auto released = release.get_future().share(); - const auto handle = dispatcher->submit("arm:one", [&] { - started.set_value(); - released.wait(); - return StopOperationDispatcher::OperationResult{ - true, "completed after dispatcher destruction"}; - }); - ASSERT_EQ(started.get_future().wait_for(1s), std::future_status::ready); - - auto destroy = std::async(std::launch::async, [&] { - dispatcher.reset(); - }); - EXPECT_EQ(destroy.wait_for(20ms), std::future_status::timeout); - - release.set_value(); - EXPECT_EQ(destroy.wait_for(1s), std::future_status::ready); - destroy.get(); - const auto result = handle.waitUntil( - StopOperationDispatcher::Clock::now() + 1s); - EXPECT_TRUE(result.completed); - EXPECT_TRUE(result.result); - EXPECT_EQ(result.detail, "completed after dispatcher destruction"); -} - -} // namespace -} // namespace cmvr::service diff --git a/cmvr-es/task/CMakeLists.txt b/cmvr-es/task/CMakeLists.txt index 05d0896d..deeb62fd 100644 --- a/cmvr-es/task/CMakeLists.txt +++ b/cmvr-es/task/CMakeLists.txt @@ -22,34 +22,6 @@ target_link_libraries(task add_library(cmvr_es::task ALIAS task) install(TARGETS task LIBRARY DESTINATION lib) -if(BUILD_TESTING) - add_executable(touch_screen_admission_test - touch_screen_task/src/touch_screen_admission_test.cpp - ) - target_link_libraries(touch_screen_admission_test PRIVATE - cmvr_es::task - cmvr_es::device_manager - cmvr_es::stop_all_admission_gate - cmvr_es::camera_operational_activity_registry - gtest - gtest_main - pthread - ) - add_test( - NAME touch_screen_admission_test - COMMAND touch_screen_admission_test - ) - set(_touch_screen_admission_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}") - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _touch_screen_admission_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(touch_screen_admission_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_touch_screen_admission_test_environment}") -endif() - #add_executable(touch_screen_task_test # touch_screen_task/src/touch_screen_task_test.cpp #) diff --git a/cmvr-es/task/touch_screen_task/src/touch_screen_admission_test.cpp b/cmvr-es/task/touch_screen_task/src/touch_screen_admission_test.cpp deleted file mode 100644 index f02cd579..00000000 --- a/cmvr-es/task/touch_screen_task/src/touch_screen_admission_test.cpp +++ /dev/null @@ -1,559 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "manager/device_manager/include/device_manager.h" -#include "service/grpc/server/include/camera_operational_activity_registry.h" -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" -#include "task/touch_screen_task/include/touch_screen_task.h" - -namespace cmvr::task { - -class TouchScreenTaskAdmissionTestPeer final { -public: - static void prepare( - TouchScreenTask& task, - const std::shared_ptr& arm, - const std::shared_ptr& camera) - { - std::lock_guard lock(task.mutex_); - task.arm_ = arm; - { - std::lock_guard arm_lock(task.activity_arm_mutex_); - task.activity_arm_ = arm; - } - task.camera_ = camera; - task.initialized_ = true; - task.phase_ = TouchScreenTask::Phase::IDLE; - task.last_status_ = TouchScreenTask::Status::IDLE; - } - - static void prepareInit( - TouchScreenTask& task, - const std::string& arm_id, - const std::string& dexhand_id, - const std::string& camera_id) - { - std::lock_guard lock(task.mutex_); - task.config_valid_ = true; - auto* devices = task.config_.mutable_devices(); - devices->set_arm_id(arm_id); - devices->set_dexhand_id(dexhand_id); - devices->set_camera_id(camera_id); - task.initialized_ = false; - task.phase_ = TouchScreenTask::Phase::IDLE; - task.last_status_ = TouchScreenTask::Status::NOT_INITIALIZED; - } - - static bool sendJointVelocity(TouchScreenTask& task) - { - std::lock_guard lock(task.mutex_); - return task.sendJointVelocity({}); - } -}; - -} // namespace cmvr::task - -namespace { - -class AdmissionRobotArm final : public cmvr::device::RobotArm { -public: - AdmissionRobotArm() { id_ = "touch-admission-arm"; } - - std::string typeName() const override { return "AdmissionRobotArm"; } - cmvr::device::RobotModel getRobotModel() const override { return {}; } - std::size_t getDof() const override { return 0U; } - cmvr::device::ArmState getRobotState() const override { return {}; } - cmvr::device::JointGroupState getJointState() const override { return {}; } - cmvr::device::CartesianPose getTcpPose( - cmvr::device::FrameType = cmvr::device::FrameType::Base) const override - { - return {}; - } - cmvr::device::RobotMode getRobotMode() const override - { - return cmvr::device::RobotMode::Idle; - } - cmvr::device::SafetyMode getSafetyMode() const override - { - return cmvr::device::SafetyMode::Normal; - } - cmvr::device::ControlMode getControlMode() const override - { - return cmvr::device::ControlMode::None; - } - cmvr::device::Result torqueOn() override { return success(); } - cmvr::device::Result torqueOff() override { return success(); } - cmvr::device::Result calibrateZeroQ(const std::string&) override - { - return success(); - } - cmvr::device::Result emergencyStop() override { return success(); } - cmvr::device::Result protectiveStop() override { return success(); } - cmvr::device::Result setSpeedScaling(double) override { return success(); } - double getSpeedScaling() const override { return 1.0; } - bool isProtectiveStopped() const override { return false; } - bool isEmergencyStopped() const override { return false; } - bool isFault() const override { return false; } - cmvr::device::Result moveJ( - const cmvr::device::JointPositionCommand&, - const cmvr::device::MotionOptions&) override - { - return success(); - } - cmvr::device::Result speedJ( - const cmvr::device::JointVelocityCommand&, double, double) override - { - ++speed_j_calls_; - return success(); - } - cmvr::device::Result stopJ(double) override { return success(); } - cmvr::device::Result moveL( - const cmvr::device::CartesianPose&, - const cmvr::device::MotionOptions&, - cmvr::device::FrameType = cmvr::device::FrameType::Base) override - { - return success(); - } - cmvr::device::Result speedL( - const cmvr::device::CartesianVelocity&, - double, - double, - cmvr::device::FrameType = cmvr::device::FrameType::Base) override - { - return success(); - } - cmvr::device::Result stopL(std::optional = std::nullopt) override - { - return success(); - } - cmvr::device::Result stopMotion() override - { - ++stop_motion_calls_; - return success(); - } - cmvr::device::Result startServoMode( - const cmvr::device::ServoOptions&) override - { - return success(); - } - cmvr::device::Result servoJ( - const cmvr::device::JointPositionCommand&) override - { - return success(); - } - cmvr::device::Result servoL( - const cmvr::device::CartesianPose&, - cmvr::device::FrameType = cmvr::device::FrameType::Base) override - { - return success(); - } - cmvr::device::Result servoSpeedJ( - const cmvr::device::JointVelocityCommand&) override - { - return success(); - } - cmvr::device::Result servoSpeedL( - const cmvr::device::CartesianVelocity&, - cmvr::device::FrameType = cmvr::device::FrameType::Base) override - { - return success(); - } - cmvr::device::Result stopServoMode() override { return success(); } - cmvr::device::Result connect(const std::string&, int) override - { - return success(); - } - cmvr::device::Result disconnect() override { return success(); } - bool isConnected() const override { return true; } - cmvr::device::Result powerOn() override { return success(); } - cmvr::device::Result powerOff() override { return success(); } - cmvr::device::Result brakeRelease() override { return success(); } - cmvr::device::Result shutdown() override { return success(); } - cmvr::device::Result clearFault() override { return success(); } - cmvr::device::Result unlockProtectiveStop() override { return success(); } - cmvr::device::Result loadProgram(const std::string&) override - { - return success(); - } - cmvr::device::Result playProgram() override { return success(); } - cmvr::device::Result pauseProgram() override { return success(); } - cmvr::device::Result stopProgram() override { return success(); } - std::vector ik( - const std::string&, - const std::string&, - const cmvr::device::CartesianPose&) override - { - return {}; - } - std::shared_ptr kinematicsSolver() const override - { - return nullptr; - } - cmvr::device::CartesianPose fk( - const std::string&, const std::string&) override - { - return {}; - } - cmvr::device::CartesianPose fk(bool = true) override { return {}; } - cmvr::device::CartesianVelocity getSpeedLCommandTwistBase() const override - { - return {}; - } - bool busy() const override { return false; } - - int speedJCalls() const noexcept { return speed_j_calls_.load(); } - int stopMotionCalls() const noexcept - { - return stop_motion_calls_.load(); - } - -private: - static cmvr::device::Result success() - { - return cmvr::device::Result::success(); - } - - std::atomic speed_j_calls_{0}; - std::atomic stop_motion_calls_{0}; -}; - -class AdmissionCamera final : public cmvr::device::AbstractCamera { -public: - explicit AdmissionCamera(std::string id) - { - id_ = std::move(id); - state_.is_initialized = true; - } - - std::string typeName() const override { return "AdmissionCamera"; } - - void getState(cmvr::device::CameraState& state) override - { - std::lock_guard lock(mutex_); - state = state_; - } - - bool start() override - { - ++lifecycle_start_calls_; - return true; - } - - bool stop() override - { - ++lifecycle_stop_calls_; - std::lock_guard lock(mutex_); - operational_active_ = false; - state_.is_opened = false; - return true; - } - - bool startOperationalActivity() override - { - ++operational_start_calls_; - std::unique_lock lock(mutex_); - start_entered_ = true; - condition_.notify_all(); - condition_.wait(lock, [this] { return !block_start_; }); - operational_active_ = true; - state_.is_opened = true; - return true; - } - - bool stopOperationalActivity() override - { - ++operational_stop_calls_; - std::lock_guard lock(mutex_); - operational_active_ = false; - state_.is_opened = false; - return true; - } - - void blockStart() - { - std::lock_guard lock(mutex_); - block_start_ = true; - start_entered_ = false; - } - - void waitForStartEntered() - { - std::unique_lock lock(mutex_); - condition_.wait(lock, [this] { return start_entered_; }); - } - - void releaseStart() - { - { - std::lock_guard lock(mutex_); - block_start_ = false; - } - condition_.notify_all(); - } - - bool operationalActive() const - { - std::lock_guard lock(mutex_); - return operational_active_; - } - - int lifecycleStartCalls() const { return lifecycle_start_calls_; } - int lifecycleStopCalls() const { return lifecycle_stop_calls_; } - int operationalStartCalls() const { return operational_start_calls_; } - int operationalStopCalls() const { return operational_stop_calls_; } - -private: - mutable std::mutex mutex_; - std::condition_variable condition_; - bool block_start_{false}; - bool start_entered_{false}; - bool operational_active_{false}; - std::atomic lifecycle_start_calls_{0}; - std::atomic lifecycle_stop_calls_{0}; - std::atomic operational_start_calls_{0}; - std::atomic operational_stop_calls_{0}; -}; - -class TouchScreenAdmissionTest : public ::testing::Test { -protected: - void SetUp() override - { - cmvr::service::globalCameraOperationalActivityRegistry() - .clearForTesting(); - cmvr::device::DeviceManager::destroyInstance(); - cmvr::service::globalStopAllAdmissionGate().clearForTesting(); - cmvr::control::ControlAuthorityManager::instance().clear(); - } - - void TearDown() override - { - cmvr::service::globalCameraOperationalActivityRegistry() - .clearForTesting(); - cmvr::device::DeviceManager::destroyInstance(); - cmvr::service::globalStopAllAdmissionGate().clearForTesting(); - cmvr::control::ControlAuthorityManager::instance().clear(); - } -}; - -TEST_F(TouchScreenAdmissionTest, - DirectTouchAndStartFromPixelHonorFailClosedAdmissionAndRecovery) -{ - auto arm = std::make_shared(); - auto camera = std::make_shared( - "touch-admission-camera"); - cmvr::task::TouchScreenTask task(cmvr::config::TouchScreenTaskConfig{}); - cmvr::task::TouchScreenTaskAdmissionTestPeer::prepare( - task, arm, camera); - auto& gate = cmvr::service::globalStopAllAdmissionGate(); - - auto ticket = gate.beginStopAll(); - EXPECT_FALSE(task.touch(10, 20)); - EXPECT_FALSE(task.startFromPixel(10, 20)); - EXPECT_FALSE(task.isBusy()); - - EXPECT_TRUE(gate.finishStopAll(ticket, true)); - ASSERT_TRUE(task.touch(10, 20)); - EXPECT_TRUE(task.isBusy()); - EXPECT_TRUE(task.stopActivity()); - - ticket = gate.beginStopAll(); - EXPECT_FALSE(gate.finishStopAll(ticket, false)); - EXPECT_FALSE(task.touch(10, 20)); - EXPECT_FALSE(task.startFromPixel(10, 20)); - - ticket = gate.beginStopAll(); - EXPECT_TRUE(gate.finishStopAll(ticket, true)); - EXPECT_TRUE(task.startFromPixel(30, 40)); - EXPECT_TRUE(task.stopActivity()); -} - -TEST_F(TouchScreenAdmissionTest, - SafetyHooksFenceEveryArmActuation) -{ - auto arm = std::make_shared(); - auto camera = std::make_shared( - "touch-safety-hooks-camera"); - cmvr::task::TouchScreenTask task(cmvr::config::TouchScreenTaskConfig{}); - cmvr::task::TouchScreenTaskAdmissionTestPeer::prepare( - task, arm, camera); - - bool admitted = true; - int revalidations = 0; - int dispatches = 0; - cmvr::task::TouchScreenTask::SafetyHooks hooks; - hooks.revalidate = [&] { - ++revalidations; - return admitted; - }; - hooks.dispatch_actuation = [&](const auto& operation) { - ++dispatches; - return operation(); - }; - hooks.dispatch_stop = [](const auto& operation) { - return operation(); - }; - - ASSERT_TRUE(task.touchIfCurrent( - 10, 20, [] { return true; }, std::move(hooks))); - EXPECT_TRUE( - cmvr::task::TouchScreenTaskAdmissionTestPeer::sendJointVelocity(task)); - EXPECT_EQ(arm->speedJCalls(), 1); - EXPECT_EQ(dispatches, 1); - EXPECT_GE(revalidations, 2); - - admitted = false; - EXPECT_FALSE( - cmvr::task::TouchScreenTaskAdmissionTestPeer::sendJointVelocity(task)); - EXPECT_EQ(arm->speedJCalls(), 1); - EXPECT_EQ(dispatches, 1); - EXPECT_TRUE(task.stopActivity()); -} - -TEST_F(TouchScreenAdmissionTest, - RevokedSafetySessionStopsActivityThroughStopLane) -{ - auto arm = std::make_shared(); - auto camera = std::make_shared( - "touch-revoked-safety-camera"); - cmvr::task::TouchScreenTask task(cmvr::config::TouchScreenTaskConfig{}); - cmvr::task::TouchScreenTaskAdmissionTestPeer::prepare( - task, arm, camera); - - bool admitted = true; - int stop_dispatches = 0; - cmvr::task::TouchScreenTask::SafetyHooks hooks; - hooks.revalidate = [&] { return admitted; }; - hooks.dispatch_actuation = [](const auto& operation) { - return operation(); - }; - hooks.dispatch_stop = [&](const auto& operation) { - ++stop_dispatches; - return operation(); - }; - - ASSERT_TRUE(task.touchIfCurrent( - 10, 20, [] { return true; }, std::move(hooks))); - admitted = false; - EXPECT_FALSE(task.step(0.01)); - EXPECT_EQ(task.phase(), cmvr::task::TouchScreenTask::Phase::FAILED); - EXPECT_EQ( - task.lastStatus(), - cmvr::task::TouchScreenTask::Status::SAFETY_ADMISSION_REVOKED); - EXPECT_EQ(stop_dispatches, 1); - EXPECT_EQ(arm->stopMotionCalls(), 1); -} - -TEST_F(TouchScreenAdmissionTest, - StopAllStopsCameraActivityAndNextTouchRestartsIt) -{ - auto arm = std::make_shared(); - auto camera = std::make_shared( - "touch-restart-camera"); - cmvr::task::TouchScreenTask task(cmvr::config::TouchScreenTaskConfig{}); - cmvr::task::TouchScreenTaskAdmissionTestPeer::prepare( - task, arm, camera); - auto& gate = cmvr::service::globalStopAllAdmissionGate(); - auto& registry = - cmvr::service::globalCameraOperationalActivityRegistry(); - - ASSERT_TRUE(task.touch(10, 20)); - EXPECT_TRUE(camera->operationalActive()); - EXPECT_EQ(camera->operationalStartCalls(), 1); - - const auto ticket = gate.beginStopAll(); - ASSERT_TRUE(ticket.valid()); - EXPECT_TRUE(task.stopActivity()); - EXPECT_TRUE(registry.stopAllActivities()); - EXPECT_FALSE(camera->operationalActive()); - EXPECT_EQ(camera->operationalStopCalls(), 1); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); - ASSERT_TRUE(gate.finishStopAll(ticket, true)); - - ASSERT_TRUE(task.touch(30, 40)); - EXPECT_TRUE(camera->operationalActive()); - EXPECT_EQ(camera->operationalStartCalls(), 2); - EXPECT_EQ(camera->lifecycleStartCalls(), 0); - EXPECT_TRUE(task.stopActivity()); -} - -TEST_F(TouchScreenAdmissionTest, - TouchRollsBackCameraStartThatCrossesStopAllGeneration) -{ - auto arm = std::make_shared(); - auto camera = std::make_shared( - "touch-racing-camera"); - cmvr::task::TouchScreenTask task(cmvr::config::TouchScreenTaskConfig{}); - cmvr::task::TouchScreenTaskAdmissionTestPeer::prepare( - task, arm, camera); - camera->blockStart(); - - bool touch_result = true; - std::thread touch_thread([&] { - touch_result = task.touch(10, 20); - }); - camera->waitForStartEntered(); - - auto& gate = cmvr::service::globalStopAllAdmissionGate(); - const auto ticket = gate.beginStopAll(); - EXPECT_TRUE(ticket.valid()); - camera->releaseStart(); - touch_thread.join(); - - EXPECT_FALSE(touch_result); - EXPECT_FALSE(task.isBusy()); - EXPECT_FALSE(camera->operationalActive()); - EXPECT_EQ(camera->operationalStartCalls(), 1); - EXPECT_EQ(camera->operationalStopCalls(), 1); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); - EXPECT_TRUE(gate.finishStopAll(ticket, true)); -} - -TEST_F(TouchScreenAdmissionTest, - InitRollsBackCameraStartThatCrossesStopAllGeneration) -{ - cmvr::config::DeviceManagerConfig manager_config; - auto& manager = - cmvr::device::DeviceManager::getInstance(manager_config); - auto camera = std::make_shared( - "touch-init-racing-camera"); - manager.registerDevice(camera); - - cmvr::task::TouchScreenTask task(cmvr::config::TouchScreenTaskConfig{}); - cmvr::task::TouchScreenTaskAdmissionTestPeer::prepareInit( - task, - "missing-arm", - "missing-dexhand", - camera->id()); - camera->blockStart(); - - bool init_result = true; - std::thread init_thread([&] { - init_result = task.init(); - }); - camera->waitForStartEntered(); - - auto& gate = cmvr::service::globalStopAllAdmissionGate(); - const auto ticket = gate.beginStopAll(); - EXPECT_TRUE(ticket.valid()); - camera->releaseStart(); - init_thread.join(); - - EXPECT_FALSE(init_result); - EXPECT_EQ(task.state(), cmvr::task::TaskState::UNINITIALIZED); - EXPECT_FALSE(camera->operationalActive()); - EXPECT_EQ(camera->operationalStartCalls(), 1); - EXPECT_EQ(camera->operationalStopCalls(), 1); - EXPECT_EQ(camera->lifecycleStopCalls(), 0); - EXPECT_TRUE(gate.finishStopAll(ticket, true)); -} - -} // namespace diff --git a/cmvr-es/task/ume_teleop_task/CMakeLists.txt b/cmvr-es/task/ume_teleop_task/CMakeLists.txt index 1b3b6362..d1d1b8b5 100644 --- a/cmvr-es/task/ume_teleop_task/CMakeLists.txt +++ b/cmvr-es/task/ume_teleop_task/CMakeLists.txt @@ -18,26 +18,3 @@ target_link_libraries(ume_teleop_task add_library(cmvr_es::ume_teleop_task ALIAS ume_teleop_task) install(TARGETS ume_teleop_task ARCHIVE DESTINATION lib) - -if(BUILD_TESTING) - add_executable(ume_teleop_task_test - tests/ume_teleop_task_test.cpp - ) - target_compile_features(ume_teleop_task_test PRIVATE cxx_std_17) - target_link_libraries(ume_teleop_task_test - PRIVATE - cmvr_es::ume_teleop_task - cmvr_es::stop_all_admission_gate - Threads::Threads - ) - add_test(NAME ume_teleop_task_test COMMAND ume_teleop_task_test) - set(_ume_teleop_task_test_environment - "LD_LIBRARY_PATH=${CMVR_TEST_EXTERNAL_LIBRARY_PATH}") - if(CMVR_TEST_SYSTEM_LIBSTDCXX) - list(APPEND _ume_teleop_task_test_environment - "LD_PRELOAD=${CMVR_TEST_SYSTEM_LIBSTDCXX}") - endif() - set_tests_properties(ume_teleop_task_test PROPERTIES - TIMEOUT 10 - ENVIRONMENT "${_ume_teleop_task_test_environment}") -endif() diff --git a/cmvr-es/task/ume_teleop_task/tests/ume_teleop_task_test.cpp b/cmvr-es/task/ume_teleop_task/tests/ume_teleop_task_test.cpp deleted file mode 100644 index 67766831..00000000 --- a/cmvr-es/task/ume_teleop_task/tests/ume_teleop_task_test.cpp +++ /dev/null @@ -1,530 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "cmvr/api/arm_teleop_v1.grpc.pb.h" -#include "service/grpc/client/include/grpc_arm_teleop_client.h" -#include "service/grpc/stop_all/include/stop_all_admission_gate.h" -#include "task/ume_teleop_task/include/ume_teleop_task.h" - -namespace { - -using namespace std::chrono_literals; -namespace api = cmvr::api::armteleop::v1; - -class WatchdogArmTeleopService final : public api::ArmTeleopService::Service { -public: - explicit WatchdogArmTeleopService( - const std::chrono::milliseconds watchdog) - : watchdog_(watchdog) - { - } - - grpc::Status Teleoperate( - grpc::ServerContext* context, - grpc::ServerReaderWriter* stream) override - { - api::ClientFrame frame; - if (!stream->Read(&frame) || !frame.has_open()) { - return grpc::Status( - grpc::StatusCode::INVALID_ARGUMENT, - "OpenSession must be first"); - } - { - std::lock_guard lock(mutex_); - open_received_ = true; - ++open_count_; - reader_finished_ = false; - last_sequence_ = 0; - last_activity_ = std::chrono::steady_clock::now(); - } - condition_.notify_all(); - - api::ServerFrame opened; - opened.mutable_status()->set_session_id("task-test-session"); - opened.mutable_status()->set_phase(api::SESSION_PHASE_OPENED); - opened.mutable_status()->set_negotiated_watchdog_ms( - static_cast(watchdog_.count())); - if (!stream->Write(opened)) { - return grpc::Status::OK; - } - - api::ServerFrame ready; - ready.mutable_status()->set_session_id("task-test-session"); - ready.mutable_status()->set_phase(api::SESSION_PHASE_READY); - ready.mutable_status()->set_negotiated_watchdog_ms( - static_cast(watchdog_.count())); - if (!stream->Write(ready)) { - return grpc::Status::OK; - } - - std::thread reader([&] { - api::ClientFrame incoming; - while (stream->Read(&incoming)) { - const auto arrived = std::chrono::steady_clock::now(); - bool terminal = false; - { - std::lock_guard lock(mutex_); - if (incoming.has_heartbeat() || - incoming.has_setpoint()) { - const std::uint64_t sequence = - incoming.has_heartbeat() - ? incoming.heartbeat().sequence() - : incoming.setpoint().sequence(); - if (sequence == 0 || sequence <= last_sequence_) { - sequence_valid_ = false; - } - last_sequence_ = sequence; - last_activity_ = arrived; - ++activity_version_; - if (incoming.has_heartbeat()) { - ++heartbeat_count_; - } else { - setpoints_.push_back(incoming.setpoint()); - } - } else if (incoming.has_stop()) { - stop_received_ = true; - ++stop_count_; - terminal = true; - } - if (terminal) { - reader_finished_ = true; - } - } - condition_.notify_all(); - incoming.Clear(); - if (terminal) { - break; - } - } - { - std::lock_guard lock(mutex_); - reader_finished_ = true; - } - condition_.notify_all(); - }); - - bool expired = false; - { - std::unique_lock lock(mutex_); - std::uint64_t observed_activity = activity_version_; - while (!reader_finished_) { - const auto deadline = last_activity_ + watchdog_; - if (!condition_.wait_until( - lock, - deadline, - [&] { - return reader_finished_ || - activity_version_ != observed_activity; - })) { - watchdog_expired_ = true; - expired = true; - break; - } - observed_activity = activity_version_; - } - } - if (expired) { - context->TryCancel(); - } - if (reader.joinable()) { - reader.join(); - } - { - std::lock_guard lock(mutex_); - handler_finished_ = true; - ++handler_finish_count_; - } - condition_.notify_all(); - return expired - ? grpc::Status( - grpc::StatusCode::DEADLINE_EXCEEDED, - "test watchdog expired") - : grpc::Status::OK; - } - - bool waitForOpen(const std::chrono::milliseconds timeout) - { - return waitForOpenCount(1, timeout); - } - - bool waitForOpenCount( - const std::size_t count, - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return condition_.wait_for( - lock, timeout, [&] { return open_count_ >= count; }); - } - - bool waitForHandlerFinish(const std::chrono::milliseconds timeout) - { - return waitForHandlerFinishCount(1, timeout); - } - - bool waitForHandlerFinishCount( - const std::size_t count, - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return condition_.wait_for( - lock, timeout, [&] { return handler_finish_count_ >= count; }); - } - - bool waitForHeartbeatCount( - const std::size_t count, - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return condition_.wait_for( - lock, timeout, [&] { return heartbeat_count_ >= count; }); - } - - bool waitForSetpointCount( - const std::size_t count, - const std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex_); - return condition_.wait_for( - lock, timeout, [&] { return setpoints_.size() >= count; }); - } - - std::size_t setpointCount() const - { - std::lock_guard lock(mutex_); - return setpoints_.size(); - } - - std::size_t heartbeatCount() const - { - std::lock_guard lock(mutex_); - return heartbeat_count_; - } - - std::size_t stopCount() const - { - std::lock_guard lock(mutex_); - return stop_count_; - } - - api::JointSetpoint lastSetpoint() const - { - std::lock_guard lock(mutex_); - return setpoints_.empty() - ? api::JointSetpoint{} - : setpoints_.back(); - } - - bool watchdogExpired() const - { - std::lock_guard lock(mutex_); - return watchdog_expired_; - } - - bool sequenceValid() const - { - std::lock_guard lock(mutex_); - return sequence_valid_; - } - - bool stopReceived() const - { - std::lock_guard lock(mutex_); - return stop_received_; - } - -private: - const std::chrono::milliseconds watchdog_; - mutable std::mutex mutex_; - std::condition_variable condition_; - bool open_received_{false}; - bool reader_finished_{false}; - bool handler_finished_{false}; - bool watchdog_expired_{false}; - bool sequence_valid_{true}; - bool stop_received_{false}; - std::size_t open_count_{0}; - std::size_t handler_finish_count_{0}; - std::size_t stop_count_{0}; - std::uint64_t activity_version_{0}; - std::uint64_t last_sequence_{0}; - std::size_t heartbeat_count_{0}; - std::vector setpoints_; - std::chrono::steady_clock::time_point last_activity_{}; -}; - -cmvr::config::UmeTeleopConfig validConfig(const std::string& endpoint) -{ - cmvr::config::UmeTeleopConfig config; - config.set_id("ume_teleop_test"); - config.set_server_address(endpoint); - config.set_allow_insecure(true); - - auto* open = config.mutable_open_session(); - open->set_protocol_major(1); - open->set_protocol_minor(0); - open->set_client_instance_id("ume-task-test"); - open->set_requested_command_rate_hz(20); - open->set_requested_state_rate_hz(250); - open->set_watchdog_timeout_ms(120); - open->set_requested_lease_ms(500); - open->mutable_expected_robot()->set_robot_id("test-arm"); - open->mutable_expected_robot()->add_joint_names("joint1"); - - config.mutable_reconnect()->set_initial_delay_ms(10); - config.mutable_reconnect()->set_maximum_delay_ms(50); - config.mutable_reconnect()->set_multiplier(2.0); - return config; -} - -int fail(const std::string& detail) -{ - std::cerr << "ume_teleop_task_test: " << detail << '\n'; - return 1; -} - -} // namespace - -int main() -{ - auto& admission = cmvr::service::globalStopAllAdmissionGate(); - admission.clearForTesting(); - - { - cmvr::config::UmeTeleopConfig invalid; - invalid.set_id("invalid"); - cmvr::task::UmeTeleopTask task(invalid); - if (task.init() || task.state() != cmvr::task::TaskState::FAILED) { - return fail("invalid transport configuration was not rejected"); - } - task.stop(); - if (task.state() != cmvr::task::TaskState::FAILED) { - return fail("stop did not preserve an initialization failure"); - } - } - - { - // Exercise the start/stop race before a synchronous stream necessarily - // publishes its ClientContext. The Task's cancellation predicate closes - // this gap, while tryCancel() interrupts it once the context is visible. - const std::string unavailable_endpoint = - "unix:/tmp/cmvr_ume_teleop_unavailable_" + - std::to_string(static_cast(::getpid())) + ".sock"; - auto channel = grpc::CreateChannel( - unavailable_endpoint, - grpc::InsecureChannelCredentials()); - auto client = - std::make_shared(channel); - cmvr::task::UmeTeleopTask task( - validConfig(unavailable_endpoint), client); - if (!task.init() || !task.start()) { - return fail("immediate-stop task did not initialize and start"); - } - api::JointSetpoint disconnected_setpoint; - disconnected_setpoint.add_position_rad(1.0); - disconnected_setpoint.set_valid_for_us(100000); - if (task.submitSetpoint(disconnected_setpoint)) { - task.stop(); - return fail( - "task accepted a motion command without a ready session"); - } - const auto stop_begin = std::chrono::steady_clock::now(); - task.stop(); - if (std::chrono::steady_clock::now() - stop_begin > 2s || - task.state() != cmvr::task::TaskState::STOPPED) { - return fail("immediate Task stop did not cancel and join promptly"); - } - } - - WatchdogArmTeleopService service(120ms); - grpc::ServerBuilder builder; - int selected_port = 0; - builder.AddListeningPort( - "127.0.0.1:0", - grpc::InsecureServerCredentials(), - &selected_port); - builder.RegisterService(&service); - std::unique_ptr server = builder.BuildAndStart(); - if (!server || selected_port == 0) { - return fail("failed to start in-process gRPC server"); - } - const std::string endpoint = - "127.0.0.1:" + std::to_string(selected_port); - - auto channel = grpc::CreateChannel( - endpoint, - grpc::InsecureChannelCredentials()); - auto client = - std::make_shared(channel); - cmvr::task::UmeTeleopTask task(validConfig(endpoint), client); - - if (task.runMode() != cmvr::task::TaskRunMode::BLOCKING_SERVICE) { - server->Shutdown(); - return fail("task is not a BLOCKING_SERVICE"); - } - if (!task.init()) { - server->Shutdown(); - return fail("valid task did not initialize"); - } - - auto admission_ticket = admission.beginStopAll(); - if (task.start() || task.isBusy()) { - server->Shutdown(); - return fail("public start bypassed closed StopAll admission"); - } - if (!admission.finishStopAll(admission_ticket, true) || !task.start()) { - server->Shutdown(); - return fail("explicit start was not restored after successful StopAll"); - } - if (!service.waitForOpen(2s)) { - task.stop(); - server->Shutdown(); - return fail("task worker did not open the teleoperation stream"); - } - - // No application commands are submitted here. Heartbeats alone must keep - // the session alive for longer than the negotiated watchdog. - if (!service.waitForHeartbeatCount(4, 2s) || - service.watchdogExpired() || !task.isBusy()) { - task.stop(); - server->Shutdown(); - return fail("silent command stream did not survive via heartbeats"); - } - - api::JointSetpoint first; - first.set_sequence(999); // Task must replace caller-owned sequence values. - first.add_position_rad(1.0); - first.add_velocity_rad_s(0.0); - first.set_valid_for_us(100000); - if (!task.submitSetpoint(first) || - !service.waitForSetpointCount(1, 2s)) { - task.stop(); - server->Shutdown(); - return fail("first mailbox setpoint was not sent"); - } - - // The sender rate is 20 Hz. These arrive inside one command period, so the - // capacity-one mailbox must publish only the newest value. - for (int value = 2; value <= 4; ++value) { - api::JointSetpoint setpoint; - setpoint.set_sequence(1000 + value); - setpoint.add_position_rad(static_cast(value)); - setpoint.add_velocity_rad_s(0.0); - setpoint.set_valid_for_us(100000); - if (!task.submitSetpoint(setpoint)) { - task.stop(); - server->Shutdown(); - return fail("latest-only mailbox rejected a valid setpoint"); - } - } - if (!service.waitForSetpointCount(2, 2s)) { - task.stop(); - server->Shutdown(); - return fail("latest mailbox setpoint was not sent"); - } - std::this_thread::sleep_for(70ms); - const api::JointSetpoint latest = service.lastSetpoint(); - if (service.setpointCount() != 2 || - latest.position_rad_size() != 1 || - latest.position_rad(0) != 4.0 || - latest.sequence() == 0 || - latest.sequence() >= 1000) { - task.stop(); - server->Shutdown(); - return fail("mailbox did not collapse queued commands to the latest value"); - } - - const auto stop_begin = std::chrono::steady_clock::now(); - const bool activity_stopped = task.stopActivity(); - const auto stop_elapsed = std::chrono::steady_clock::now() - stop_begin; - if (!activity_stopped || stop_elapsed > 2s) { - server->Shutdown(); - return fail("stopActivity did not stop and join promptly"); - } - if (task.state() != cmvr::task::TaskState::STOPPED || - task.isBusy() || !task.isFinished()) { - server->Shutdown(); - return fail("task did not reach STOPPED after stopping its activity"); - } - if (!service.waitForHandlerFinish(2s)) { - server->Shutdown(); - return fail("server handler did not observe activity cancellation"); - } - if (!service.stopReceived()) { - server->Shutdown(); - return fail("stopActivity did not send StopSession before TryCancel"); - } - api::JointSetpoint stopped_setpoint; - stopped_setpoint.add_position_rad(5.0); - stopped_setpoint.set_valid_for_us(100000); - if (task.submitSetpoint(stopped_setpoint)) { - server->Shutdown(); - return fail("stopped activity still accepted a setpoint"); - } - const auto heartbeats_after_stop = service.heartbeatCount(); - const auto setpoints_after_stop = service.setpointCount(); - std::this_thread::sleep_for(200ms); - if (service.heartbeatCount() != heartbeats_after_stop || - service.setpointCount() != setpoints_after_stop) { - server->Shutdown(); - return fail("stopped activity continued sending heartbeat or setpoint frames"); - } - - if (!task.start() || - !service.waitForOpenCount(2, 2s) || - !service.waitForHeartbeatCount(heartbeats_after_stop + 1, 2s) || - !task.isBusy()) { - task.stop(); - server->Shutdown(); - return fail("explicit start did not create a new teleoperation activity"); - } - api::JointSetpoint restarted_setpoint; - restarted_setpoint.add_position_rad(6.0); - restarted_setpoint.set_valid_for_us(100000); - if (!task.submitSetpoint(restarted_setpoint) || - !service.waitForSetpointCount(setpoints_after_stop + 1, 2s)) { - task.stop(); - server->Shutdown(); - return fail("restarted activity did not send a setpoint"); - } - if (!task.stopActivity() || - !service.waitForHandlerFinishCount(2, 2s) || - service.stopCount() != 2 || - task.state() != cmvr::task::TaskState::STOPPED) { - server->Shutdown(); - return fail("restarted activity did not stop cleanly"); - } - - admission_ticket = admission.beginStopAll(); - if (admission.finishStopAll(admission_ticket, false) || task.start()) { - server->Shutdown(); - return fail("failed StopAll did not keep public start fail-closed"); - } - admission_ticket = admission.beginStopAll(); - if (!admission.finishStopAll(admission_ticket, true) || - !task.start() || !service.waitForOpenCount(3, 2s) || - !task.stopActivity() || - !service.waitForHandlerFinishCount(3, 2s)) { - server->Shutdown(); - return fail("successful StopAll did not restore a new explicit start"); - } - if (service.watchdogExpired() || !service.sequenceValid()) { - server->Shutdown(); - return fail("heartbeat/setpoint sequence or watchdog contract failed"); - } - - server->Shutdown(); - admission.clearForTesting(); - std::cout << "ume_teleop_task_test: PASS\n"; - return 0; -} diff --git a/compile_commands.json b/compile_commands.json deleted file mode 100644 index f50be0c1..00000000 --- a/compile_commands.json +++ /dev/null @@ -1,986 +0,0 @@ -[ -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/common.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/common.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/common.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/common.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_command.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_command.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_command.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_command.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/test_service.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/test_service.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/test_service.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/test_service.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/camera_config/camera_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/camera_config/camera_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/camera_config/camera_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/camera_config/camera_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/dexhand_config/dexhand_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/dexhand_config/dexhand_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/dexhand_config/dexhand_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/dexhand_config/dexhand_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/microphone_config/microphone_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/microphone_config/microphone_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/microphone_config/microphone_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/microphone_config/microphone_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_dls_ik_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_dls_ik_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_dls_ik_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_dls_ik_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/speaker_config/speaker_conifg.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/speaker_config/speaker_conifg.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/speaker_config/speaker_conifg.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/speaker_config/speaker_conifg.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/can_card_parameter.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/can_card_parameter.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/can_card_parameter.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/can_card_parameter.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/canopen.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/canopen.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/canopen.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/canopen.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/error_code.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/error_code.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/error_code.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/error_code.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/geometry.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/geometry.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/geometry.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/geometry.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/motor.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/motor.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/motor.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/motor.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/robot_detail.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/robot_detail.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/robot_detail.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/robot_detail.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/biohead_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/biohead_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/camera_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/camera_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/common.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/common.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/common.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/common.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/dexhand_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/dexhand_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/hlc_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/hlc_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/humanoid_robot_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/humanoid_robot_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/microphone_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/microphone_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/speaker_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/speaker_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_command.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_command.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_command.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_command.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/system_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/system_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/test_service.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/test_service.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/api/test_service.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/api/test_service.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/camera_config/camera_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/camera_config/camera_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/camera_config/camera_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/camera_config/camera_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/dexhand_config/dexhand_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/dexhand_config/dexhand_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/dexhand_config/dexhand_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/dexhand_config/dexhand_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/microphone_config/microphone_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/microphone_config/microphone_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/microphone_config/microphone_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/microphone_config/microphone_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_dls_ik_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_dls_ik_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_dls_ik_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_dls_ik_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/pinocchio_qp_ik_solver_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/speaker_config/speaker_conifg.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/speaker_config/speaker_conifg.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/speaker_config/speaker_conifg.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/speaker_config/speaker_conifg.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/config/touch_screen_app_config/touch_screen_app_config.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/can_card_parameter.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/can_card_parameter.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/can_card_parameter.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/can_card_parameter.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/canopen.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/canopen.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/canopen.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/canopen.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/error_code.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/error_code.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/error_code.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/error_code.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/geometry.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/geometry.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/geometry.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/geometry.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/motor.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/motor.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/motor.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/motor.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/robot_detail.grpc.pb.cc.o -c /home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/robot_detail.grpc.pb.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf/cmvr/msgs/robot_detail.grpc.pb.cc", - "output": "CMakeFiles/proto-objects.dir/_protobuf/cmvr/msgs/robot_detail.grpc.pb.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o CMakeFiles/cmvr_es.dir/cmvr-es/main.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/main.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/main.cpp", - "output": "CMakeFiles/cmvr_es.dir/cmvr-es/main.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/base/src/thread_pool.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/thread_pool.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/thread_pool.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/base/src/thread_pool.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/base/src/timer.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/timer.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/timer.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/base/src/timer.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/base/src/abstract_interpolation.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/abstract_interpolation.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/base/src/abstract_interpolation.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/base/src/abstract_interpolation.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/inertial.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/inertial.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/inertial.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/inertial.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/joint.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/joint.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/joint.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/joint.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/link.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/link.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/link.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/link.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/robot.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/robot.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/dynamics/src/robot.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/dynamics/src/robot.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/math/src/qp_solver.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/qp_solver.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/qp_solver.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/math/src/qp_solver.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/math/src/se2.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/se2.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/se2.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/math/src/se2.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/math/src/se3.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/se3.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/se3.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/math/src/se3.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/math/src/so3.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/so3.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/math/src/so3.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/math/src/so3.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -g -std=gnu++17 -fPIC -o cmvr-es/utils/CMakeFiles/utils.dir/controller/src/cartesian_controller.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/utils/controller/src/cartesian_controller.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/utils/controller/src/cartesian_controller.cpp", - "output": "cmvr-es/utils/CMakeFiles/utils.dir/controller/src/cartesian_controller.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dhardware_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -g -std=gnu++17 -fPIC -o cmvr-es/hardware/CMakeFiles/hardware.dir/src/serial_interface.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/serial_interface.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/serial_interface.cpp", - "output": "cmvr-es/hardware/CMakeFiles/hardware.dir/src/serial_interface.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dhardware_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -g -std=gnu++17 -fPIC -o cmvr-es/hardware/CMakeFiles/hardware.dir/src/esp32_serial_port.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/esp32_serial_port.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/esp32_serial_port.cpp", - "output": "cmvr-es/hardware/CMakeFiles/hardware.dir/src/esp32_serial_port.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dhardware_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -g -std=gnu++17 -fPIC -o cmvr-es/hardware/CMakeFiles/hardware.dir/src/posix_serial_transport.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/posix_serial_transport.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/hardware/src/posix_serial_transport.cpp", - "output": "cmvr-es/hardware/CMakeFiles/hardware.dir/src/posix_serial_transport.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Duvc_camera_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera -g -std=gnu++17 -fPIC -o cmvr-es/devices/camera/uvc_camera/CMakeFiles/uvc_camera.dir/src/uvc_camera.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera/src/uvc_camera.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera/src/uvc_camera.cpp", - "output": "cmvr-es/devices/camera/uvc_camera/CMakeFiles/uvc_camera.dir/src/uvc_camera.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Drealsense_camera_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -g -std=gnu++17 -fPIC -o cmvr-es/devices/camera/realsense_camera/CMakeFiles/realsense_camera.dir/src/realsense_camera.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera/src/realsense_camera.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera/src/realsense_camera.cpp", - "output": "cmvr-es/devices/camera/realsense_camera/CMakeFiles/realsense_camera.dir/src/realsense_camera.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/camera/realsense_camera/CMakeFiles/realsense_camera_test.dir/src/realsense_camera_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera/src/realsense_camera_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera/src/realsense_camera_test.cpp", - "output": "cmvr-es/devices/camera/realsense_camera/CMakeFiles/realsense_camera_test.dir/src/realsense_camera_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_camera_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/mujoco_camera -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/devices/camera/mujoco_camera/CMakeFiles/mujoco_camera.dir/src/mujoco_camera.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/mujoco_camera/src/mujoco_camera.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/mujoco_camera/src/mujoco_camera.cpp", - "output": "cmvr-es/devices/camera/mujoco_camera/CMakeFiles/mujoco_camera.dir/src/mujoco_camera.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dffmpeg_speaker_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker -g -std=gnu++17 -fPIC -o cmvr-es/devices/speaker/ffmpeg_speaker/CMakeFiles/ffmpeg_speaker.dir/src/ffmpeg_speaker.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker/src/ffmpeg_speaker.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker/src/ffmpeg_speaker.cpp", - "output": "cmvr-es/devices/speaker/ffmpeg_speaker/CMakeFiles/ffmpeg_speaker.dir/src/ffmpeg_speaker.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dffmpeg_microphone_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone -g -std=gnu++17 -fPIC -o cmvr-es/devices/microphone/ffmpeg_microphone/CMakeFiles/ffmpeg_microphone.dir/src/ffmpeg_microphone.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone/src/ffmpeg_microphone.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone/src/ffmpeg_microphone.cpp", - "output": "cmvr-es/devices/microphone/ffmpeg_microphone/CMakeFiles/ffmpeg_microphone.dir/src/ffmpeg_microphone.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Drh56dftp_dexhand_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -g -std=gnu++17 -fPIC -o cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeFiles/rh56dftp_dexhand.dir/src/rh56dftp_dexhand.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand/src/rh56dftp_dexhand.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand/src/rh56dftp_dexhand.cpp", - "output": "cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeFiles/rh56dftp_dexhand.dir/src/rh56dftp_dexhand.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeFiles/rh56dftp_dexhand_test.dir/src/rh56dftp_dexhand_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand/src/rh56dftp_dexhand_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand/src/rh56dftp_dexhand_test.cpp", - "output": "cmvr-es/devices/dexhand/rh56dftp_dexhand/CMakeFiles/rh56dftp_dexhand_test.dir/src/rh56dftp_dexhand_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dpx_6ax_gen3_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/devices/dexhand/px_6ax_gen3/CMakeFiles/px_6ax_gen3.dir/src/px_6ax_gen3.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3/src/px_6ax_gen3.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3/src/px_6ax_gen3.cpp", - "output": "cmvr-es/devices/dexhand/px_6ax_gen3/CMakeFiles/px_6ax_gen3.dir/src/px_6ax_gen3.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/dexhand/px_6ax_gen3/CMakeFiles/px_6ax_gen3_test.dir/src/px_6ax_gen3_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3/src/px_6ax_gen3_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3/src/px_6ax_gen3_test.cpp", - "output": "cmvr-es/devices/dexhand/px_6ax_gen3/CMakeFiles/px_6ax_gen3_test.dir/src/px_6ax_gen3_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dhead_esp32_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -g -std=gnu++17 -fPIC -o cmvr-es/devices/biohead/biohead_esp32/CMakeFiles/head_esp32.dir/src/biohead_esp32.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32/src/biohead_esp32.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32/src/biohead_esp32.cpp", - "output": "cmvr-es/devices/biohead/biohead_esp32/CMakeFiles/head_esp32.dir/src/biohead_esp32.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dhumanoid_robot_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/devices/robot/humanoid_robot/CMakeFiles/humanoid_robot.dir/src/humanoid_robot.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot/src/humanoid_robot.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot/src/humanoid_robot.cpp", - "output": "cmvr-es/devices/robot/humanoid_robot/CMakeFiles/humanoid_robot.dir/src/humanoid_robot.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o cmvr-es/devices/robot/humanoid_robot/CMakeFiles/humanoid_robot_test.dir/src/humanoid_robot_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot/src/humanoid_robot_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot/src/humanoid_robot_test.cpp", - "output": "cmvr-es/devices/robot/humanoid_robot/CMakeFiles/humanoid_robot_test.dir/src/humanoid_robot_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcanbus_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/devices/canbus/CMakeFiles/canbus.dir/can_client/socket/socket_can_client_raw.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_client/socket/socket_can_client_raw.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_client/socket/socket_can_client_raw.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/canbus.dir/can_client/socket/socket_can_client_raw.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcanbus_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/devices/canbus/CMakeFiles/canbus.dir/common/byte.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/common/byte.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/common/byte.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/canbus.dir/common/byte.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/canbus/CMakeFiles/socket_can_client_raw_test.dir/can_client/socket/socket_can_client_raw_test.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_client/socket/socket_can_client_raw_test.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_client/socket/socket_can_client_raw_test.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/socket_can_client_raw_test.dir/can_client/socket/socket_can_client_raw_test.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/canbus/CMakeFiles/protocol_data_test.dir/can_comm/protocol_data_test.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/protocol_data_test.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/protocol_data_test.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/protocol_data_test.dir/can_comm/protocol_data_test.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/canbus/CMakeFiles/message_manager_test.dir/can_comm/message_manager_test.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/message_manager_test.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/message_manager_test.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/message_manager_test.dir/can_comm/message_manager_test.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/canbus/CMakeFiles/can_sender_test.dir/can_comm/can_sender_test.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/can_sender_test.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/can_sender_test.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/can_sender_test.dir/can_comm/can_sender_test.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/canbus/CMakeFiles/can_receiver_test.dir/can_comm/can_receiver_test.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/can_receiver_test.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus/can_comm/can_receiver_test.cc", - "output": "cmvr-es/devices/canbus/CMakeFiles/can_receiver_test.dir/can_comm/can_receiver_test.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/devices/motor/CMakeFiles/motor_manager_test.dir/motor_manager_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/motor_manager_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/motor_manager_test.cpp", - "output": "cmvr-es/devices/motor/CMakeFiles/motor_manager_test.dir/motor_manager_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_sdo_response.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_sdo_response.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_sdo_response.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_sdo_response.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_tpdo1.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_tpdo1.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_tpdo1.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_tpdo1.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_tpdo2.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_tpdo2.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_tpdo2.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_tpdo2.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_rpdo1.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_rpdo1.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_rpdo1.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_rpdo1.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_rpdo2.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_rpdo2.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/protocol/ti5_motor_rpdo2.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/protocol/ti5_motor_rpdo2.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/ti5_motor_canopen_protocol.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/ti5_motor_canopen_protocol.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/canopen/ti5_motor_canopen_protocol.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/canopen/ti5_motor_canopen_protocol.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dti5motor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -g -std=gnu++17 -fPIC -o cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/ti5_motor.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/ti5_motor.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor/ti5_motor.cpp", - "output": "cmvr-es/devices/motor/ti5_motor/CMakeFiles/ti5motor.dir/ti5_motor.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32 -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -g -std=gnu++17 -fPIC -o cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/device_factory.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/device_factory.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/device_factory.cpp", - "output": "cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/device_factory.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32 -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -g -std=gnu++17 -fPIC -o cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/device_manager.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/device_manager.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/device_manager.cpp", - "output": "cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/device_manager.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/uvc_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/speaker/ffmpeg_speaker -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/microphone/ffmpeg_microphone -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/rh56dftp_dexhand -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/dexhand/px_6ax_gen3 -I/home/lgv/cmvr/cmvr-es/cmvr-es/hardware -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/biohead/biohead_esp32 -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -g -std=gnu++17 -fPIC -o cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/system_monitor.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/system_monitor.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager/src/system_monitor.cpp", - "output": "cmvr-es/device_manager/CMakeFiles/device_manager.dir/src/system_monitor.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Ddisk_monitor_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor/diskmonitor -g -std=gnu++17 -fPIC -o cmvr-es/monitor/diskmonitor/CMakeFiles/disk_monitor.dir/src/disk_monitor.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/monitor/diskmonitor/src/disk_monitor.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/monitor/diskmonitor/src/disk_monitor.cpp", - "output": "cmvr-es/monitor/diskmonitor/CMakeFiles/disk_monitor.dir/src/disk_monitor.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor/diskmonitor -g -std=gnu++17 -fPIC -o cmvr-es/monitor_manager/CMakeFiles/monitor_manager.dir/src/monitor_factory.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager/src/monitor_factory.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager/src/monitor_factory.cpp", - "output": "cmvr-es/monitor_manager/CMakeFiles/monitor_manager.dir/src/monitor_factory.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor/diskmonitor -g -std=gnu++17 -fPIC -o cmvr-es/monitor_manager/CMakeFiles/monitor_manager.dir/src/monitor_manager.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager/src/monitor_manager.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager/src/monitor_manager.cpp", - "output": "cmvr-es/monitor_manager/CMakeFiles/monitor_manager.dir/src/monitor_manager.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_camera_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_camera_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_camera_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_camera_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_system_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_system_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_system_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_system_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_speaker_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_speaker_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_speaker_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_speaker_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_microphone_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_microphone_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_microphone_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_microphone_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_head_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_head_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_head_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_head_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_dexhand_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_dexhand_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_dexhand_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_dexhand_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_humanoid_robot_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_humanoid_robot_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_humanoid_robot_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_humanoid_robot_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_hlc_service.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_hlc_service.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_hlc_service.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/grpc_hlc_service.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/service/CMakeFiles/service.dir/grpc/src/server_runner.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/server_runner.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/server_runner.cpp", - "output": "cmvr-es/service/CMakeFiles/service.dir/grpc/src/server_runner.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o cmvr-es/service/CMakeFiles/grpc_humanoid_robot_client_test.dir/grpc/src/grpc_humanoid_robot_client_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_humanoid_robot_client_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_humanoid_robot_client_test.cpp", - "output": "cmvr-es/service/CMakeFiles/grpc_humanoid_robot_client_test.dir/grpc/src/grpc_humanoid_robot_client_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/third_party/gtest/1.17.0/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/service/CMakeFiles/grpc_hlc_client_test.dir/grpc/src/grpc_hlc_client_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_hlc_client_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/service/grpc/src/grpc_hlc_client_test.cpp", - "output": "cmvr-es/service/CMakeFiles/grpc_hlc_client_test.dir/grpc/src/grpc_hlc_client_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dperception_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/perception/CMakeFiles/perception.dir/src/tag_relative_target_3d.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/tag_relative_target_3d.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/tag_relative_target_3d.cpp", - "output": "cmvr-es/perception/CMakeFiles/perception.dir/src/tag_relative_target_3d.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dperception_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/perception/CMakeFiles/perception.dir/src/apriltag_perception.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/apriltag_perception.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/apriltag_perception.cpp", - "output": "cmvr-es/perception/CMakeFiles/perception.dir/src/apriltag_perception.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/realsense_camera -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o cmvr-es/perception/CMakeFiles/tag_relative_target_3d_test.dir/src/tag_relative_target_3d_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/tag_relative_target_3d_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/perception/src/tag_relative_target_3d_test.cpp", - "output": "cmvr-es/perception/CMakeFiles/tag_relative_target_3d_test.dir/src/tag_relative_target_3d_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcontroller_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/controller/CMakeFiles/controller.dir/src/ibvs_controller.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/ibvs_controller.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/ibvs_controller.cpp", - "output": "cmvr-es/controller/CMakeFiles/controller.dir/src/ibvs_controller.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcontroller_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/controller/CMakeFiles/controller.dir/src/pid_controller.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/pid_controller.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/pid_controller.cpp", - "output": "cmvr-es/controller/CMakeFiles/controller.dir/src/pid_controller.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DELPP_NO_DEFAULT_LOG_FILE -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/camera/mujoco_camera -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o cmvr-es/controller/CMakeFiles/controller_test.dir/src/controller_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/controller_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/controller/src/controller_test.cpp", - "output": "cmvr-es/controller/CMakeFiles/controller_test.dir/src/controller_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/joint_space_planner.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/joint_space_planner.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/joint_space_planner_creator.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner_creator.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner_creator.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/joint_space_planner_creator.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/toppra_bspline.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/toppra_bspline.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/toppra_bspline.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/joint_space_planner/src/toppra_bspline.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/s_curve_planner/src/s_curve_position_planner.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/s_curve_planner/src/s_curve_position_planner.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/s_curve_planner/src/s_curve_position_planner.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/s_curve_planner/src/s_curve_position_planner.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/s_curve_planner/src/s_curve_velocity_planner.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/s_curve_planner/src/s_curve_velocity_planner.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/s_curve_planner/src/s_curve_velocity_planner.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/s_curve_planner/src/s_curve_velocity_planner.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dplanner_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/planner/CMakeFiles/planner.dir/cartesian_space_planner/src/cartesian_twist_limiter.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/cartesian_space_planner/src/cartesian_twist_limiter.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/cartesian_space_planner/src/cartesian_twist_limiter.cpp", - "output": "cmvr-es/planner/CMakeFiles/planner.dir/cartesian_space_planner/src/cartesian_twist_limiter.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/planner/CMakeFiles/joint_space_planner_test.dir/joint_space_planner/src/joint_space_planner_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/joint_space_planner/src/joint_space_planner_test.cpp", - "output": "cmvr-es/planner/CMakeFiles/joint_space_planner_test.dir/joint_space_planner/src/joint_space_planner_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/planner/CMakeFiles/cartesian_twist_limiter_test.dir/cartesian_space_planner/src/cartesian_twist_limiter_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/planner/cartesian_space_planner/src/cartesian_twist_limiter_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/planner/cartesian_space_planner/src/cartesian_twist_limiter_test.cpp", - "output": "cmvr-es/planner/CMakeFiles/cartesian_twist_limiter_test.dir/cartesian_space_planner/src/cartesian_twist_limiter_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/ik_solver.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_solver.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_solver.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/ik_solver.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/ik_solver_creator.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_solver_creator.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_solver_creator.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/ik_solver_creator.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/urdf_parser.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/urdf_parser.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/urdf_parser.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/urdf_parser.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_ik_base.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_ik_base.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_ik_base.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_ik_base.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_dls_ik_solver.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_dls_ik_solver.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_dls_ik_solver.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_dls_ik_solver.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_qp_ik_solver.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_qp_ik_solver.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/pinocchio_qp_ik_solver.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/pinocchio_qp_ik_solver.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/bias_srs_ik_slover.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/bias_srs_ik_slover.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/bias_srs_ik_slover.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/bias_srs_ik_slover.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/joints_limit_analyzer.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/joints_limit_analyzer.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/joints_limit_analyzer.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/joints_limit_analyzer.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/lawba_ik_solver.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/lawba_ik_solver.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/lawba_ik_solver.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/lawba_ik_solver.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dik_solver_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/opt_psi_selector.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/opt_psi_selector.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/opt_psi_selector.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_solver.dir/src/opt_psi_selector.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/ik_solver/CMakeFiles/srs_ik_test.dir/src/srs_ik_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/srs_ik_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/srs_ik_test.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/srs_ik_test.dir/src/srs_ik_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIE -o cmvr-es/ik_solver/CMakeFiles/ik_test.dir/src/ik_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver/src/ik_test.cpp", - "output": "cmvr-es/ik_solver/CMakeFiles/ik_test.dir/src/ik_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -g -std=gnu++17 -fPIC -o cmvr-es/data_center/CMakeFiles/data_center.dir/src/data_center.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/data_center/src/data_center.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/data_center/src/data_center.cpp", - "output": "cmvr-es/data_center/CMakeFiles/data_center.dir/src/data_center.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/data_center -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/canbus -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/motor/ti5_motor -g -std=gnu++17 -fPIC -o cmvr-es/data_center/CMakeFiles/data_center.dir/src/motors_info.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/data_center/src/motors_info.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/data_center/src/motors_info.cpp", - "output": "cmvr-es/data_center/CMakeFiles/data_center.dir/src/motors_info.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIC -o cmvr-es/applications/CMakeFiles/applications.dir/src/touch_screen_app.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/applications/src/touch_screen_app.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/applications/src/touch_screen_app.cpp", - "output": "cmvr-es/applications/CMakeFiles/applications.dir/src/touch_screen_app.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/applications -I/home/lgv/cmvr/cmvr-es/cmvr-es/controller -I/home/lgv/cmvr/cmvr-es/cmvr-es/perception -I/home/lgv/cmvr/cmvr-es/cmvr-es/ik_solver -I/home/lgv/cmvr/cmvr-es/cmvr-es/planner -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices/robot/humanoid_robot -I/home/lgv/cmvr/cmvr-es/cmvr-es/device_manager -I/home/lgv/cmvr/cmvr-es/cmvr-es/service -I/home/lgv/cmvr/cmvr-es/cmvr-es/monitor_manager -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -g -std=gnu++17 -fPIE -o cmvr-es/applications/CMakeFiles/touch_screen_app_test.dir/src/touch_screen_app_test.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/applications/src/touch_screen_app_test.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/applications/src/touch_screen_app_test.cpp", - "output": "cmvr-es/applications/CMakeFiles/touch_screen_app_test.dir/src/touch_screen_app_test.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_viewer_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -g -std=gnu++17 -fPIC -o cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/glfw_adapter.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/glfw_adapter.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/glfw_adapter.cc", - "output": "cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/glfw_adapter.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_viewer_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -g -std=gnu++17 -fPIC -o cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/glfw_dispatch.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/glfw_dispatch.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/glfw_dispatch.cc", - "output": "cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/glfw_dispatch.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_viewer_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -g -std=gnu++17 -fPIC -o cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/mujoco_viewer.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/mujoco_viewer.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/mujoco_viewer.cpp", - "output": "cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/mujoco_viewer.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_viewer_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -g -std=gnu++17 -fPIC -o cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/platform_ui_adapter.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/platform_ui_adapter.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/platform_ui_adapter.cc", - "output": "cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/platform_ui_adapter.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -Dmujoco_viewer_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer -g -std=gnu++17 -fPIC -o cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/simulate.cc.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/simulate.cc", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/simulate/mujoco/mujoco_viewer/src/simulate.cc", - "output": "cmvr-es/simulate/mujoco/mujoco_viewer/CMakeFiles/mujoco_viewer.dir/src/simulate.cc.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/curve/src/s_curve.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/curve/src/s_curve.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/curve/src/s_curve.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/curve/src/s_curve.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/utils/config_helper/src/config_setting.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/config_helper/src/config_setting.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/config_helper/src/config_setting.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/utils/config_helper/src/config_setting.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/CameraCapture.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/CameraCapture.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/CameraCapture.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/CameraCapture.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/RealSenseCapture.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/RealSenseCapture.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/RealSenseCapture.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/RealSenseCapture.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/VideoFrameEncoder.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/VideoFrameEncoder.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/VideoFrameEncoder.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/VideoFrameEncoder.cpp.o" -}, -{ - "directory": "/home/lgv/cmvr/cmvr-es/cmake-build-debug", - "command": "/usr/bin/g++-11 -DPROTOBUF_USE_DLLS -Dcommon_EXPORTS -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/coal/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/console_bridge/v1.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/eigenpy/v3.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/Eigen3/v3.4.0 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/example-robot-data/v4.3.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/fcl/v0.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x264/v165/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/x265/v215/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg-jetson/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/ffmpeg/v4.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gflags/v2.2.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/glog/v0.5.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/gtest/v1.17.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jrl-cmakemodules/v1.1.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/jsoncpp/v1.9.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/libccd/v2.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/lodepng/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mujoco/v3.3.7/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp-eigen/v0.10.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/PCAN-Basic/v4.10.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/peak-linux-driver/v8.20.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pinocchio/v3.6.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/pybind11/v3.0.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/realsense/v2.56.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/tinyxml2/v11.0.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/toppra/v0.6.2/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom/v5.0.3/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/urdfdom_headers/v2.0.1/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/opencv/4.13.0/include/opencv4 -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/modbus/3.1.11/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/visp/3.7.0/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/mainif/0.0.5/include -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/matplotplusplus/1.2.0/include -I/home/lgv/cmvr/cmvr-es/cmake-build-debug/_protobuf -I/home/lgv/cmvr/cmvr-es/include -I/home/lgv/cmvr/cmvr-es/cmvr-es/devices -I/home/lgv/cmvr/cmvr-es/cmvr-es/utils -I/home/lgv/cmvr/cmvr-es/cmvr-es -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party -I/home/lgv/cmvr/cmvr-es/dependency/x86/third_party/osqp/v0.6.3/include/osqp -I/home/lgv/cmvr/cmvr-es/cmvr-es/common -I/home/lgv/cmvr/cmvr-es/protos -isystem /home/lgv/cmvr/cmvr-es/dependency/x86/third_party/grpc/v1.76.0/include -g -std=gnu++17 -fPIC -o cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/VideoWriter.cpp.o -c /home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/VideoWriter.cpp", - "file": "/home/lgv/cmvr/cmvr-es/cmvr-es/common/utils/ffmpeg/src/VideoWriter.cpp", - "output": "cmvr-es/common/CMakeFiles/common.dir/utils/ffmpeg/src/VideoWriter.cpp.o" -} -] \ No newline at end of file diff --git a/data/plot.png b/data/plot.png deleted file mode 100644 index fa1eda91..00000000 Binary files a/data/plot.png and /dev/null differ diff --git a/data/plot1.png b/data/plot1.png deleted file mode 100644 index 11a4ca21..00000000 Binary files a/data/plot1.png and /dev/null differ diff --git a/data/s_curve_acceleration.png b/data/s_curve_acceleration.png deleted file mode 100644 index c25c21ea..00000000 Binary files a/data/s_curve_acceleration.png and /dev/null differ diff --git a/data/s_curve_acceleration.svg b/data/s_curve_acceleration.svg deleted file mode 100644 index 08f41d97..00000000 --- a/data/s_curve_acceleration.svg +++ /dev/null @@ -1,544 +0,0 @@ - - - -Gnuplot -Produced by GNUPLOT 5.4 patchlevel 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -6 - - - - - - - - - - - - - -4 - - - - - - - - - - - - - -2 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 4 - - - - - - - - - - - - - 6 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 0.5 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 1.5 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 2.5 - - - - - - - - - - - - - 3 - - - - - - - - - acceleration [m/s2] - - - - - time [s] - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - - ZeroToPositiveVf - - - - PositiveV0ToRest - - - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - ZeroToRest - - - - - - ZeroToPositiveVf - - - ZeroToPositiveVf - - - - - - PositiveV0ToRest - - - PositiveV0ToRest - - - - - - - - - - - - - - - - SCurve Acceleration - - - - - - - diff --git a/data/s_curve_jerk.png b/data/s_curve_jerk.png deleted file mode 100644 index 26bdd840..00000000 Binary files a/data/s_curve_jerk.png and /dev/null differ diff --git a/data/s_curve_jerk.svg b/data/s_curve_jerk.svg deleted file mode 100644 index 9c43a0a9..00000000 --- a/data/s_curve_jerk.svg +++ /dev/null @@ -1,518 +0,0 @@ - - - -Gnuplot -Produced by GNUPLOT 5.4 patchlevel 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -10 - - - - - - - - - - - - - -5 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 5 - - - - - - - - - - - - - 10 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 0.5 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 1.5 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 2.5 - - - - - - - - - - - - - 3 - - - - - - - - - jerk [m/s3] - - - - - time [s] - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - - ZeroToPositiveVf - - - - PositiveV0ToRest - - - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - ZeroToRest - - - - - - ZeroToPositiveVf - - - ZeroToPositiveVf - - - - - - PositiveV0ToRest - - - PositiveV0ToRest - - - - - - - - - - - - - - - - SCurve Jerk - - - - - - - diff --git a/data/s_curve_position.png b/data/s_curve_position.png deleted file mode 100644 index b811df44..00000000 Binary files a/data/s_curve_position.png and /dev/null differ diff --git a/data/s_curve_position.svg b/data/s_curve_position.svg deleted file mode 100644 index 27d2cfcb..00000000 --- a/data/s_curve_position.svg +++ /dev/null @@ -1,531 +0,0 @@ - - - -Gnuplot -Produced by GNUPLOT 5.4 patchlevel 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 3 - - - - - - - - - - - - - 4 - - - - - - - - - - - - - 5 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 0.5 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 1.5 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 2.5 - - - - - - - - - - - - - 3 - - - - - - - - - position [m] - - - - - time [s] - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - - ZeroToPositiveVf - - - - PositiveV0ToRest - - - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - ZeroToRest - - - - - - ZeroToPositiveVf - - - ZeroToPositiveVf - - - - - - PositiveV0ToRest - - - PositiveV0ToRest - - - - - - - - - - - - - - - - SCurve Position - - - - - - - diff --git a/data/s_curve_velocity.png b/data/s_curve_velocity.png deleted file mode 100644 index 887b0764..00000000 Binary files a/data/s_curve_velocity.png and /dev/null differ diff --git a/data/s_curve_velocity.svg b/data/s_curve_velocity.svg deleted file mode 100644 index 825bab4e..00000000 --- a/data/s_curve_velocity.svg +++ /dev/null @@ -1,544 +0,0 @@ - - - -Gnuplot -Produced by GNUPLOT 5.4 patchlevel 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 0.5 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 1.5 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 2.5 - - - - - - - - - - - - - 3 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - 0.5 - - - - - - - - - - - - - 1 - - - - - - - - - - - - - 1.5 - - - - - - - - - - - - - 2 - - - - - - - - - - - - - 2.5 - - - - - - - - - - - - - 3 - - - - - - - - - velocity [m/s] - - - - - time [s] - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - - ZeroToPositiveVf - - - - PositiveV0ToRest - - - - - - - - - - - gnuplot_plot_1a - - - - - - gnuplot_plot_2a - - - - gnuplot_plot_3a - - - - ZeroToRest - - - ZeroToRest - - - - - - ZeroToPositiveVf - - - ZeroToPositiveVf - - - - - - PositiveV0ToRest - - - PositiveV0ToRest - - - - - - - - - - - - - - - - SCurve Velocity - - - - - - - diff --git a/model/ume/README.md b/model/ume/README.md index c7ac5076..794c3fb5 100644 --- a/model/ume/README.md +++ b/model/ume/README.md @@ -17,7 +17,7 @@ The source paths are `ume/robot/ume/v6_imu/models/robot.xml`, respectively. Only the model topology/dynamics parser is used. Pinocchio 3.6 -`mjcf::buildModel` and the adapter tests load these files without resolving +`mjcf::buildModel` and the model adapter load these files without resolving their visual STL assets, so no geometry files are duplicated here. The adapter enforces the model's structural contract. Integrations that require diff --git a/python/hand_eye_calibration/__pycache__/save_poses.cpython-310.pyc b/python/hand_eye_calibration/__pycache__/save_poses.cpython-310.pyc deleted file mode 100644 index b90060ed..00000000 Binary files a/python/hand_eye_calibration/__pycache__/save_poses.cpython-310.pyc and /dev/null differ diff --git a/python/hand_eye_calibration/libs/__pycache__/auxiliary.cpython-310.pyc b/python/hand_eye_calibration/libs/__pycache__/auxiliary.cpython-310.pyc deleted file mode 100644 index 43ab91f6..00000000 Binary files a/python/hand_eye_calibration/libs/__pycache__/auxiliary.cpython-310.pyc and /dev/null differ diff --git a/python/hand_eye_calibration/libs/__pycache__/log_setting.cpython-310.pyc b/python/hand_eye_calibration/libs/__pycache__/log_setting.cpython-310.pyc deleted file mode 100644 index e992eb09..00000000 Binary files a/python/hand_eye_calibration/libs/__pycache__/log_setting.cpython-310.pyc and /dev/null differ diff --git a/python/hand_eye_calibration/libs/web-log b/python/hand_eye_calibration/libs/web-log deleted file mode 100644 index b0db76de..00000000 --- a/python/hand_eye_calibration/libs/web-log +++ /dev/null @@ -1,256 +0,0 @@ -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:26:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:26:53 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:26:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:26:54 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:26:55 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:26:55 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-09-08 14:26:55 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-09-08 14:26:55 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:29:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:29:37 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:29:38 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:29:38 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:29:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:29:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:29:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:30:52 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:30:52 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:30:53 - __main__ - INFO: 旋转矩阵是: - [[ 0.72638143 0.22269568 -0.65021278] - [ 0.420903 0.60375531 0.67699349] - [ 0.54333294 -0.76543201 0.34482337]] -2025-09-08 14:30:53 - __main__ - INFO: 平移向量是: - [[ 0.15849038] - [-0.26275262] - [-0.05082269]] -2025-09-08 14:30:53 - __main__ - INFO: 四元数是: - [-0.44096563 -0.36488029 0.0605942 0.81776526] -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:32:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:32:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:32:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:32:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:32:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:32:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:32:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:32:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:32:27 - __main__ - INFO: 旋转矩阵是: - [[ 0.05477568 0.03458859 0.99789942] - [-0.99767126 0.04257346 0.0532875 ] - [-0.04064089 -0.99849443 0.03684003]] -2025-09-08 14:32:27 - __main__ - INFO: 平移向量是: - [[-0.14908435] - [-0.19737896] - [-0.05964516]] -2025-09-08 14:32:27 - __main__ - INFO: 四元数是: - [-0.49380213 0.48758531 -0.48463669 0.53249159] -2025-09-08 14:37:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-08 14:37:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-08 14:37:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-08 14:37:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-08 14:37:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-08 14:37:25 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-08 14:37:25 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-08 14:37:26 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-08 14:37:26 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-08 14:37:26 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-09-08 14:37:26 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-09-08 14:37:26 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] diff --git a/python/hand_eye_calibration/libs/web-log.2025-08-19.log b/python/hand_eye_calibration/libs/web-log.2025-08-19.log deleted file mode 100644 index 608d0060..00000000 Binary files a/python/hand_eye_calibration/libs/web-log.2025-08-19.log and /dev/null differ diff --git a/python/hand_eye_calibration/libs/web-log.2025-08-20.log b/python/hand_eye_calibration/libs/web-log.2025-08-20.log deleted file mode 100644 index 7d24ec1e..00000000 --- a/python/hand_eye_calibration/libs/web-log.2025-08-20.log +++ /dev/null @@ -1,1104 +0,0 @@ -2025-08-20 09:54:43 - libs.auxiliary - INFO: create folder eye_hand_data/data20250820 -2025-08-20 09:54:43 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 09:54:56 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498036656379405, 1.9220779272207082, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.022583500572145598] -2025-08-20 09:54:56 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422747 0.22819653 0.04587884] - [ 0.23038641 0.08867165 -0.96905079 -0.20770797] - [ 0.01293359 0.99547266 0.09416424 -0.45394911] - [ 0. 0. 0. 1. ]] -2025-08-20 09:54:56 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/1.jpg -2025-08-20 09:54:58 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498036656379405, 1.9220779272207082, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.02258255132660854] -2025-08-20 09:54:58 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422768 0.22819649 0.04587884] - [ 0.23038641 0.08867257 -0.96905071 -0.20770797] - [ 0.01293359 0.99547257 0.09416518 -0.45394911] - [ 0. 0. 0. 1. ]] -2025-08-20 09:54:58 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/2.jpg -2025-08-20 09:55:00 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498037605624942, 1.9220788764662453, 0.08685406814972796, -2.1525737285291187, -0.03590046621153153, 0.022583500572145598] -2025-08-20 09:55:00 - __main__ - INFO: 获取位姿成功: -[[ 0.97301353 -0.03422653 0.22819557 0.04587884] - [ 0.23038536 0.08867097 -0.96905111 -0.20770755] - [ 0.01293293 0.99547275 0.09416334 -0.45394917] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:00 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/3.jpg -2025-08-20 09:55:01 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498037605624942, 1.9220779272207082, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.02258255132660854] -2025-08-20 09:55:01 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422768 0.22819649 0.04587884] - [ 0.23038639 0.08867163 -0.9690508 -0.2077075 ] - [ 0.01293381 0.99547266 0.09416426 -0.45394914] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:01 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/4.jpg -2025-08-20 09:55:02 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498037605624942, 1.9220788764662453, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.022583500572145598] -2025-08-20 09:55:02 - __main__ - INFO: 获取位姿成功: -[[ 0.97301349 -0.03422745 0.2281956 0.04587884] - [ 0.23038547 0.08867075 -0.9690511 -0.20770755] - [ 0.01293387 0.99547274 0.09416334 -0.45394914] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:02 - __main__ - INFO: ===采集第5次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/5.jpg -2025-08-20 09:55:03 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498037605624942, 1.9220788764662453, 0.08685406814972796, -2.152574677774656, -0.03589951696599447, 0.022583500572145598] -2025-08-20 09:55:03 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422744 0.22819652 0.04587883] - [ 0.23038638 0.08867079 -0.96905088 -0.20770752] - [ 0.01293376 0.99547274 0.09416339 -0.45394914] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:03 - __main__ - INFO: ===采集第6次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/6.jpg -2025-08-20 09:55:05 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498038554870479, 1.9220779272207082, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.022583500572145598] -2025-08-20 09:55:05 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422747 0.22819651 0.04587884] - [ 0.23038637 0.08866976 -0.96905098 -0.20770703] - [ 0.01293403 0.99547283 0.0941624 -0.45394918] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:05 - __main__ - INFO: ===采集第7次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/7.jpg -2025-08-20 09:55:06 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.498038554870479, 1.9220779272207082, 0.08685406814972796, -2.1525737285291187, -0.03589951696599447, 0.022583500572145598] -2025-08-20 09:55:06 - __main__ - INFO: 获取位姿成功: -[[ 0.97301327 -0.03422747 0.22819651 0.04587884] - [ 0.23038637 0.08866976 -0.96905098 -0.20770703] - [ 0.01293403 0.99547283 0.0941624 -0.45394918] - [ 0. 0. 0. 1. ]] -2025-08-20 09:55:06 - __main__ - INFO: ===采集第8次数据! pose 已保存到 eye_hand_data/data20250820/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250820/8.jpg -2025-08-20 09:55:07 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 09:55:07 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 10:00:41 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082001 -2025-08-20 10:00:41 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 10:00:55 - __main__ - INFO: 当前关节角: [-0.007238946465603898, 1.4980499458169236, 1.9220779272207082, 0.08685691588633913, -2.152575627020193, -0.035890973756160946, 0.022575906607849135] -2025-08-20 10:00:55 - __main__ - INFO: 获取位姿成功: -[[ 0.97301246 -0.0342392 0.22819824 0.045879 ] - [ 0.23038913 0.08866486 -0.96905077 -0.20770154] - [ 0.01294636 0.99547286 0.09416036 -0.45394925] - [ 0. 0. 0. 1. ]] -2025-08-20 10:00:55 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082001/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082001/1.jpg -2025-08-20 10:00:56 - __main__ - INFO: 当前关节角: [-0.007238946465603898, 1.4980499458169236, 1.9220788764662453, 0.08685691588633913, -2.152575627020193, -0.035890973756160946, 0.022575906607849135] -2025-08-20 10:00:56 - __main__ - INFO: 获取位姿成功: -[[ 0.97301267 -0.03423919 0.22819731 0.045879 ] - [ 0.23038821 0.0886649 -0.96905098 -0.20770158] - [ 0.01294643 0.99547286 0.09416038 -0.45394924] - [ 0. 0. 0. 1. ]] -2025-08-20 10:00:56 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data2025082001/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082001/2.jpg -2025-08-20 10:00:57 - __main__ - INFO: 当前关节角: [-0.007238946465603898, 1.4980499458169236, 1.9220788764662453, 0.08685691588633913, -2.152575627020193, -0.035891923001698, 0.022575906607849135] -2025-08-20 10:00:57 - __main__ - INFO: 获取位姿成功: -[[ 0.97301271 -0.03423826 0.22819729 0.045879 ] - [ 0.2303881 0.08866512 -0.96905099 -0.20770159] - [ 0.01294548 0.99547287 0.09416038 -0.45394927] - [ 0. 0. 0. 1. ]] -2025-08-20 10:00:57 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data2025082001/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082001/3.jpg -2025-08-20 10:00:58 - __main__ - INFO: 当前关节角: [-0.00723799722006684, 1.4980499458169236, 1.9220788764662453, 0.08685691588633913, -2.152575627020193, -0.035890973756160946, 0.022575906607849135] -2025-08-20 10:00:58 - __main__ - INFO: 获取位姿成功: -[[ 0.97301266 -0.03424013 0.22819722 0.04587947] - [ 0.23038821 0.0886649 -0.96905098 -0.20770158] - [ 0.01294735 0.99547283 0.09416059 -0.4539492 ] - [ 0. 0. 0. 1. ]] -2025-08-20 10:00:58 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data2025082001/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082001/4.jpg -2025-08-20 10:00:59 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 10:01:00 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 10:30:16 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082002 -2025-08-20 10:30:16 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 10:30:42 - __main__ - INFO: robot.torqueOff -2025-08-20 10:31:18 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 10:31:37 - __main__ - INFO: 当前关节角: [0.11186573880566779, 1.4627959158161286, 1.9220152770152625, -0.05093366778191822, -0.9092177512512868, -0.030951099981311396, 0.23845807287325255] -2025-08-20 10:31:37 - __main__ - INFO: 获取位姿成功: -[[ 0.52119764 -0.24736929 -0.81679952 0.05920395] - [-0.84974048 -0.06144587 -0.52360818 -0.24590889] - [ 0.07933562 0.96697096 -0.24222514 -0.4500887 ] - [ 0. 0. 0. 1. ]] -2025-08-20 10:31:37 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 10:31:37 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082002/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082002/1.jpg -2025-08-20 10:31:39 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 10:31:39 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 10:51:55 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082003 -2025-08-20 10:51:55 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 10:52:04 - __main__ - INFO: robot.torqueOff -2025-08-20 11:25:43 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 11:25:44 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 11:26:15 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082004 -2025-08-20 11:26:15 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 11:26:26 - __main__ - INFO: robot.torqueOff -2025-08-20 11:31:17 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:31:17 - __main__ - INFO: 当前关节角: [-2.651948074436878, -1.3060526957549723, 1.6455010013158198, -0.6103430476809071, 0.09948188152920982, -0.05029862251762646, -0.3020356912087826] -2025-08-20 11:31:17 - __main__ - INFO: 获取位姿成功: -[[ 0.27619125 -0.94809435 0.15759281 0.33867107] - [ 0.95266231 0.29174352 0.08555842 -0.27150635] - [-0.12709414 0.12650224 0.98379076 -0.27915331] - [ 0. 0. 0. 1. ]] -2025-08-20 11:31:17 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:31:17 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082004/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082004/1.jpg -2025-08-20 11:31:24 - __main__ - INFO: robot.torqueOff -2025-08-20 11:31:29 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 11:31:30 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 11:31:35 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082005 -2025-08-20 11:31:35 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 11:31:43 - __main__ - INFO: robot.torqueOff -2025-08-20 11:32:01 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:32:51 - __main__ - INFO: robot.torqueOff -2025-08-20 11:32:59 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:33:19 - __main__ - INFO: robot.torqueOff -2025-08-20 11:33:28 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:33:35 - __main__ - INFO: 当前关节角: [-2.667841292463839, -1.2816153186489525, 1.6453282386280752, -0.8689422123594551, 0.16725421589299896, -0.05024071853986592, -0.21713232263770874] -2025-08-20 11:33:35 - __main__ - INFO: 获取位姿成功: -[[ 0.27955884 -0.96007438 -0.01019952 0.3549007 ] - [ 0.9578522 0.27814922 0.07177865 -0.2729717 ] - [-0.06607585 -0.02983599 0.99736844 -0.2202249 ] - [ 0. 0. 0. 1. ]] -2025-08-20 11:33:35 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:33:35 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/1.jpg -2025-08-20 11:33:38 - __main__ - INFO: robot.torqueOff -2025-08-20 11:33:47 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:33:57 - __main__ - INFO: robot.torqueOff -2025-08-20 11:34:06 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:34:12 - __main__ - INFO: 当前关节角: [-2.7427168311814327, -1.0574851579120526, 1.807436594464683, -1.0285189303487294, 0.2539545062657235, 0.158883768747222, -0.10335480332040624] -2025-08-20 11:34:12 - __main__ - INFO: 获取位姿成功: -[[ 0.2777794 -0.95904404 -0.05543589 0.31791437] - [ 0.95532897 0.26971945 0.12082208 -0.37176731] - [-0.10092156 -0.0865214 0.99112506 -0.16171829] - [ 0. 0. 0. 1. ]] -2025-08-20 11:34:12 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:34:12 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/2.jpg -2025-08-20 11:34:15 - __main__ - INFO: robot.torqueOff -2025-08-20 11:34:26 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:34:31 - __main__ - INFO: 当前关节角: [-2.7590637885751077, -0.8062084733063696, 2.027065432864854, -0.8694348707931883, 0.24372448711285005, 0.532676727084363, -0.09309156057373573] -2025-08-20 11:34:31 - __main__ - INFO: 获取位姿成功: -[[ 0.22208051 -0.97501407 0.0052729 0.25405466] - [ 0.95908004 0.21941892 0.17894361 -0.48699537] - [-0.17562951 -0.03468276 0.9838452 -0.12064719] - [ 0. 0. 0. 1. ]] -2025-08-20 11:34:31 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:34:31 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/3.jpg -2025-08-20 11:34:33 - __main__ - INFO: robot.torqueOff -2025-08-20 11:34:42 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:34:47 - __main__ - INFO: 当前关节角: [-2.782934466095504, -0.5803915032501177, 2.091387259701438, -0.7553535929040271, 0.23251484656573276, 0.7117737302976969, -0.24883047885668474] -2025-08-20 11:34:47 - __main__ - INFO: 获取位姿成功: -[[ 0.20252563 -0.9771179 -0.06499212 0.2028304 ] - [ 0.9356907 0.17350519 0.30721142 -0.55014374] - [-0.28890531 -0.12303071 0.94941938 -0.06964596] - [ 0. 0. 0. 1. ]] -2025-08-20 11:34:47 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:34:47 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/4.jpg -2025-08-20 11:34:49 - __main__ - INFO: robot.torqueOff -2025-08-20 11:35:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:35:06 - __main__ - INFO: 当前关节角: [-2.7773557500742143, -0.4273569855022468, 1.990266980375266, -1.155712136841272, 1.0984726309566777, 0.3962767881278955, 0.5551766940492475] -2025-08-20 11:35:06 - __main__ - INFO: 获取位姿成功: -[[ 0.13419875 -0.99089275 -0.01105719 0.22012738] - [ 0.98836252 0.13464592 -0.07078143 -0.49871061] - [ 0.07162561 -0.00142973 0.99743056 0.06148901] - [ 0. 0. 0. 1. ]] -2025-08-20 11:35:06 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:35:06 - __main__ - INFO: ===采集第5次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/5.jpg -2025-08-20 11:35:08 - __main__ - INFO: robot.torqueOff -2025-08-20 11:35:19 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:35:26 - __main__ - INFO: 当前关节角: [-2.786382125886098, -0.5418995967224179, 1.779420561683955, -1.4977945987674552, 1.2146916097952933, -0.0548075388186517, 0.696672183048642] -2025-08-20 11:35:26 - __main__ - INFO: 获取位姿成功: -[[ 0.10749988 -0.97909741 0.17266164 0.26378689] - [ 0.95873485 0.05611448 -0.27870891 -0.39850777] - [ 0.26319435 0.1954979 0.9447271 0.04603196] - [ 0. 0. 0. 1. ]] -2025-08-20 11:35:26 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:35:26 - __main__ - INFO: ===采集第6次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/6.jpg -2025-08-20 11:35:27 - __main__ - INFO: robot.torqueOff -2025-08-20 11:35:36 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:35:41 - __main__ - INFO: 当前关节角: [-2.799370652569662, -0.5832297474059209, 1.7727995740629756, -1.5223250019361065, 1.1548492726480861, -0.054790452398984654, 0.440121490239065] -2025-08-20 11:35:41 - __main__ - INFO: 获取位姿成功: -[[ 0.10460907 -0.9923942 -0.06488994 0.26711558] - [ 0.96599954 0.11690533 -0.23060363 -0.38824267] - [ 0.23643568 -0.03856042 0.97088169 0.03413653] - [ 0. 0. 0. 1. ]] -2025-08-20 11:35:41 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:35:41 - __main__ - INFO: ===采集第7次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/7.jpg -2025-08-20 11:35:43 - __main__ - INFO: robot.torqueOff -2025-08-20 11:36:01 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:36:06 - __main__ - INFO: 当前关节角: [-2.0370809225263526, -1.2750142651842515, 1.1785291518155336, -1.7961139936986559, 0.1593640869889733, -0.7638426957419364, 1.4928680144301243] -2025-08-20 11:36:06 - __main__ - INFO: 获取位姿成功: -[[ 0.15552225 -0.96586249 0.20717743 0.29572925] - [ 0.94505578 0.08442892 -0.31581852 -0.11055109] - [ 0.28754549 0.24491104 0.9259245 0.15520871] - [ 0. 0. 0. 1. ]] -2025-08-20 11:36:06 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:36:06 - __main__ - INFO: ===采集第8次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/8.jpg -2025-08-20 11:36:07 - __main__ - INFO: robot.torqueOff -2025-08-20 11:36:15 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:36:21 - __main__ - INFO: 当前关节角: [-2.1111780799035587, -1.0638859205684343, 1.2061237195778083, -1.6851538351353414, 0.357820952930604, -0.7654307835254344, 1.088731473255389] -2025-08-20 11:36:21 - __main__ - INFO: 获取位姿成功: -[[ 0.3062964 -0.95183114 0.01414199 0.33093188] - [ 0.91746645 0.29121123 -0.27101906 -0.17392187] - [ 0.25384607 0.09598696 0.96247009 0.12609413] - [ 0. 0. 0. 1. ]] -2025-08-20 11:36:21 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:36:21 - __main__ - INFO: ===采集第9次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/9.jpg -2025-08-20 11:36:23 - __main__ - INFO: robot.torqueOff -2025-08-20 11:36:34 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:36:39 - __main__ - INFO: robot.torqueOff -2025-08-20 11:36:45 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:36:50 - __main__ - INFO: 当前关节角: [-1.9882934989037224, -1.5578770950355378, 0.8138128793037408, -1.1872906881225787, 0.08319567584990664, -1.3335561359456893, 0.6900834697759228] -2025-08-20 11:36:50 - __main__ - INFO: 获取位姿成功: -[[ 0.52786704 -0.81179547 -0.2496888 0.39943565] - [ 0.78974482 0.57731597 -0.20738706 0.00682057] - [ 0.31250521 -0.08771764 0.94585734 0.06484517] - [ 0. 0. 0. 1. ]] -2025-08-20 11:36:50 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:36:50 - __main__ - INFO: ===采集第10次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/10.jpg -2025-08-20 11:36:53 - __main__ - INFO: robot.torqueOff -2025-08-20 11:37:07 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:37:11 - __main__ - INFO: robot.torqueOff -2025-08-20 11:37:27 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:37:34 - __main__ - INFO: robot.torqueOff -2025-08-20 11:37:48 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:37:52 - __main__ - INFO: 当前关节角: [-2.064885273552317, -1.5847483376985743, 0.9748163133352132, -0.9252334219525284, 0.4790747300977749, -1.1735978212505176, -0.09822792817475627] -2025-08-20 11:37:53 - __main__ - INFO: 获取位姿成功: -[[ 0.59352438 -0.71833302 -0.36294143 0.44645306] - [ 0.76345885 0.64522592 -0.02853255 -0.0308873 ] - [ 0.25467509 -0.26015608 0.93137501 0.00571151] - [ 0. 0. 0. 1. ]] -2025-08-20 11:37:53 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:37:53 - __main__ - INFO: ===采集第11次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/11.jpg -2025-08-20 11:37:54 - __main__ - INFO: robot.torqueOff -2025-08-20 11:38:11 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:38:18 - __main__ - INFO: 当前关节角: [-1.0750974596066258, -1.0530882525844003, 1.202661821104158, -1.1384709901516885, 0.618269247915341, -0.4266668839968057, 1.8304966162964318] -2025-08-20 11:38:18 - __main__ - INFO: 获取位姿成功: -[[ 0.02323262 -0.95066269 0.3093553 0.20661784] - [ 0.93936916 -0.0851352 -0.33217101 -0.24746959] - [ 0.34211961 0.29831603 0.89104529 0.40341777] - [ 0. 0. 0. 1. ]] -2025-08-20 11:38:18 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:38:18 - __main__ - INFO: ===采集第12次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/12.jpg -2025-08-20 11:38:19 - __main__ - INFO: robot.torqueOff -2025-08-20 11:38:33 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:38:39 - __main__ - INFO: 当前关节角: [-1.1932538485863766, -0.3593985990131943, 1.199421096840642, -1.0661631606118365, 1.5343851664844277, 0.013353036969794129, 1.7179777965612681] -2025-08-20 11:38:39 - __main__ - INFO: 获取位姿成功: -[[-0.26676796 -0.92549148 0.2688873 0.1070502 ] - [ 0.89695267 -0.34048413 -0.28203983 -0.4629952 ] - [ 0.35257732 0.16594 0.92095231 0.31669506] - [ 0. 0. 0. 1. ]] -2025-08-20 11:38:39 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:38:39 - __main__ - INFO: ===采集第13次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/13.jpg -2025-08-20 11:38:40 - __main__ - INFO: robot.torqueOff -2025-08-20 11:38:52 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:38:56 - __main__ - INFO: 当前关节角: [-0.9979826506671123, -1.6711951795129043, 1.0606907600906974, -1.1554264139346175, -0.17462320899717979, -0.7334753817659156, 2.070575051301442] -2025-08-20 11:38:56 - __main__ - INFO: 获取位姿成功: -[[ 0.17630072 -0.97337824 0.14646792 0.18120904] - [ 0.94639296 0.12670266 -0.29713093 0.00320103] - [ 0.27066291 0.19100061 0.94353609 0.40016574] - [ 0. 0. 0. 1. ]] -2025-08-20 11:38:56 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:38:56 - __main__ - INFO: ===采集第14次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/14.jpg -2025-08-20 11:38:57 - __main__ - INFO: robot.torqueOff -2025-08-20 11:39:50 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:39:54 - __main__ - INFO: 当前关节角: [-2.5679218087420455, -1.2360353956960413, 2.163585926004528, -1.2738875107317638, 0.24506102482902764, 0.37729567436888484, -0.28499768306412954] -2025-08-20 11:39:54 - __main__ - INFO: 获取位姿成功: -[[ 0.21985256 -0.69956035 -0.67991188 0.31423333] - [ 0.96383251 0.26338894 0.04065907 -0.37379439] - [ 0.1506378 -0.66426018 0.73216574 -0.06570926] - [ 0. 0. 0. 1. ]] -2025-08-20 11:39:54 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:39:54 - __main__ - INFO: ===采集第15次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/15.jpg -2025-08-20 11:39:56 - __main__ - INFO: robot.torqueOff -2025-08-20 11:40:27 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:40:30 - __main__ - INFO: robot.torqueOff -2025-08-20 11:40:38 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:40:42 - __main__ - INFO: 当前关节角: [-2.9687435845013743, 1.616818598168077, 1.8944805117218226, -1.4336379406543198, 2.99140777094417, -1.0294045764348045, 0.3738404206139939] -2025-08-20 11:40:42 - __main__ - INFO: 获取位姿成功: -[[ 0.64204072 -0.76380034 -0.06627791 0.20144855] - [ 0.75751403 0.64531872 -0.09867241 -0.05683629] - [ 0.1181364 0.01314526 0.99291037 0.36172528] - [ 0. 0. 0. 1. ]] -2025-08-20 11:40:42 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:40:42 - __main__ - INFO: ===采集第16次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/16.jpg -2025-08-20 11:40:45 - __main__ - INFO: robot.torqueOff -2025-08-20 11:40:53 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 11:40:57 - __main__ - INFO: 当前关节角: [-3.0478622507696174, 0.8171124567905542, 1.6310088697015561, -0.908173581160523, 2.282334644199403, 0.2767392468917254, 0.400527509642841] -2025-08-20 11:40:57 - __main__ - INFO: 获取位姿成功: -[[ 0.20332387 -0.9654331 -0.16308996 0.17291884] - [ 0.97549797 0.18544594 0.11837869 -0.40903036] - [-0.08404234 -0.18316314 0.97948361 0.35856547] - [ 0. 0. 0. 1. ]] -2025-08-20 11:40:57 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 11:40:57 - __main__ - INFO: ===采集第17次数据! pose 已保存到 eye_hand_data/data2025082005/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082005/17.jpg -2025-08-20 11:40:59 - __main__ - INFO: robot.torqueOff -2025-08-20 11:41:40 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 11:41:41 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 13:59:58 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082006 -2025-08-20 13:59:58 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 13:59:59 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 14:00:28 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082007 -2025-08-20 14:00:28 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 14:01:18 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 14:01:19 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 14:01:25 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082008 -2025-08-20 14:01:25 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 14:01:47 - __main__ - INFO: robot.torqueOff -2025-08-20 14:01:57 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 14:01:58 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 14:02:35 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082009 -2025-08-20 14:02:35 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 14:02:43 - __main__ - INFO: robot.torqueOff -2025-08-20 14:04:29 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:04:37 - __main__ - INFO: robot.torqueOff -2025-08-20 14:04:45 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:04:58 - __main__ - INFO: 当前关节角: [-2.860337845678283, -1.397555219299673, 2.0252352874694064, -1.0969272592223474, -0.16422327489317293, 0.6307841010759129, -0.2368320152682723] -2025-08-20 14:04:58 - __main__ - INFO: 获取位姿成功: -[[-0.16395738 -0.98632494 -0.01676548 0.2810995 ] - [ 0.98423078 -0.16470583 0.06451166 -0.29995445] - [-0.06639083 -0.00592393 0.99777611 -0.23273999] - [ 0. 0. 0. 1. ]] -2025-08-20 14:04:58 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:04:58 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:05:00 - __main__ - INFO: robot.torqueOff -2025-08-20 14:05:10 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:05:17 - __main__ - INFO: 当前关节角: [-2.9108500484417474, -1.217145409508588, 2.146251753252313, -1.1118560437836578, -0.01833942377595952, 0.8426756391035247, -0.15500135450065497] -2025-08-20 14:05:17 - __main__ - INFO: 获取位姿成功: -[[-0.19375254 -0.98100008 0.00993916 0.24418529] - [ 0.97878718 -0.19260787 0.06984168 -0.38038904] - [-0.06660033 0.02326033 0.99750857 -0.20525812] - [ 0. 0. 0. 1. ]] -2025-08-20 14:05:17 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:05:17 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:05:19 - __main__ - INFO: robot.torqueOff -2025-08-20 14:05:30 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:05:38 - __main__ - INFO: robot.torqueOff -2025-08-20 14:05:44 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:05:48 - __main__ - INFO: robot.torqueOff -2025-08-20 14:05:54 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:06:00 - __main__ - INFO: 当前关节角: [-2.8767113819469956, -1.1714050640599138, 2.1948816021157915, -1.2464932337778085, -0.33234889818919106, 0.9236481819056417, -0.2588829890941284] -2025-08-20 14:06:00 - __main__ - INFO: 获取位姿成功: -[[-0.24048553 -0.96995889 -0.03669408 0.2430299 ] - [ 0.89330918 -0.2359526 0.38252462 -0.39933358] - [-0.37969122 0.05921248 0.92321637 -0.16032958] - [ 0. 0. 0. 1. ]] -2025-08-20 14:06:00 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:06:00 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:06:02 - __main__ - INFO: robot.torqueOff -2025-08-20 14:06:10 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:06:15 - __main__ - INFO: 当前关节角: [-2.8960247316439762, -1.1171215087777182, 2.457270154978275, -1.0737191550868177, -0.21691684390079657, 1.085321783286277, -0.2536925144974955] -2025-08-20 14:06:15 - __main__ - INFO: 获取位姿成功: -[[-0.13760853 -0.99039869 -0.01320328 0.19258248] - [ 0.97988083 -0.13806846 0.14412032 -0.4556436 ] - [-0.14455954 0.00689455 0.98947208 -0.17809969] - [ 0. 0. 0. 1. ]] -2025-08-20 14:06:15 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:06:15 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:06:17 - __main__ - INFO: robot.torqueOff -2025-08-20 14:06:28 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:06:34 - __main__ - INFO: 当前关节角: [-2.895932654826882, -1.136302913345048, 2.3703762185159905, -1.4080842507967197, -0.5981243591278972, 0.9507244616046825, -0.28384814671875236] -2025-08-20 14:06:34 - __main__ - INFO: 获取位姿成功: -[[-0.1055292 -0.99278924 0.05686049 0.2089658 ] - [ 0.78002265 -0.04717608 0.62397041 -0.42963626] - [-0.61678866 0.11019957 0.77937655 -0.11836521] - [ 0. 0. 0. 1. ]] -2025-08-20 14:06:34 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:06:34 - __main__ - INFO: ===采集第5次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:06:35 - __main__ - INFO: robot.torqueOff -2025-08-20 14:06:57 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:07:02 - __main__ - INFO: 当前关节角: [-2.7922010010282636, -1.198485140741103, 2.602807531474462, -1.6992320956954479, 0.9828621185073163, 0.9554080390845264, 1.519222867521001] -2025-08-20 14:07:03 - __main__ - INFO: 获取位姿成功: -[[-0.16681717 -0.9424688 0.28969742 0.15720106] - [ 0.98494471 -0.14577393 0.09291867 -0.418235 ] - [-0.04534262 0.30083637 0.95259725 -0.03442695] - [ 0. 0. 0. 1. ]] -2025-08-20 14:07:03 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:07:03 - __main__ - INFO: ===采集第6次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:07:03 - __main__ - INFO: robot.torqueOff -2025-08-20 14:07:13 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:07:24 - __main__ - INFO: 当前关节角: [-2.798477412519291, -1.0798303978543966, 2.450834270237022, -1.9171181192895805, 0.7499163144677593, 0.992160927788336, 1.3116390057405583] -2025-08-20 14:07:24 - __main__ - INFO: 获取位姿成功: -[[-0.12546073 -0.97101801 0.20342968 0.15722323] - [ 0.87744671 -0.01291482 0.47950023 -0.38189769] - [-0.4629761 0.23865715 0.85363686 0.02103926] - [ 0. 0. 0. 1. ]] -2025-08-20 14:07:24 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:07:24 - __main__ - INFO: ===采集第7次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:07:26 - __main__ - INFO: robot.torqueOff -2025-08-20 14:07:34 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:07:39 - __main__ - INFO: 当前关节角: [-2.2133918900884213, -1.1263130533130503, 1.8354573734730966, -2.0067867004566855, 0.4697626313792364, -0.028983313982990273, 2.044217350473954] -2025-08-20 14:07:39 - __main__ - INFO: 获取位姿成功: -[[ 0.05006683 -0.81857593 0.57221216 0.21641723] - [ 0.99722798 0.00939751 -0.07381085 -0.25666936] - [ 0.05504241 0.57432145 0.81677733 0.15489376] - [ 0. 0. 0. 1. ]] -2025-08-20 14:07:39 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:07:39 - __main__ - INFO: ===采集第8次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:07:40 - __main__ - INFO: robot.torqueOff -2025-08-20 14:07:48 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:07:52 - __main__ - INFO: 当前关节角: [-2.285479494663676, -1.323132470703256, 1.1370831931765097, -1.9620145854558102, -0.329922626596471, -0.16446912948727094, 1.8630386517978523] -2025-08-20 14:07:52 - __main__ - INFO: 获取位姿成功: -[[ 0.2541324 -0.79104318 0.55647768 0.2759644 ] - [ 0.87524293 0.43292317 0.21570197 -0.08896943] - [-0.41154166 0.4322363 0.80237475 0.07335788] - [ 0. 0. 0. 1. ]] -2025-08-20 14:07:52 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:07:52 - __main__ - INFO: ===采集第9次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:07:53 - __main__ - INFO: robot.torqueOff -2025-08-20 14:08:01 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:08:06 - __main__ - INFO: 当前关节角: [-2.3440849648760964, -1.6339980438977515, 0.8394557982418241, -1.6024213911075191, -0.6461723204771592, -0.6819873545903555, 1.6445735884261141] -2025-08-20 14:08:06 - __main__ - INFO: 获取位姿成功: -[[ 0.32520519 -0.8561661 0.4015236 0.30455147] - [ 0.91842517 0.3870982 0.0815487 0.0377295 ] - [-0.22524829 0.34224932 0.91221084 0.00634541] - [ 0. 0. 0. 1. ]] -2025-08-20 14:08:06 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:08:06 - __main__ - INFO: ===采集第10次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:08:08 - __main__ - INFO: robot.torqueOff -2025-08-20 14:08:16 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:08:21 - __main__ - INFO: robot.torqueOff -2025-08-20 14:08:30 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:08:36 - __main__ - INFO: robot.torqueOff -2025-08-20 14:08:43 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:08:48 - __main__ - INFO: 当前关节角: [-2.497259021717915, -1.6540622468145454, 0.8332420369562429, -1.6059222086481888, -0.741180407790215, -0.5510446282264343, 1.4580886071978583] -2025-08-20 14:08:48 - __main__ - INFO: 获取位姿成功: -[[ 0.27527833 -0.89018499 0.3630324 0.29155814] - [ 0.8740154 0.38901255 0.29114655 0.04205002] - [-0.40039844 0.23714957 0.88512212 -0.04047238] - [ 0. 0. 0. 1. ]] -2025-08-20 14:08:48 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:08:48 - __main__ - INFO: ===采集第11次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:08:50 - __main__ - INFO: robot.torqueOff -2025-08-20 14:09:08 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:09:15 - __main__ - INFO: 当前关节角: [-2.67787197005393, -1.695893599141615, 0.9758396000241617, -1.0902246364851813, 0.3696713342152354, -1.0488109521944171, -0.12474225451585882] -2025-08-20 14:09:15 - __main__ - INFO: 获取位姿成功: -[[ 0.45678441 -0.88918966 0.02626305 0.33237336] - [ 0.88584264 0.45196591 -0.10492676 0.02391353] - [ 0.08142979 0.07119384 0.9941331 -0.18395896] - [ 0. 0. 0. 1. ]] -2025-08-20 14:09:15 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:09:15 - __main__ - INFO: ===采集第12次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:09:15 - __main__ - INFO: robot.torqueOff -2025-08-20 14:09:29 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:09:34 - __main__ - INFO: robot.torqueOff -2025-08-20 14:09:41 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:09:47 - __main__ - INFO: 当前关节角: [-2.7174061481813196, -1.645996507486164, 0.9696543161046921, -0.7109640238545865, -0.07768720399835938, -1.030985070254006, -0.14346802122540092] -2025-08-20 14:09:47 - __main__ - INFO: 获取位姿成功: -[[ 0.388996 -0.91389276 0.11611258 0.31099434] - [ 0.77084337 0.39191325 0.50219966 -0.02327599] - [-0.5044627 -0.10584904 0.85692086 -0.31035607] - [ 0. 0. 0. 1. ]] -2025-08-20 14:09:47 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:09:47 - __main__ - INFO: ===采集第13次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:09:48 - __main__ - INFO: robot.torqueOff -2025-08-20 14:10:03 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:10:07 - __main__ - INFO: robot.torqueOff -2025-08-20 14:10:23 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:10:28 - __main__ - INFO: robot.torqueOff -2025-08-20 14:10:36 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:10:40 - __main__ - INFO: robot.torqueOff -2025-08-20 14:10:54 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:11:01 - __main__ - INFO: 当前关节角: [-2.59334165497892, -1.7232641449571438, 0.8401060314347089, -1.2428718620539325, -0.3679408596011788, -1.0488982827838265, 0.777891529690394] -2025-08-20 14:11:01 - __main__ - INFO: 获取位姿成功: -[[ 0.38350728 -0.90548657 0.18170369 0.31897592] - [ 0.91383861 0.40050188 0.06706149 0.06206318] - [-0.13349594 0.14032928 0.98106398 -0.12864962] - [ 0. 0. 0. 1. ]] -2025-08-20 14:11:01 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:11:01 - __main__ - INFO: ===采集第14次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:11:02 - __main__ - INFO: robot.torqueOff -2025-08-20 14:11:15 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:11:20 - __main__ - INFO: 当前关节角: [-2.524884914582912, -1.8413208631555036, 0.8301389532956004, -1.9373436939476743, -1.181938841784646, -0.40802465089452467, 1.9857229419893694] -2025-08-20 14:11:20 - __main__ - INFO: 获取位姿成功: -[[ 0.46733478 -0.77023683 0.43397401 0.21932794] - [ 0.86020935 0.50946101 -0.02212141 0.04891959] - [-0.20405411 0.3836466 0.90065376 0.04292094] - [ 0. 0. 0. 1. ]] -2025-08-20 14:11:20 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:11:20 - __main__ - INFO: ===采集第15次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:11:21 - __main__ - INFO: robot.torqueOff -2025-08-20 14:11:40 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:11:44 - __main__ - INFO: 当前关节角: [-2.5734616056963158, -1.111399456680333, 2.3367102762986933, -1.7749239855749113, 0.9300223656869857, 0.7028081062001845, 1.7020646443780287] -2025-08-20 14:11:44 - __main__ - INFO: 获取位姿成功: -[[-0.21538374 -0.90042002 0.37795983 0.19757147] - [ 0.9724784 -0.1625549 0.16691814 -0.3817943 ] - [-0.08885721 0.40350922 0.9106507 0.04632134] - [ 0. 0. 0. 1. ]] -2025-08-20 14:11:44 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:11:44 - __main__ - INFO: ===采集第16次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:11:45 - __main__ - INFO: robot.torqueOff -2025-08-20 14:12:51 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:12:57 - __main__ - INFO: 当前关节角: [-2.562403844435128, -1.1884221888027517, 2.1572573060089626, -1.0425307437212419, -0.6156199036214122, 0.9407915563049082, -0.19512121712440908] -2025-08-20 14:12:57 - __main__ - INFO: 获取位姿成功: -[[-0.26075281 -0.96339061 0.06234184 0.30846709] - [ 0.86038398 -0.20261143 0.4676409 -0.39571944] - [-0.43788968 0.1755766 0.88171735 -0.12749709] - [ 0. 0. 0. 1. ]] -2025-08-20 14:12:57 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:12:57 - __main__ - INFO: ===采集第17次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:12:58 - __main__ - INFO: robot.torqueOff -2025-08-20 14:13:14 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:13:20 - __main__ - INFO: robot.torqueOff -2025-08-20 14:13:26 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:13:31 - __main__ - INFO: 当前关节角: [-2.5375022862614864, -1.3847527447413726, 2.1184644886460156, -1.615819991863092, -0.2114444433796575, 0.9092699597558249, 0.7430675079178862] -2025-08-20 14:13:31 - __main__ - INFO: 获取位姿成功: -[[-0.10398076 -0.96201607 0.25241449 0.29135046] - [ 0.87394009 0.03277464 0.48492735 -0.31623915] - [-0.4747807 0.27101825 0.83733649 -0.02503839] - [ 0. 0. 0. 1. ]] -2025-08-20 14:13:31 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:13:31 - __main__ - INFO: ===采集第18次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:13:32 - __main__ - INFO: robot.torqueOff -2025-08-20 14:13:45 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:13:49 - __main__ - INFO: 当前关节角: [-2.472082182338527, -1.7953982625637142, 1.247466210453293, -1.7028449242094903, -0.6526480735309685, -0.47461327607360254, 1.5201929964598744] -2025-08-20 14:13:49 - __main__ - INFO: 获取位姿成功: -[[ 0.38556585 -0.80444241 0.45189753 0.31566391] - [ 0.92142331 0.36125553 -0.14308573 -0.01852427] - [-0.04814625 0.47155789 0.88051979 0.03345264] - [ 0. 0. 0. 1. ]] -2025-08-20 14:13:49 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:13:49 - __main__ - INFO: ===采集第19次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:13:51 - __main__ - INFO: robot.torqueOff -2025-08-20 14:14:01 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:14:06 - __main__ - INFO: 当前关节角: [-2.6700397451276654, -1.7032094344957205, 1.2031801091673915, -1.7198525564969576, -0.7150951404318626, -0.1940077521094401, 1.2712049428440382] -2025-08-20 14:14:06 - __main__ - INFO: 获取位姿成功: -[[ 0.22670363 -0.85123977 0.4732825 0.30212498] - [ 0.86749479 0.39739454 0.29921626 -0.02912893] - [-0.44278467 0.34273669 0.82853684 -0.04460204] - [ 0. 0. 0. 1. ]] -2025-08-20 14:14:06 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:14:06 - __main__ - INFO: ===采集第20次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:14:08 - __main__ - INFO: robot.torqueOff -2025-08-20 14:14:38 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:14:54 - __main__ - INFO: robot.torqueOff -2025-08-20 14:16:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:16:04 - __main__ - INFO: 当前关节角: [-2.7266717338685424, -1.4964087002833506, 2.1396905681001686, -1.2463555931749353, 0.2724942208500023, 0.5135987902805724, 0.49249611274623717] -2025-08-20 14:16:04 - __main__ - INFO: 获取位姿成功: -[[-0.01268576 -0.97706624 0.21255736 0.31018606] - [ 0.94294893 -0.08241786 -0.32257497 -0.29397731] - [ 0.33269564 0.19633863 0.9223691 -0.15981144] - [ 0. 0. 0. 1. ]] -2025-08-20 14:16:04 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:16:04 - __main__ - INFO: ===采集第21次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:16:05 - __main__ - INFO: robot.torqueOff -2025-08-20 14:16:16 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:16:22 - __main__ - INFO: robot.torqueOff -2025-08-20 14:16:29 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:16:35 - __main__ - INFO: robot.torqueOff -2025-08-20 14:16:40 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-20 14:16:51 - __main__ - INFO: 当前关节角: [-2.6900802169060327, -1.6929186636284754, 1.3311004377413205, -1.136432959983625, -0.567748501942043, -0.5687110369166197, 0.3733525084079461] -2025-08-20 14:16:51 - __main__ - INFO: 获取位姿成功: -[[ 0.34430947 -0.92138619 0.18027335 0.35856051] - [ 0.83282029 0.38838393 0.39442146 -0.04957 ] - [-0.43342976 0.01433226 0.90107338 -0.1862423 ] - [ 0. 0. 0. 1. ]] -2025-08-20 14:16:51 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 14:16:51 - __main__ - INFO: ===采集第22次数据! pose 已保存到 eye_hand_data/data2025082009/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082009/22.jpg -2025-08-20 14:16:52 - __main__ - INFO: robot.torqueOff -2025-08-20 14:17:12 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 14:17:13 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-20 14:19:02 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:19:02 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:19:03 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:19:03 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:19:03 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:19:03 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:19:04 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:19:04 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:19:04 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:19:04 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:19:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:19:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:19:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:19:06 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:19:06 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:19:06 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:19:07 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:19:07 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:19:07 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:19:07 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:19:08 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:23:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:27:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:27:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:27:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:27:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:27:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:27:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:27:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:27:25 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:27:25 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:27:25 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:27:25 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:27:26 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:27:26 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:27:26 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:27:26 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:27:27 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:27:27 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:27:27 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:27:27 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:27:27 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:27:28 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:27:39 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:27:39 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:27:40 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:27:40 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:27:40 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:27:40 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:27:41 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:27:41 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:27:41 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:27:41 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:27:42 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:27:42 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:27:49 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:28:39 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:28:51 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:28:52 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:28:52 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:28:52 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:28:57 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 14:28:57 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 14:28:57 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 14:31:17 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:31:17 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:31:17 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:31:17 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:31:17 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:31:18 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:31:18 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 14:31:18 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 14:31:18 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 14:57:14 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 14:57:14 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 14:57:14 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 14:57:14 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 15:51:10 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 15:51:11 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 15:51:11 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 15:51:11 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 15:51:11 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 16:38:34 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 16:38:35 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 16:38:35 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 16:38:35 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 16:38:35 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 16:56:05 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 16:56:05 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 16:56:06 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 16:56:06 - __main__ - INFO: 读 eye_hand_data/data2025082009/21.jpg -2025-08-20 16:56:06 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_21.jpg -2025-08-20 16:56:06 - __main__ - INFO: 旋转矩阵是: - [[-0.86090303 0.23595808 0.45074355] - [-0.47502031 -0.05548769 -0.87822367] - [-0.18221325 -0.97017777 0.1598544 ]] -2025-08-20 16:56:06 - __main__ - INFO: 平移向量是: - [[-0.13881725] - [-0.20545188] - [ 0.08188335]] -2025-08-20 16:56:06 - __main__ - INFO: 四元数是: - [ 0.09318028 -0.6413971 0.72045908 -0.24671019] -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 17:01:32 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 17:01:32 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 17:01:33 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 17:01:33 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 17:01:33 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-20 17:01:33 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-20 17:01:33 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-20 17:02:57 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 17:02:57 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 17:02:57 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 17:02:57 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 17:02:57 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 17:02:58 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 17:02:58 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 17:02:58 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-20 17:02:58 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-20 17:02:58 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-20 17:03:12 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 17:03:13 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 17:03:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 17:03:14 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-20 17:03:14 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-20 17:03:14 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-20 17:03:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 17:03:23 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 17:03:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 17:03:23 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 17:03:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 17:03:23 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 17:03:23 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 17:03:24 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 17:03:24 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 17:03:24 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-20 17:03:24 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-20 17:03:24 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-20 17:03:36 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-20 17:03:36 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-20 17:03:36 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-20 17:03:36 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-20 17:03:36 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-20 17:03:36 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-20 17:03:37 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-20 17:03:37 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-20 17:03:37 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-20 17:03:37 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-20 17:03:37 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-20 17:29:39 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082010 -2025-08-20 17:29:39 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-20 17:30:05 - __main__ - INFO: robot.torqueOff -2025-08-20 17:30:58 - __main__ - INFO: 当前关节角: [-0.2127401635377416, 1.5663756903288177, 0.12808739578845102, -0.2158128713411982, -0.1482474725044877, 0.08527642206713766, 0.3227548735461464] -2025-08-20 17:30:58 - __main__ - INFO: 获取位姿成功: -[[ 0.98643686 0.16322471 0.01732075 -0.08115292] - [ 0.03501732 -0.10617399 -0.99373078 -0.22501375] - [-0.1603624 0.9808592 -0.11044963 -0.44324419] - [ 0. 0. 0. 1. ]] -2025-08-20 17:30:58 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-20 17:30:58 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082010/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082010/1.jpg -2025-08-20 17:31:06 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-20 17:31:06 - __main__ - INFO: 相机已关闭,窗口已销毁 diff --git a/python/hand_eye_calibration/libs/web-log.2025-08-22.log b/python/hand_eye_calibration/libs/web-log.2025-08-22.log deleted file mode 100644 index b0dd5a49..00000000 --- a/python/hand_eye_calibration/libs/web-log.2025-08-22.log +++ /dev/null @@ -1,704 +0,0 @@ -2025-08-21 09:52:37 - __main__ - INFO: 读 eye_hand_data/data2025082010/1.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-21 09:54:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-21 09:54:46 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-21 09:54:47 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-21 09:54:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-21 09:54:47 - __main__ - INFO: 旋转矩阵是: - [[-0.8747942 0.22946188 0.42671109] - [-0.45426317 -0.08221912 -0.88706538] - [-0.16846387 -0.96983878 0.17616089]] -2025-08-21 09:54:47 - __main__ - INFO: 平移向量是: - [[-0.12651951] - [-0.21061809] - [ 0.0697177 ]] -2025-08-21 09:54:47 - __main__ - INFO: 四元数是: - [ 0.08840819 -0.63569139 0.73026951 -0.234066 ] -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/1.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_1.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/2.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_2.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/3.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_3.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/4.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_4.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/5.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_5.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/6.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_6.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/7.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_7.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/8.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_8.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/9.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_9.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/10.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_10.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/11.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_11.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/12.jpg -2025-08-21 09:55:21 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_12.jpg -2025-08-21 09:55:21 - __main__ - INFO: 读 eye_hand_data/data2025082009/13.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_13.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/14.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_14.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/15.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_15.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/16.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_16.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/17.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_17.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/18.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_18.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/19.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_19.jpg -2025-08-21 09:55:22 - __main__ - INFO: 读 eye_hand_data/data2025082009/20.jpg -2025-08-21 09:55:22 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082009/corner/corner_20.jpg -2025-08-21 09:55:22 - __main__ - INFO: 旋转矩阵是: - [[-0.87479368 0.22946254 0.4267118 ] - [-0.45426401 -0.08221905 -0.88706496] - [-0.16846434 -0.96983863 0.17616128]] -2025-08-21 09:55:22 - __main__ - INFO: 平移向量是: - [[-0.12651976] - [-0.21061824] - [ 0.0697178 ]] -2025-08-21 09:55:22 - __main__ - INFO: 四元数是: - [ 0.08840828 -0.63569123 0.73026947 -0.23406652] -2025-08-21 11:27:09 - libs.auxiliary - INFO: create folder eye_hand_data/data20250821 -2025-08-21 11:27:09 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 11:27:20 - __main__ - INFO: robot.torqueOff -2025-08-21 11:28:46 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:28:51 - __main__ - INFO: 当前关节角: [0.8253898778736996, 0.2562934472690343, -0.0472638845356522, 0.982365663091435, -0.811866925952772, 1.0474525818308873, 0.016616543126199347] -2025-08-21 11:28:51 - __main__ - INFO: 获取位姿成功: -[[-0.25318109 -0.89031678 0.37846449 0.20513955] - [ 0.6294954 -0.44867523 -0.63437061 -0.47519781] - [ 0.73459844 0.07763101 0.6740464 -0.14564497] - [ 0. 0. 0. 1. ]] -2025-08-21 11:28:51 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:28:51 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/1.jpg -2025-08-21 11:28:53 - __main__ - INFO: robot.torqueOff -2025-08-21 11:29:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:29:04 - __main__ - INFO: 当前关节角: [0.8917611258247912, 0.3193556252779419, 0.0663351766206834, 0.6812782681741733, -1.1216997200029486, 1.03807878215244, 0.016623187844958753] -2025-08-21 11:29:04 - __main__ - INFO: 获取位姿成功: -[[-0.25224294 -0.90609294 0.33966025 0.22289984] - [ 0.8456558 -0.37703157 -0.37777436 -0.51750052] - [ 0.47036131 0.19194474 0.8613463 -0.11653364] - [ 0. 0. 0. 1. ]] -2025-08-21 11:29:04 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:29:04 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/2.jpg -2025-08-21 11:29:05 - __main__ - INFO: robot.torqueOff -2025-08-21 11:29:14 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:29:18 - __main__ - INFO: 当前关节角: [1.1896438678089452, 0.30651423165262204, 0.10917083072596027, 0.6814301474601026, -1.6521096487448172, 1.0335860030255448, 0.016608949161902885] -2025-08-21 11:29:18 - __main__ - INFO: 获取位姿成功: -[[-0.42170444 -0.84445498 0.33024408 0.2558707 ] - [ 0.9003429 -0.43313682 0.04213264 -0.51967065] - [ 0.10746175 0.31510043 0.94295477 -0.04397596] - [ 0. 0. 0. 1. ]] -2025-08-21 11:29:18 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:29:18 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/3.jpg -2025-08-21 11:29:19 - __main__ - INFO: robot.torqueOff -2025-08-21 11:29:28 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:29:34 - __main__ - INFO: 当前关节角: [1.4559585002127002, 0.30681324399679527, 0.17970546960258804, 0.6812127702321163, -2.1080019043365628, 1.0236910675472528, 0.016632680300329335] -2025-08-21 11:29:34 - __main__ - INFO: 获取位姿成功: -[[-0.44997072 -0.85803562 0.24759084 0.26886029] - [ 0.85847564 -0.33920789 0.38465255 -0.52136803] - [-0.24606082 0.38563309 0.8892363 0.03026231] - [ 0. 0. 0. 1. ]] -2025-08-21 11:29:34 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:29:34 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/4.jpg -2025-08-21 11:29:36 - __main__ - INFO: robot.torqueOff -2025-08-21 11:29:46 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:29:51 - __main__ - INFO: 当前关节角: [1.6850703015280803, 0.3357206183368209, 0.14558294028196603, 0.7301084078459711, -2.380654649191254, 1.0414419590902364, 0.016624137090495813] -2025-08-21 11:29:51 - __main__ - INFO: 获取位姿成功: -[[-0.48372144 -0.85725737 0.17641818 0.27941969] - [ 0.74091476 -0.29378779 0.60393216 -0.50585554] - [-0.46589579 0.42284577 0.77726609 0.08600871] - [ 0. 0. 0. 1. ]] -2025-08-21 11:29:51 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:29:51 - __main__ - INFO: ===采集第5次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/5.jpg -2025-08-21 11:29:53 - __main__ - INFO: robot.torqueOff -2025-08-21 11:30:03 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:30:07 - __main__ - INFO: 当前关节角: [1.9511694551949232, 0.7207327096764498, -0.06620038375442117, 0.8133790740933053, -1.3808665335126573, 0.21355366696300027, 1.1411364716197472] -2025-08-21 11:30:07 - __main__ - INFO: 获取位姿成功: -[[-0.21216612 -0.68156647 0.70032327 0.38204138] - [ 0.97416126 -0.20429083 0.09630729 -0.3389997 ] - [ 0.07742981 0.70266095 0.70729924 0.18673545] - [ 0. 0. 0. 1. ]] -2025-08-21 11:30:07 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:30:07 - __main__ - INFO: ===采集第6次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/6.jpg -2025-08-21 11:30:08 - __main__ - INFO: robot.torqueOff -2025-08-21 11:30:17 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:30:21 - __main__ - INFO: 当前关节角: [1.8940381633015537, 0.4051379952163314, -0.12349589512570175, 0.6297399309851491, -1.2283436591092607, 0.9395015316200465, 1.0908577832583988] -2025-08-21 11:30:21 - __main__ - INFO: 获取位姿成功: -[[-0.4310179 -0.70629928 0.5615736 0.28826997] - [ 0.89989504 -0.38227375 0.20989447 -0.50135244] - [ 0.06642653 0.59582557 0.80036205 0.12584165] - [ 0. 0. 0. 1. ]] -2025-08-21 11:30:21 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:30:21 - __main__ - INFO: ===采集第7次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/7.jpg -2025-08-21 11:30:22 - __main__ - INFO: robot.torqueOff -2025-08-21 11:30:35 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:30:42 - __main__ - INFO: 当前关节角: [1.8361265915767224, 1.1135570917860655, -0.08976350572081057, 0.5308864500014717, -1.5194516356954322, 0.07328175546087345, 0.9682465849732351] -2025-08-21 11:30:42 - __main__ - INFO: 获取位姿成功: -[[-0.13468827 -0.72882711 0.67131968 0.45481058] - [ 0.98906271 -0.05778144 0.13570654 -0.23383011] - [-0.06011679 0.68225534 0.7286382 0.15317249] - [ 0. 0. 0. 1. ]] -2025-08-21 11:30:42 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:30:42 - __main__ - INFO: ===采集第8次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/8.jpg -2025-08-21 11:30:43 - __main__ - INFO: robot.torqueOff -2025-08-21 11:31:04 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:31:08 - __main__ - INFO: 当前关节角: [1.773997521930743, 0.605477215057948, 0.028329283807957347, 1.2173817716473154, -1.7268484961050745, 0.15453242720534835, 0.8873870023900281] -2025-08-21 11:31:08 - __main__ - INFO: 获取位姿成功: -[[-0.35110132 -0.76965787 0.53324913 0.36358769] - [ 0.90927708 -0.14433419 0.39036245 -0.28723159] - [-0.22347945 0.62192798 0.75050818 0.11913745] - [ 0. 0. 0. 1. ]] -2025-08-21 11:31:08 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:31:08 - __main__ - INFO: ===采集第9次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/9.jpg -2025-08-21 11:31:09 - __main__ - INFO: robot.torqueOff -2025-08-21 11:31:26 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:31:30 - __main__ - INFO: 当前关节角: [1.4005130683931457, 1.4388303137420266, 0.15982067409229817, 0.8202088957324373, -1.891621384164204, -1.0446542059876405, 0.5873542192644378] -2025-08-21 11:31:30 - __main__ - INFO: 获取位姿成功: -[[ 0.36091887 -0.80430791 0.47204487 0.44921615] - [ 0.93025175 0.34636313 -0.12109612 -0.02012862] - [-0.06610037 0.48282644 0.87321782 -0.00595984] - [ 0. 0. 0. 1. ]] -2025-08-21 11:31:30 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:31:30 - __main__ - INFO: ===采集第10次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/10.jpg -2025-08-21 11:31:32 - __main__ - INFO: robot.torqueOff -2025-08-21 11:31:51 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:31:56 - __main__ - INFO: robot.torqueOff -2025-08-21 11:32:05 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:32:09 - __main__ - INFO: 当前关节角: [1.4349839708258678, 0.8371567255510698, -0.01699624134102253, 1.6177536050220789, -2.016514568720455, -0.8374870629979659, 0.5931132919377683] -2025-08-21 11:32:09 - __main__ - INFO: 获取位姿成功: -[[-0.0401021 -0.92276134 0.3832797 0.33858263] - [ 0.95373667 0.07903515 0.29006864 -0.11724388] - [-0.2979567 0.37718027 0.87690185 -0.01763812] - [ 0. 0. 0. 1. ]] -2025-08-21 11:32:09 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:32:09 - __main__ - INFO: ===采集第11次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/11.jpg -2025-08-21 11:32:12 - __main__ - INFO: robot.torqueOff -2025-08-21 11:32:48 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:32:52 - __main__ - INFO: 当前关节角: [0.7093417632317545, 0.9039997485340793, 0.3698402999208317, 1.4349972602633867, -1.868800572207794, -0.677916040481914, -0.3356152520822075] -2025-08-21 11:32:52 - __main__ - INFO: 获取位姿成功: -[[ 6.72744280e-03 -9.95813278e-01 9.11628002e-02 3.05739589e-01] - [ 9.97824272e-01 7.05770400e-04 -6.59259053e-02 -1.35775630e-01] - [ 6.55855519e-02 9.14079675e-02 9.93651407e-01 -1.75063848e-01] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00]] -2025-08-21 11:32:52 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:32:52 - __main__ - INFO: ===采集第12次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/12.jpg -2025-08-21 11:32:53 - __main__ - INFO: robot.torqueOff -2025-08-21 11:34:07 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:34:12 - __main__ - INFO: 当前关节角: [0.5287221701769795, 0.9609924505790383, 0.5908911081355157, 1.1136415746388637, -2.4692230547809086, -0.6455401229494787, -0.3356162013277445] -2025-08-21 11:34:12 - __main__ - INFO: 获取位姿成功: -[[ 0.12520332 -0.99186645 -0.02291465 0.31366201] - [ 0.90598349 0.10488766 0.41011278 -0.19783819] - [-0.40437364 -0.07210778 0.91174691 -0.25384818] - [ 0. 0. 0. 1. ]] -2025-08-21 11:34:12 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:34:12 - __main__ - INFO: ===采集第13次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/13.jpg -2025-08-21 11:34:13 - __main__ - INFO: robot.torqueOff -2025-08-21 11:34:31 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 11:34:37 - __main__ - INFO: 当前关节角: [0.39919666739988574, 1.3179505393164566, 0.9448201543641821, 1.2761780402126846, -2.03749479358051, -0.385342428786525, -0.3356180998188186] -2025-08-21 11:34:37 - __main__ - INFO: 获取位姿成功: -[[ 0.03301101 -0.99908595 0.02715761 0.313764 ] - [ 0.83829597 0.01288215 -0.54506323 -0.0913168 ] - [ 0.54421516 0.0407592 0.83795498 -0.18631875] - [ 0. 0. 0. 1. ]] -2025-08-21 11:34:37 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 11:34:37 - __main__ - INFO: ===采集第14次数据! pose 已保存到 eye_hand_data/data20250821/RobotToolPose.csv, 图片保存到 eye_hand_data/data20250821/14.jpg -2025-08-21 11:34:39 - __main__ - INFO: robot.torqueOff -2025-08-21 11:35:06 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 11:35:07 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/1.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_1.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/2.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_2.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/3.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_3.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/4.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_4.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/5.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_5.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/6.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_6.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/7.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_7.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/8.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_8.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/9.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_9.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/10.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_10.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/11.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_11.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/12.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_12.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/13.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_13.jpg -2025-08-21 11:35:46 - __main__ - INFO: 读 eye_hand_data/data20250821/14.jpg -2025-08-21 11:35:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_14.jpg -2025-08-21 11:35:46 - __main__ - INFO: 旋转矩阵是: - [[-0.99732744 0.02734315 0.0677519 ] - [-0.06713675 0.0228221 -0.99748274] - [-0.02882056 -0.99936555 -0.02092538]] -2025-08-21 11:35:46 - __main__ - INFO: 平移向量是: - [[-0.00078482] - [-0.17419722] - [ 0.06796275]] -2025-08-21 11:35:46 - __main__ - INFO: 四元数是: - [-0.01392688 0.71433097 -0.69885263 0.03379822] -2025-08-21 11:38:53 - __main__ - INFO: 读 eye_hand_data/data20250821/1.jpg -2025-08-21 11:38:53 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_1.jpg -2025-08-21 11:38:53 - __main__ - INFO: 读 eye_hand_data/data20250821/2.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_2.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/3.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_3.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/4.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_4.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/5.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_5.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/6.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_6.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/7.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_7.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/8.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_8.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/9.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_9.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/10.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_10.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/11.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_11.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/12.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_12.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/13.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_13.jpg -2025-08-21 11:38:54 - __main__ - INFO: 读 eye_hand_data/data20250821/14.jpg -2025-08-21 11:38:54 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data20250821/corner/corner_14.jpg -2025-08-21 11:38:54 - __main__ - INFO: 旋转矩阵是: - [[-0.99732744 0.02734315 0.0677519 ] - [-0.06713675 0.0228221 -0.99748274] - [-0.02882056 -0.99936555 -0.02092538]] -2025-08-21 11:38:54 - __main__ - INFO: 平移向量是: - [[-0.00078482] - [-0.17419722] - [ 0.06796275]] -2025-08-21 11:38:54 - __main__ - INFO: 四元数是: - [-0.01392688 0.71433097 -0.69885263 0.03379822] -2025-08-21 16:14:42 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082101 -2025-08-21 16:14:42 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 16:15:03 - __main__ - INFO: robot.torqueOff -2025-08-21 16:15:13 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:15:27 - __main__ - INFO: robot.torqueOff -2025-08-21 16:16:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:16:07 - __main__ - INFO: 当前关节角: [0.1881774860208302, 1.5359324367098321, 2.101302129336008, 1.237947176207676, -3.239618392465156, 0.660369236729398, -0.22447188913024077] -2025-08-21 16:16:07 - __main__ - INFO: 获取位姿成功: -[[-0.13936557 -0.98748272 -0.0738588 0.25639562] - [ 0.98789482 -0.13351676 -0.07897536 -0.27191259] - [ 0.06812542 -0.08397117 0.9941367 -0.23921664] - [ 0. 0. 0. 1. ]] -2025-08-21 16:16:07 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:16:07 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/1.jpg -2025-08-21 16:16:11 - __main__ - INFO: robot.torqueOff -2025-08-21 16:16:20 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:16:25 - __main__ - INFO: 当前关节角: [0.1847488111409769, 1.3553365747934838, 2.1088087630430623, 1.2244802297734347, -3.265897305913068, 0.6804733079587482, -0.22435892891133088] -2025-08-21 16:16:25 - __main__ - INFO: 获取位姿成功: -[[-0.12214152 -0.99148995 -0.04504583 0.24935823] - [ 0.98590508 -0.12643169 0.10957282 -0.3301866 ] - [-0.11433557 -0.03102752 0.99295754 -0.22048319] - [ 0. 0. 0. 1. ]] -2025-08-21 16:16:25 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:16:25 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/2.jpg -2025-08-21 16:16:28 - __main__ - INFO: robot.torqueOff -2025-08-21 16:16:36 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:16:40 - __main__ - INFO: 当前关节角: [0.18216591403464222, 1.3093807506078976, 2.108801169078766, 1.237752580872579, -3.386807456195824, 0.674951546669682, -0.22420894811647574] -2025-08-21 16:16:40 - __main__ - INFO: 获取位姿成功: -[[-0.12765968 -0.99174931 0.01167535 0.24725332] - [ 0.95778442 -0.12021331 0.26114702 -0.34440277] - [-0.25758884 0.04452042 0.96522843 -0.21331776] - [ 0. 0. 0. 1. ]] -2025-08-21 16:16:40 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:16:40 - __main__ - INFO: ===采集第3次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/3.jpg -2025-08-21 16:16:43 - __main__ - INFO: robot.torqueOff -2025-08-21 16:16:52 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:16:57 - __main__ - INFO: 当前关节角: [0.15805412814783334, 1.218028207858052, 2.1077446587960202, 1.3528049369461503, -3.398763203735069, 0.6851996014877597, -0.2241823692414381] -2025-08-21 16:16:57 - __main__ - INFO: 获取位姿成功: -[[-0.12061637 -0.99148511 -0.04908122 0.24079104] - [ 0.90170295 -0.13010493 0.41231601 -0.36562399] - [-0.41519089 0.00547538 0.90971784 -0.17673377] - [ 0. 0. 0. 1. ]] -2025-08-21 16:16:57 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:16:57 - __main__ - INFO: ===采集第4次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/4.jpg -2025-08-21 16:16:59 - __main__ - INFO: robot.torqueOff -2025-08-21 16:17:08 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:17:14 - __main__ - INFO: 当前关节角: [0.15782630921893942, 1.148865228782473, 2.0802051472748952, 1.4294517678358942, -3.4739330085691504, 0.6850638593759604, -0.22417762301375282] -2025-08-21 16:17:14 - __main__ - INFO: 获取位姿成功: -[[-0.13323657 -0.98863605 -0.06961879 0.24168424] - [ 0.81161017 -0.14915447 0.56483792 -0.37307124] - [-0.56880309 0.01875375 0.8222599 -0.14946229] - [ 0. 0. 0. 1. ]] -2025-08-21 16:17:14 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:17:14 - __main__ - INFO: ===采集第5次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/5.jpg -2025-08-21 16:17:21 - __main__ - INFO: robot.torqueOff -2025-08-21 16:17:38 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:17:43 - __main__ - INFO: 当前关节角: [0.3590416826912605, 1.1394164387065981, 2.0769226562077487, 1.5773176436344847, -2.5660726784358565, 0.5330820549286868, 0.8458689010901876] -2025-08-21 16:17:43 - __main__ - INFO: 获取位姿成功: -[[-0.1100018 -0.97171944 0.20895198 0.26213488] - [ 0.9937792 -0.11120581 0.00601407 -0.35469134] - [ 0.01739269 0.20831369 0.97790741 -0.04493756] - [ 0. 0. 0. 1. ]] -2025-08-21 16:17:43 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:17:43 - __main__ - INFO: ===采集第6次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/6.jpg -2025-08-21 16:17:46 - __main__ - INFO: robot.torqueOff -2025-08-21 16:17:53 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:17:59 - __main__ - INFO: 当前关节角: [0.3520818144135517, 1.1556029736045101, 2.017053740185504, 1.6291274650471073, -2.566324228503177, 0.5650403044248166, 0.8458594086348171] -2025-08-21 16:17:59 - __main__ - INFO: 获取位姿成功: -[[-0.20049553 -0.96061353 0.19241411 0.26384736] - [ 0.97904311 -0.18929837 0.07510466 -0.33478381] - [-0.03572288 0.20343986 0.97843554 -0.04338287] - [ 0. 0. 0. 1. ]] -2025-08-21 16:17:59 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:17:59 - __main__ - INFO: ===采集第7次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/7.jpg -2025-08-21 16:18:01 - __main__ - INFO: robot.torqueOff -2025-08-21 16:18:09 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:18:13 - __main__ - INFO: 当前关节角: [0.3172653866053403, 1.313845052368681, 1.8904177408232146, 1.7188083864061938, -2.6905567381656357, 0.28883548277045484, 0.8458527639160577] -2025-08-21 16:18:13 - __main__ - INFO: 获取位姿成功: -[[-0.09067794 -0.96156996 0.25915385 0.27763283] - [ 0.99082305 -0.1133011 -0.0737058 -0.27031831] - [ 0.1002357 0.25009212 0.96301959 -0.05935151] - [ 0. 0. 0. 1. ]] -2025-08-21 16:18:13 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:18:13 - __main__ - INFO: ===采集第8次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/8.jpg -2025-08-21 16:18:16 - __main__ - INFO: robot.torqueOff -2025-08-21 16:18:25 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:18:30 - __main__ - INFO: 当前关节角: [0.3113658255925252, 1.3320734144168047, 1.7972094230484208, 1.807990953858325, -2.9523187889736606, 0.29634021798643495, 0.8458480176883724] -2025-08-21 16:18:30 - __main__ - INFO: 获取位姿成功: -[[-0.06182316 -0.96333913 0.26106631 0.27572117] - [ 0.985666 -0.01779069 0.16776779 -0.23950089] - [-0.15697273 0.26769612 0.9506305 -0.05533822] - [ 0. 0. 0. 1. ]] -2025-08-21 16:18:30 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:18:30 - __main__ - INFO: ===采集第9次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/9.jpg -2025-08-21 16:18:33 - __main__ - INFO: robot.torqueOff -2025-08-21 16:18:44 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:18:49 - __main__ - INFO: 当前关节角: [0.3174068241903619, 1.4675260063272884, 1.5487007384287987, 1.7904982571014212, -3.2589716104746933, 0.07981446324690623, 0.8458337790053165] -2025-08-21 16:18:49 - __main__ - INFO: 获取位姿成功: -[[ 0.00204587 -0.95045805 0.31084613 0.291817 ] - [ 0.96975598 0.0777536 0.2313606 -0.15674434] - [-0.24406795 0.30097156 0.92187144 -0.07498582] - [ 0. 0. 0. 1. ]] -2025-08-21 16:18:49 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:18:49 - __main__ - INFO: ===采集第10次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/10.jpg -2025-08-21 16:18:52 - __main__ - INFO: robot.torqueOff -2025-08-21 16:19:08 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:19:14 - __main__ - INFO: robot.torqueOff -2025-08-21 16:19:25 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:19:30 - __main__ - INFO: 当前关节角: [0.27753946087946524, 1.6105355419582903, 1.2276915274253017, 1.6875801067280616, -3.5108406242955006, -0.6567573574608925, 0.8458072001302789] -2025-08-21 16:19:30 - __main__ - INFO: 获取位姿成功: -[[ 0.38872691 -0.8780319 0.27919772 0.29523427] - [ 0.91848265 0.39319638 -0.0422638 -0.05153552] - [-0.07267057 0.27286734 0.95930308 -0.10555432] - [ 0. 0. 0. 1. ]] -2025-08-21 16:19:30 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:19:30 - __main__ - INFO: ===采集第11次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/11.jpg -2025-08-21 16:19:33 - __main__ - INFO: robot.torqueOff -2025-08-21 16:20:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:20:06 - __main__ - INFO: 当前关节角: [0.19953615811726558, 1.5134979676870048, 1.3755934745543004, 1.2340486247869789, -3.235004109909517, -0.39607934505618747, -0.18381760126912305] -2025-08-21 16:20:06 - __main__ - INFO: 获取位姿成功: -[[ 0.2004248 -0.97752505 -0.065381 0.29826073] - [ 0.95269085 0.17889858 0.24571414 -0.11593768] - [-0.22849516 -0.11153509 0.96713489 -0.24686201] - [ 0. 0. 0. 1. ]] -2025-08-21 16:20:06 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:20:06 - __main__ - INFO: ===采集第12次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/12.jpg -2025-08-21 16:20:08 - __main__ - INFO: robot.torqueOff -2025-08-21 16:20:19 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:20:24 - __main__ - INFO: 当前关节角: [0.14909894575122867, 1.5289374463472523, 1.327669864370393, 1.130913097185633, -3.1925177781618777, -0.44474526525007424, -0.2899508462764979] -2025-08-21 16:20:24 - __main__ - INFO: 获取位姿成功: -[[ 0.1795737 -0.98355917 -0.01909571 0.27480921] - [ 0.95378635 0.16931837 0.24823956 -0.10309542] - [-0.24092504 -0.06279052 0.96851044 -0.28676362] - [ 0. 0. 0. 1. ]] -2025-08-21 16:20:24 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:20:24 - __main__ - INFO: ===采集第13次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/13.jpg -2025-08-21 16:20:26 - __main__ - INFO: robot.torqueOff -2025-08-21 16:20:38 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:20:43 - __main__ - INFO: 当前关节角: [0.16214537641255308, 1.3656235486785808, 1.5120835918367883, 1.2035123451053618, -2.9271913103622, -0.014777854520918107, -0.2900476693212778] -2025-08-21 16:20:43 - __main__ - INFO: 获取位姿成功: -[[ 0.03397924 -0.99615678 -0.08072841 0.28406157] - [ 0.99940914 0.03344943 0.00790666 -0.19681757] - [-0.00517596 -0.08094937 0.99670478 -0.25137906] - [ 0. 0. 0. 1. ]] -2025-08-21 16:20:43 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:20:43 - __main__ - INFO: ===采集第14次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/14.jpg -2025-08-21 16:20:45 - __main__ - INFO: robot.torqueOff -2025-08-21 16:21:17 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:21:26 - __main__ - INFO: 当前关节角: [0.23122007565318572, 1.628535135831983, 1.828089329614453, 1.4320631423083405, -3.0376977295588006, 0.19928270955887112, 0.14386290736881704] -2025-08-21 16:21:26 - __main__ - INFO: 获取位姿成功: -[[ 0.02777164 -0.99933259 0.02373016 0.29887982] - [ 0.98010716 0.02255505 -0.19718324 -0.18783112] - [ 0.1965164 0.0287342 0.98007941 -0.17737878] - [ 0. 0. 0. 1. ]] -2025-08-21 16:21:26 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:21:26 - __main__ - INFO: ===采集第15次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/15.jpg -2025-08-21 16:21:29 - __main__ - INFO: robot.torqueOff -2025-08-21 16:21:42 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:21:47 - __main__ - INFO: 当前关节角: [0.22977437470024648, 1.339187060471517, 2.1365172402697836, 1.3177511977536744, -3.033028390762013, 0.8488428873577902, 0.1439046741724476] -2025-08-21 16:21:47 - __main__ - INFO: 获取位姿成功: -[[-0.24782493 -0.96680534 0.06221126 0.25321104] - [ 0.96857382 -0.24585225 0.03770167 -0.33940743] - [-0.02115539 0.06959961 0.99735066 -0.17940936] - [ 0. 0. 0. 1. ]] -2025-08-21 16:21:47 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:21:47 - __main__ - INFO: ===采集第16次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/16.jpg -2025-08-21 16:21:50 - __main__ - INFO: robot.torqueOff -2025-08-21 16:22:00 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:22:05 - __main__ - INFO: 当前关节角: [0.2123139522916026, 1.6156225487913838, 1.9870955510359554, 1.1415721753212567, -3.261262139955614, 0.40399890057186194, -0.2904045856432116] -2025-08-21 16:22:05 - __main__ - INFO: 获取位姿成功: -[[-0.02238853 -0.99787522 -0.06118662 0.27706052] - [ 0.9941035 -0.01572528 -0.10728906 -0.21679508] - [ 0.10609892 -0.06322787 0.99234331 -0.26052986] - [ 0. 0. 0. 1. ]] -2025-08-21 16:22:05 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:22:05 - __main__ - INFO: ===采集第17次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/17.jpg -2025-08-21 16:22:08 - __main__ - INFO: robot.torqueOff -2025-08-21 16:22:20 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:22:25 - __main__ - INFO: 当前关节角: [0.7920960399069291, 1.588399136034099, 1.9284805883681642, 1.3829188023637766, -3.1986537013134204, 0.2975713894479991, 1.133828230229938] -2025-08-21 16:22:25 - __main__ - INFO: 获取位姿成功: -[[ 0.02514396 -0.85857888 0.51206454 0.37379129] - [ 0.99831944 -0.00518728 -0.05771811 -0.22146041] - [ 0.05221177 0.51265524 0.85700556 -0.00260762] - [ 0. 0. 0. 1. ]] -2025-08-21 16:22:25 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:22:25 - __main__ - INFO: ===采集第18次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/18.jpg -2025-08-21 16:22:28 - __main__ - INFO: robot.torqueOff -2025-08-21 16:22:38 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 16:22:42 - __main__ - INFO: 当前关节角: [0.5278507627739604, 1.75270689378007, 1.4620754384535017, 1.2688669510862645, -3.519189238793925, -0.41788541353348263, 0.5962609901386524] -2025-08-21 16:22:42 - __main__ - INFO: 获取位姿成功: -[[ 0.30642283 -0.90783743 0.28624507 0.37152839] - [ 0.94130348 0.33372329 0.05075938 -0.05876817] - [-0.14160791 0.25388965 0.95681098 -0.11450045] - [ 0. 0. 0. 1. ]] -2025-08-21 16:22:42 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 16:22:42 - __main__ - INFO: ===采集第19次数据! pose 已保存到 eye_hand_data/data2025082101/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082101/19.jpg -2025-08-21 16:22:45 - __main__ - INFO: robot.torqueOff -2025-08-21 16:22:51 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 16:22:52 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-08-21 16:23:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-08-21 16:23:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-08-21 16:23:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/19.jpg -2025-08-21 16:23:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_19.jpg -2025-08-21 16:23:13 - __main__ - INFO: 旋转矩阵是: - [[-0.99574619 0.06505242 0.06525112] - [-0.06118047 0.06271804 -0.9961543 ] - [-0.06889468 -0.99590895 -0.05847131]] -2025-08-21 16:23:13 - __main__ - INFO: 平移向量是: - [[-0.00932961] - [-0.17733044] - [ 0.07299168]] -2025-08-21 16:23:13 - __main__ - INFO: 四元数是: - [ 0.0013306 0.72748463 -0.68457228 0.04609919] -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-08-21 16:25:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-08-21 16:25:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-08-21 16:25:47 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-08-21 16:25:47 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-08-21 16:25:47 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-08-21 16:25:47 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-08-21 16:25:47 - __main__ - INFO: 读 eye_hand_data/data2025082101/19.jpg -2025-08-21 16:25:47 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_19.jpg -2025-08-21 16:25:47 - __main__ - INFO: 旋转矩阵是: - [[-0.99574619 0.06505242 0.06525112] - [-0.06118047 0.06271804 -0.9961543 ] - [-0.06889468 -0.99590895 -0.05847131]] -2025-08-21 16:25:47 - __main__ - INFO: 平移向量是: - [[-0.00932961] - [-0.17733044] - [ 0.07299168]] -2025-08-21 16:25:47 - __main__ - INFO: 四元数是: - [ 0.0013306 0.72748463 -0.68457228 0.04609919] -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-08-21 16:26:08 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-08-21 16:26:08 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-08-21 16:26:09 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-08-21 16:26:09 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-08-21 16:26:09 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-08-21 16:26:09 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-08-21 16:26:09 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-08-21 16:26:09 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-08-21 16:26:09 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-08-21 16:26:09 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-08-21 16:26:09 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-08-21 16:26:09 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] -2025-08-21 17:18:15 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082102 -2025-08-21 17:18:15 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 17:18:34 - __main__ - INFO: 当前关节角: [0.0020332839403781207, 1.3408007778845155, 1.0441700907637408e-05, 0.3222679105856357, 2.752812057468044e-05, 0.001749459524797795, -0.09380919019975154] -2025-08-21 17:18:34 - __main__ - INFO: 获取位姿成功: -[[ 9.99992854e-01 -3.77482620e-03 -2.04576300e-04 3.09996779e-02] - [-1.98775400e-04 1.53703370e-03 -9.99998799e-01 -2.05056032e-01] - [ 3.77513610e-03 9.99991694e-01 1.53627240e-03 -4.49243316e-01] - [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00]] -2025-08-21 17:18:34 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 17:18:34 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082102/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082102/1.jpg -2025-08-21 17:18:36 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 17:18:36 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 17:19:10 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082103 -2025-08-21 17:19:10 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 17:19:15 - __main__ - INFO: robot.torqueOff -2025-08-21 17:19:46 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-08-21 17:19:50 - __main__ - INFO: 当前关节角: [0.8979217293602972, 1.0614919233239744, 0.02469082566441424, 0.3463407774054252, -1.1223005924279064, 0.6689039033530859, -0.09368958526208224] -2025-08-21 17:19:50 - __main__ - INFO: 获取位姿成功: -[[-0.17316325 -0.89563008 0.40970873 0.35893735] - [ 0.79070696 -0.37443718 -0.48433387 -0.30959237] - [ 0.58719417 0.24009071 0.7730197 -0.22790869] - [ 0. 0. 0. 1. ]] -2025-08-21 17:19:50 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-08-21 17:19:50 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025082103/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025082103/1.jpg -2025-08-21 17:19:53 - __main__ - INFO: robot.torqueOff -2025-08-21 17:21:50 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 17:21:51 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 17:21:57 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082104 -2025-08-21 17:21:57 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 17:22:07 - __main__ - INFO: robot.torqueOff -2025-08-21 17:22:16 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 18:00:33 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082105 -2025-08-21 18:00:33 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 18:00:45 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 18:00:45 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-08-21 18:01:14 - libs.auxiliary - INFO: create folder eye_hand_data/data2025082106 -2025-08-21 18:01:14 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-08-21 18:01:32 - __main__ - INFO: 检测到 'q',退出程序 -2025-08-21 18:01:32 - __main__ - INFO: 相机已关闭,窗口已销毁 diff --git a/python/hand_eye_calibration/libs/web-log.2025-08-28.log b/python/hand_eye_calibration/libs/web-log.2025-08-28.log deleted file mode 100644 index 30302d29..00000000 --- a/python/hand_eye_calibration/libs/web-log.2025-08-28.log +++ /dev/null @@ -1,46 +0,0 @@ -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-08-23 16:08:45 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-08-23 16:08:45 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-08-23 16:08:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-08-23 16:08:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-08-23 16:08:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-08-23 16:08:46 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-08-23 16:08:46 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-08-23 16:08:46 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-08-23 16:08:46 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-08-23 16:08:46 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] diff --git a/python/hand_eye_calibration/libs/web-log.2025-09-05.log b/python/hand_eye_calibration/libs/web-log.2025-09-05.log deleted file mode 100644 index 858d0681..00000000 --- a/python/hand_eye_calibration/libs/web-log.2025-09-05.log +++ /dev/null @@ -1,167 +0,0 @@ -2025-09-05 16:02:35 - libs.auxiliary - INFO: create folder eye_hand_data/data20250905 -2025-09-05 16:04:01 - libs.auxiliary - INFO: create folder eye_hand_data/data2025090501 -2025-09-05 16:04:01 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-09-05 16:05:28 - libs.auxiliary - INFO: create folder eye_hand_data/data2025090502 -2025-09-05 16:05:28 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-09-05 16:05:42 - libs.auxiliary - INFO: create folder eye_hand_data/data2025090503 -2025-09-05 16:05:42 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-09-05 16:05:48 - __main__ - INFO: 相机已关闭,窗口已销毁 -2025-09-05 16:09:41 - libs.auxiliary - INFO: create folder eye_hand_data/data2025090504 -2025-09-05 16:09:41 - __main__ - INFO: 开始机器人数据采集程序,版本 V1.0.0 -2025-09-05 16:12:46 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-09-05 16:12:53 - __main__ - INFO: 当前关节角: [-0.020066101407867926, 1.46894512840519, 1.4589372327079881, 0.15968113499835065, 0.0808671765475035, -0.13818357132059936, -0.2431388026164853] -2025-09-05 16:12:53 - __main__ - INFO: 获取位姿成功: -[[-0.10992689 0.05250327 -0.99255201 -0.00608509] - [ 0.0426073 -0.99743702 -0.0574805 -0.22011888] - [-0.99302603 -0.04860861 0.10740812 -0.73570586] - [ 0. 0. 0. 1. ]] -2025-09-05 16:12:53 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-09-05 16:12:53 - __main__ - INFO: ===采集第1次数据! pose 已保存到 eye_hand_data/data2025090504/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025090504/1.jpg -2025-09-05 16:12:56 - __main__ - INFO: robot.torqueOff -2025-09-05 16:25:21 - __main__ - INFO: robot.torqueOn ,请勿触摸机器人 -2025-09-05 16:25:26 - __main__ - INFO: 当前关节角: [-0.019045662455530632, 0.14962957400644405, 1.3928232302974393, -0.07693350304193537, -1.3815034772680232, 0.03932344561816248, -0.20795691527650662] -2025-09-05 16:25:26 - __main__ - INFO: 获取位姿成功: -[[-0.03644065 0.99920824 0.01596754 -0.01550389] - [-0.99665653 -0.03750756 0.07258755 -0.94854757] - [ 0.07312898 -0.01326902 0.99723422 -0.00291912] - [ 0. 0. 0. 1. ]] -2025-09-05 16:25:26 - __main__ - INFO: 请按 p 失能机器人,并手动移动机器人到其他位姿 -2025-09-05 16:25:26 - __main__ - INFO: ===采集第2次数据! pose 已保存到 eye_hand_data/data2025090504/RobotToolPose.csv, 图片保存到 eye_hand_data/data2025090504/2.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-05 17:21:03 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-05 17:21:03 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-05 17:21:04 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-05 17:21:04 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-05 17:21:04 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-05 17:21:04 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-05 17:21:04 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-05 17:21:04 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-05 17:21:04 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-05 17:21:04 - __main__ - INFO: 旋转矩阵是: - [[ 0.05477568 0.03458859 0.99789942] - [-0.99767126 0.04257346 0.0532875 ] - [-0.04064089 -0.99849443 0.03684003]] -2025-09-05 17:21:04 - __main__ - INFO: 平移向量是: - [[-0.14908435] - [-0.19737896] - [-0.05964516]] -2025-09-05 17:21:04 - __main__ - INFO: 四元数是: - [-0.49380213 0.48758531 -0.48463669 0.53249159] -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-05 17:26:27 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-05 17:26:27 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-05 17:26:28 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-05 17:26:28 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-05 17:26:28 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-05 17:26:28 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-05 17:26:28 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-05 17:26:28 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-05 17:26:28 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-05 17:26:28 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-05 17:26:28 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-05 17:26:28 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-09-05 17:26:28 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-09-05 17:26:28 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/1.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_1.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/2.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_2.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/3.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_3.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/4.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_4.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/5.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_5.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/6.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_6.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/7.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_7.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/8.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_8.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/9.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_9.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/10.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_10.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/11.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_11.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/12.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_12.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/13.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_13.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/14.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_14.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/15.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_15.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/16.jpg -2025-09-05 17:45:12 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_16.jpg -2025-09-05 17:45:12 - __main__ - INFO: 读 eye_hand_data/data2025082101/17.jpg -2025-09-05 17:45:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_17.jpg -2025-09-05 17:45:13 - __main__ - INFO: 读 eye_hand_data/data2025082101/18.jpg -2025-09-05 17:45:13 - __main__ - INFO: 保存带角点的图片到: eye_hand_data/data2025082101/corner/corner_18.jpg -2025-09-05 17:45:13 - __main__ - INFO: 旋转矩阵是: - [[-0.99486349 0.07846371 0.06395369] - [-0.05884529 0.06577685 -0.9960977 ] - [-0.08236419 -0.99474462 -0.06082177]] -2025-09-05 17:45:13 - __main__ - INFO: 平移向量是: - [[-0.00797824] - [-0.17640328] - [ 0.07459845]] -2025-09-05 17:45:13 - __main__ - INFO: 四元数是: - [ 0.00673467 0.72826199 -0.68342243 0.05022845] diff --git a/python/vision_servo/__pycache__/follow_target.cpython-310.pyc b/python/vision_servo/__pycache__/follow_target.cpython-310.pyc deleted file mode 100644 index 0ce0e221..00000000 Binary files a/python/vision_servo/__pycache__/follow_target.cpython-310.pyc and /dev/null differ diff --git a/python/vision_servo/__pycache__/get_chessboard_position.cpython-310.pyc b/python/vision_servo/__pycache__/get_chessboard_position.cpython-310.pyc deleted file mode 100644 index 9dcaa672..00000000 Binary files a/python/vision_servo/__pycache__/get_chessboard_position.cpython-310.pyc and /dev/null differ diff --git a/python/vision_servo/red_point.png b/python/vision_servo/red_point.png deleted file mode 100644 index 371035f6..00000000 Binary files a/python/vision_servo/red_point.png and /dev/null differ diff --git a/python/vision_servo/robot_warpper_test.py b/python/vision_servo/robot_warpper_test.py deleted file mode 100644 index 3464b06e..00000000 --- a/python/vision_servo/robot_warpper_test.py +++ /dev/null @@ -1,66 +0,0 @@ -import sys -import os -from pathlib import Path -os.environ["GLOG_minloglevel"] = "1" # 屏蔽 INFO -# from python.vision_servo.follow_target import moveJ -import time - -# 把.so所在目录加入 Python 路径 -sys.path.append("/home/lgv/cmvr/cmvr-es/cmake-build-debug/example") - -# 导入模块 -from robot_wrapper import Robot - -REPO_ROOT = Path(__file__).resolve().parents[2] -ROBOT_CONFIG = str(REPO_ROOT / "cmvr-es/config/cmvr_es.pb.txt") - -# R_WRIST_R_S -# 初始化机器人(传入配置文件路径和机器人名称) -robot = Robot(ROBOT_CONFIG, "hc01") - -# robot.torqueOn() -# -# -# x,y,z,rx,ry,rz = robot.fk(base_link="PELVIS_S", ee_link="R_FINGER_TIP") -# # robot->move(base_link="PELVIS_S", target_link="R_FINGER_TIP") -# -# -# print(x, y, z, rx, ry, rz, sep=',') -# -# -# while True: -# for j in JOINT_POSITIONS: -# robot.moveJ('right', j) - -# time.sleep(10) -# js = robot.getJointQ('right') -# print(js) -# 控制左臂关节 -robot.calibrateZeroQ("R_WRIST_R") -robot.calibrateZeroQ("R_WRIST_Y") -time.sleep(1) -print("--------------------------") -# robot.moveJ("right", [0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0]) -# # robot.moveJ("right", [-0.344938, 0.935147, 2.27031,1.68959, -2.32841,0.460145, 0.300996]) -# robot.moveJ("right", [0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0]) -# # -# time.sleep(10) - -# robot.torqueOff("R_WRIST_R") -# time.sleep(10) -# robot.moveJ("right", [0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0]) -# time.sleep(20) -# # robot.moveJ("right", [0.00203898, 1.34062, 0.0,0.322261, 0.0,-0.000210733, -0.0942364]) -# robot.torqueOn() -# # time.sleep(500) -# robot.torqueOff("WAIST_P") -# time.sleep(30) -# // {"R_SHOULDER_P", 0.00203898}, -# // {"R_SHOULDER_R", 1.34062}, -# // {"R_SHOULDER_Y", 0.0}, -# // {"R_ELBOW_R", 0.522261}, -# // {"R_WRIST_P", 0.0}, -# // {"R_WRIST_Y", -0.000210733}, -# // {"R_WRIST_R", -0.0942364} -# 控制右臂关节 -# robot.moveJ("right", [0.1, 0.4, -0.3, 0.2, 0.0, -0.1, 0.2]) diff --git a/python/vision_servo/test.py b/python/vision_servo/test.py deleted file mode 100644 index e69de29b..00000000 diff --git a/python/vision_servo/to.py b/python/vision_servo/to.py deleted file mode 100644 index 4e50f279..00000000 --- a/python/vision_servo/to.py +++ /dev/null @@ -1,26 +0,0 @@ -import math -import numpy as np - -def rotation_matrix_to_euler_zyx(R): - if abs(R[2,0]) != 1: - theta = -math.asin(R[2,0]) - cos_theta = math.cos(theta) - phi = math.atan2(R[2,1]/cos_theta, R[2,2]/cos_theta) - psi = math.atan2(R[1,0]/cos_theta, R[0,0]/cos_theta) - else: - phi = 0 - if R[2,0] == -1: - theta = math.pi/2 - psi = phi + math.atan2(R[0,1], R[0,2]) - else: - theta = -math.pi/2 - psi = -phi + math.atan2(-R[0,1], -R[0,2]) - return phi, theta, psi # roll, pitch, yaw - - -R = np.array([[-1, 0, 0], - [0, 0, -1], - [0, -1, 0]]) - -roll, pitch, yaw = rotation_matrix_to_euler_zyx(R) -print("roll:", roll, "pitch:", pitch, "yaw:", yaw) \ No newline at end of file diff --git a/script/test.py b/script/test.py deleted file mode 100644 index f35f2cfb..00000000 --- a/script/test.py +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -text_dgceshi.py — 写死 5 组表情(已按 XML 限位约束),每 5 秒切换,循环发送到 ESP32 -依赖:pip install pyserial -用法: - python text_dgceshi.py /dev/ttyUSB0 [baudrate] - -帧格式(与你现有固件一致): -[0] 0xAA -[1] count = 指令条数(每条是5字节:addr, ch, ang, durL, durH) -[2..] 指令序列,共 count*5 字节 -[end] XOR 校验(对前面所有字节异或) -""" - -import sys -import time -import serial - -FRAME_HEADER = 0xAA - -def calc_checksum(data: bytearray) -> int: - """XOR 校验""" - cs = 0 - for b in data: - cs ^= b - return cs & 0xFF - -def pack_pose(raw_list): - """ - raw_list: [addr, ch, ang, durL, durH, addr, ch, ang, durL, durH, ...] - 返回带帧头/数量/校验的完整数据包 bytes - """ - assert len(raw_list) % 5 == 0, "原始列表长度必须是 5 的倍数" - count = len(raw_list) // 5 - pkt = bytearray([FRAME_HEADER, count & 0xFF]) - pkt.extend(int(x) & 0xFF for x in raw_list) - pkt.append(calc_checksum(pkt)) - return bytes(pkt) - -def print_packet(pkt): - print("发送数据包:", ' '.join(f"0x{b:02X}" for b in pkt)) - -def wakeup_esp32(port, baud=115200): - """通过 RTS/DTR 尝试唤醒 ESP32(可选)""" - try: - ser = serial.Serial(port, baud, timeout=1) - ser.setDTR(False) - ser.setRTS(False) - time.sleep(0.02) - ser.setDTR(True) - ser.setRTS(True) - ser.write(b"\r\n") - time.sleep(0.2) - except Exception as e: - print(f"[WARN] 唤醒失败:{e}") - finally: - try: - ser.close() - except: - pass - -def open_serial(port, baud): - try: - ser = serial.Serial(port, baud, timeout=1) - print(f"已打开串口: {port} @ {baud}bps") - return ser - except Exception as e: - print(f"打开串口失败: {e}") - sys.exit(1) - -# ======================= -# 五组“写死”的表情数据(严格遵守你的 XML 安全限位) -# 64:0~3 眉(offset 90/90/90/90,限位 45~120/…/50~120) -# 64:4~9 眼(offset 90..,限位 [90~170, 10~90, 10~90, 90~170, 10~170, 10~170]) -# 65:0~9 嘴(offset 90..,限位 [60~130, 60~130, 50~120, 50~130, 50~100, 50~130, 50~130, 90~120, 91~120, 60~89]) -# duration 全部为 0(立即执行);如需时长,可把毫秒拆成 durL/durH 小端写入 -# ======================= - -POSES_RAW = [ - # # Pose 1 — 中性位置(全部 offset) - [ - # 板 64 — 眼眉 0~3 - 64,0,90,0,0, 64,1,90,0,0, 64,2,90,0,0, 64,3,90,0,0, - # 板 64 — 眼睛 4~9(选在各自安全范围内的中值/视觉舒适值) - 64,4,160,0,0, 64,5,20,0,0, 64,6,20,0,0, 64,7,160,0,0, 64,8,150,0,0, 64,9,150,0,0, - # 板 65 — 嘴巴 0~9 - 65,0,90,0,0, 65,1,90,0,0, 65,2,85,0,0, 65,3,90,0,0, 65,4,90,0,0, - 65,5,90,0,0, 65,6,90,0,0, 65,7,90,0,0, 65,8,90,0,0, 65,9,90,0,0 - ], - - # Pose 5 — 大笑(接近上限但不越界) - [ - 64,0,115,0,0, 64,1,75,0,0, 64,2,75,0,0, 64,3,115,0,0, - 64,4,160,0,0, 64,5,20,0,0, 64,6,20,0,0, 64,7,160,0,0, 64,8,50,0,0, 64,9,40,0,0, - 65,0,50,0,0, 65,1,110,0,0, 65,2,70,0,0, 65,3,50,0,0, 65,4,100,0,0, - 65,5,110,0,0, 65,6,130,0,0, 65,7,90,0,0, 65,8,110,0,0, 65,9,70,0,0 - ], - - - [ - 64,0,115,0,0, 64,1,75,0,0, 64,2,75,0,0, 64,3,115,0,0, - 64,4,160,0,0, 64,5,20,0,0, 64,6,20,0,0, 64,7,160,0,0, 64,8,50,0,0, 64,9,130,0,0, - 65,0,50,0,0, 65,1,110,0,0, 65,2,70,0,0, 65,3,50,0,0, 65,4,90,0,0, - 65,5,110,0,0, 65,6,130,0,0, 65,7,90,0,0, 65,8,90,0,0, 65,9,90,0,0 - ], - [ - 64,0,115,0,0, 64,1,75,0,0, 64,2,75,0,0, 64,3,115,0,0, - 64,4,160,0,0, 64,5,20,0,0, 64,6,20,0,0, 64,7,160,0,0, 64,8,50,0,0, 64,9,40,0,0, - 65,0,50,0,0, 65,1,110,0,0, 65,2,70,0,0, 65,3,50,0,0, 65,4,90,0,0, - 65,5,110,0,0, 65,6,130,0,0, 65,7,90,0,0, 65,8,110,0,0, 65,9,70,0,0 - ] -] - -POSES_RAW1 = [[ - # 板 64 — 眼眉 0~3 - 64,0,90,0,0, 64,1,90,0,0, 64,2,90,0,0, 64,3,90,0,0, - # 板 64 — 眼睛 4~9(选在各自安全范围内的中值/视觉舒适值) - 64,4,90,0,0, 64,5,90,0,0, 64,6,90,0,0, 64,7,90,0,0, 64,8,150,0,0, 64,9,150,0,0, - # 板 65 — 嘴巴 0~9 - 65,0,90,0,0, 65,1,90,0,0, 65,2,85,0,0, 65,3,90,0,0, 65,4,90,0,0, - 65,5,90,0,0, 65,6,90,0,0, 65,7,90,0,0, 65,8,90,0,0, 65,9,90,0,0 - ], - - # Pose 5 — 大笑(接近上限但不越界) - [ - 64,0,115,0,0, 64,1,75,0,0, 64,2,75,0,0, 64,3,115,0,0, - 64,4,160,0,0, 64,5,20,0,0, 64,6,20,0,0, 64,7,160,0,0, 64,8,50,0,0, 64,9,40,0,0, - 65,0,50,0,0, 65,1,110,0,0, 65,2,70,0,0, 65,3,50,0,0, 65,4,100,0,0, - 65,5,110,0,0, 65,6,130,0,0, 65,7,90,0,0, 65,8,110,0,0, 65,9,70,0,0 - ], - - -] - -def main(): - if len(sys.argv) < 2: - print(f"用法: {sys.argv[0]} /dev/ttyUSB0 [baudrate]") - sys.exit(1) - port = sys.argv[1] - baud = int(sys.argv[2]) if len(sys.argv) > 2 else 115200 - - # 可选:尝试唤醒 ESP32 - wakeup_esp32(port, baud) - - ser = open_serial(port, baud) - - try: - pose_idx = 0 - hold_seconds = 5 - print(f"开始循环播放 5 组表情,每组间隔 {hold_seconds} 秒...") - while True: - pose = POSES_RAW[pose_idx] - pkt = pack_pose(pose) - print(f"\n→ 发送 Pose {pose_idx+1}/{len(POSES_RAW)}") - print_packet(pkt) - ser.write(pkt) - ser.flush() - time.sleep(hold_seconds) - pose_idx = (pose_idx + 1) % len(POSES_RAW) - except KeyboardInterrupt: - print("\n用户中断,退出") - finally: - ser.close() - print("串口已关闭") - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-312.pyc b/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-312.pyc deleted file mode 100644 index 55da4544..00000000 Binary files a/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-312.pyc and /dev/null differ diff --git a/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-313.pyc b/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-313.pyc deleted file mode 100644 index d44724f3..00000000 Binary files a/scripts/isaac_sim/__pycache__/generate_collision_primitives.cpython-313.pyc and /dev/null differ diff --git a/scripts/isaac_sim/__pycache__/generate_urdf_collision_primitives.cpython-312.pyc b/scripts/isaac_sim/__pycache__/generate_urdf_collision_primitives.cpython-312.pyc deleted file mode 100644 index d2ca3891..00000000 Binary files a/scripts/isaac_sim/__pycache__/generate_urdf_collision_primitives.cpython-312.pyc and /dev/null differ diff --git a/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-312.pyc b/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-312.pyc deleted file mode 100644 index 59bbcfd2..00000000 Binary files a/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-312.pyc and /dev/null differ diff --git a/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-313.pyc b/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-313.pyc deleted file mode 100644 index 117859e4..00000000 Binary files a/scripts/isaac_sim/__pycache__/test_collision_primitives.cpython-313.pyc and /dev/null differ diff --git a/scripts/meshcat/__pycache__/view_urdf_collisions.cpython-313.pyc b/scripts/meshcat/__pycache__/view_urdf_collisions.cpython-313.pyc deleted file mode 100644 index c64f7e7a..00000000 Binary files a/scripts/meshcat/__pycache__/view_urdf_collisions.cpython-313.pyc and /dev/null differ