This commit is contained in:
2026-07-30 09:24:47 +07:00
parent 4762a3032c
commit d8babff20b
50 changed files with 3280 additions and 119 deletions

View File

@@ -235,6 +235,105 @@ TEST(MoveBase2Config, DescribeMentionsEveryGroup)
} // namespace
// ================================================================================================
// Schema gen-1 (legacy)
//
// Cây config production hiện tại là schema gen-1. Không đọc được nó thì move_base2 không chạy được
// trên cấu hình thật, và bước 11 (chạy song song bản cũ/mới) không thực hiện được.
// ================================================================================================
TEST(MoveBase2ConfigLegacy, MapsPlannerNamesToProfiles)
{
robot::NodeHandle root;
robot::NodeHandle nh(root, "legacy_move_base");
MoveBase2Config config;
config.fromLegacyNodeHandle(nh);
EXPECT_EQ(config.position.local_planner_name, "HybridLocalPlanner");
EXPECT_EQ(config.docking.local_planner_name, "DockLocalPlanner");
// Profile không khai global planner riêng thì rơi về khoá ở root.
EXPECT_EQ(config.position.global_planner_name, "SBPLLatticePlanner");
// Profile có khai riêng thì dùng bản riêng.
EXPECT_EQ(config.docking.global_planner_name, "DockPlanner");
}
TEST(MoveBase2ConfigLegacy, RootToleranceAppliesToEveryProfile)
{
robot::NodeHandle root;
robot::NodeHandle nh(root, "legacy_move_base");
MoveBase2Config config;
config.fromLegacyNodeHandle(nh);
EXPECT_DOUBLE_EQ(config.position.default_xy_tolerance, 0.25);
EXPECT_DOUBLE_EQ(config.docking.default_yaw_tolerance, 0.30);
EXPECT_DOUBLE_EQ(config.rotate.default_xy_tolerance, 0.25);
}
TEST(MoveBase2ConfigLegacy, ZeroPatienceBecomesOneControlCycleNotDisabled)
{
// Khác biệt NGỮ NGHĨA, không phải khác biệt giá trị. Gen-1: 0 = "fail -> recovery ngay". Gen-2:
// 0 = "tắt đồng hồ". Dịch nhầm là biến một cấu hình phản ứng-ngay thành cấu hình không-bao-giờ.
robot::NodeHandle root;
robot::NodeHandle nh(root, "legacy_move_base");
MoveBase2Config config;
config.fromLegacyNodeHandle(nh);
EXPECT_GT(config.state_machine.planner_patience, 0.0);
EXPECT_NEAR(config.state_machine.planner_patience, 1.0 / 20.0, 1e-9);
}
TEST(MoveBase2ConfigLegacy, KeepsGen1DefaultForRobotBaseFrame)
{
// Gen-1 mặc định "base_footprint", gen-2 "base_link". Chế độ legacy giữ default gen-1 để không
// đổi hành vi của một hệ đang chạy chỉ vì đổi runtime.
robot::NodeHandle root;
robot::NodeHandle nh(root, "legacy_move_base");
MoveBase2Config config;
config.fromLegacyNodeHandle(nh);
EXPECT_EQ(config.robot_base_frame, "base_footprint");
}
TEST(MoveBase2ConfigLegacy, LoadedLegacyConfigPassesValidation)
{
robot::NodeHandle root;
robot::NodeHandle nh(root, "legacy_move_base");
MoveBase2Config config;
config.fromLegacyNodeHandle(nh);
config.state_machine.recovery_behavior_count = 2;
std::string error;
EXPECT_TRUE(config.validate(error)) << error;
}
TEST(MoveBase2ConfigLegacy, AutoDetectPrefersTheModernSchema)
{
// Không trộn từng khoá giữa hai schema: hai nguồn cùng có hiệu lực cho một tham số là đúng kiểu
// lỗi "sửa config mãi không ăn" mà hai cây config trùng tên của workspace đã gây ra một lần.
robot::NodeHandle root;
const MoveBase2Config config = MoveBase2Config::load(root);
EXPECT_EQ(config.robot_base_frame, "base_link") << "chọn nhầm schema gen-1 dù có namespace mới";
EXPECT_TRUE(config.sensors.laser_sor_enabled) << "khoá chỉ có ở schema mới không được đọc";
}
TEST(MoveBase2ConfigLegacy, AutoDetectFallsBackToLegacyWhenNoModernNamespace)
{
robot::NodeHandle root;
robot::NodeHandle nh(root, "legacy_move_base");
const MoveBase2Config config = MoveBase2Config::load(nh);
EXPECT_EQ(config.robot_base_frame, "base_footprint");
EXPECT_EQ(config.position.local_planner_name, "HybridLocalPlanner");
}
int main(int argc, char** argv)
{
#ifdef MOVE_BASE2_TEST_CONFIG_DIR