#ifndef IVRCONFIG_H #define IVRCONFIG_H #include #include #include #include /** * @brief 项目类型枚举 */ enum class ProjectType { LapWeld = 0, // 激光焊接 DirectBag = 1, // 带方向的编织袋 }; /** * @brief 项目类型字符串转换函数 */ inline std::string ProjectTypeToString(ProjectType type) { switch (type) { case ProjectType::LapWeld: return "LapWeld"; case ProjectType::DirectBag: return "DirectBag"; default: return "Unknown"; } } /** * @brief 字符串转项目类型函数 */ inline ProjectType StringToProjectType(const std::string& str) { if (str == "LapWeld" || str == "0") { return ProjectType::LapWeld; } else if (str == "DirectBag" || str == "1") { return ProjectType::DirectBag; } else { return ProjectType::LapWeld; // 默认返回激光焊接 } } struct DeviceInfo { std::string name; std::string ip; }; /** * @brief 串口配置信息 */ struct SerialConfig { #ifdef _WIN32 std::string portName = "COM6"; // 串口名称 #else std::string portName = "/dev/ttyS3"; // 串口名称 #endif int baudRate = 115200; // 波特率 int dataBits = 8; // 数据位 int stopBits = 1; // 停止位 int parity = 0; // 校验位 (0-无校验, 1-奇校验, 2-偶校验) int flowControl = 0; // 流控制 (0-无, 1-硬件, 2-软件) bool enabled = true; // 是否启用串口通信 }; /** * @brief 离群点滤波参数 */ struct VrOutlierFilterParam { double continuityTh = 20.0; // 连续性阈值 int outlierTh = 5; // 离群点判断阈值 }; /** * @brief 树生长参数 */ struct VrTreeGrowParam { double yDeviation_max = 20.0; // 生长时允许的最大Y偏差 double zDeviation_max = 80.0; // 生长时允许的最大Z偏差 int maxLineSkipNum = 5; // 生长时允许跳过的最大线条数 double maxSkipDistance = 20.0; // 最大跳跃距离 double minLTypeTreeLen = 50.0; // L型树的最小长度 double minVTypeTreeLen = 50.0; // V型树的最小长度 }; /** * @brief 激光焊接参数 */ struct VrLapWeldParam { double lapHeight = 2.0;//搭接厚度 double weldMinLen = 2.0; //最小焊缝长度,用于过滤可能的虚假焊缝 int weldRefPoints = 2; //输出的直线焊缝的参考点,默认是2个(起点和终点) }; /** * @brief 单个相机的平面校准参数 */ struct VrCameraPlaneCalibParam { int cameraIndex = 1; // 相机索引(1-based) std::string cameraName = ""; // 相机名称 double planeCalib[9] = {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0}; // 旋转矩阵,将数据调平(默认单位矩阵) double planeHeight = -1.0; // 参考平面的高度,用于去除地面数据 double invRMatrix[9] = {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0}; // 逆旋转矩阵,回到原坐标系(默认单位矩阵) bool isCalibrated = false; // 是否已经校准 }; /** * @brief 平面校准参数(支持多相机) */ struct VrPlaneCalibParam { std::vector cameraCalibParams; // 各个相机的校准参数 // 获取指定相机的校准参数 VrCameraPlaneCalibParam* GetCameraCalibParam(int cameraIndex) { for (auto& param : cameraCalibParams) { if (param.cameraIndex == cameraIndex) { return ¶m; } } return nullptr; } // 获取指定相机的校准参数(const版本) const VrCameraPlaneCalibParam* GetCameraCalibParam(int cameraIndex) const { for (const auto& param : cameraCalibParams) { if (param.cameraIndex == cameraIndex) { return ¶m; } } return nullptr; } // 设置或更新指定相机的校准参数 void SetCameraCalibParam(const VrCameraPlaneCalibParam& param) { for (auto& existingParam : cameraCalibParams) { if (existingParam.cameraIndex == param.cameraIndex) { existingParam = param; return; } } // 如果不存在,则添加新的 cameraCalibParams.push_back(param); } // 移除指定相机的校准参数 void RemoveCameraCalibParam(int cameraIndex) { cameraCalibParams.erase( std::remove_if(cameraCalibParams.begin(), cameraCalibParams.end(), [cameraIndex](const VrCameraPlaneCalibParam& param) { return param.cameraIndex == cameraIndex; }), cameraCalibParams.end()); } }; /** * @brief 调试参数 */ struct VrDebugParam { bool enableDebug = true; // 是否开启调试模式 bool savePointCloud = false; // 是否保存点云数据 bool saveDebugImage = false; // 是否保存调试图像 bool printDetailLog = true; // 是否打印详细日志 std::string debugOutputPath = ""; // 调试输出路径 }; /** * @brief 算法参数配置结构 */ struct VrAlgorithmParams { VrOutlierFilterParam filterParam; // 滤波参数 VrTreeGrowParam growParam; // 增长参数 VrPlaneCalibParam planeCalibParam; // 平面校准参数 VrLapWeldParam lapWeldParam; // 激光焊接参数 }; /** * @brief 配置加载结果 */ struct ConfigResult { std::vector cameraList; std::vector deviceList; VrAlgorithmParams algorithmParams; // 算法参数 VrDebugParam debugParam; // 调试参数 SerialConfig serialConfig; // 串口配置 ProjectType projectType; // 项目类型 }; /** * @brief 配置改变通知接口 */ class IVrConfigChangeNotify { public: virtual ~IVrConfigChangeNotify() {} /** * @brief 配置数据改变通知 * @param configResult 新的配置数据 */ virtual void OnConfigChanged(const ConfigResult& configResult) = 0; }; /** * @brief VrConfig接口类 */ class IVrConfig { public: /** * @brief 虚析构函数 */ virtual ~IVrConfig() {} /** * @brief 创建实例 * @return 实例 */ static bool CreateInstance(IVrConfig** ppVrConfig); /** * @brief 加载配置文件 * @param filePath 配置文件路径 * @return 加载的配置结果 */ virtual ConfigResult LoadConfig(const std::string& filePath) = 0; /** * @brief 保存配置文件 * @param filePath 配置文件路径 * @param configResult 配置结果 * @return 是否保存成功 */ virtual bool SaveConfig(const std::string& filePath, ConfigResult& configResult) = 0; /** * @brief 设置配置改变通知回调 * @param notify 通知接口指针 */ virtual void SetConfigChangeNotify(IVrConfigChangeNotify* notify) = 0; }; #endif // IVRCONFIG_H