# 编织袋配置管理系统使用示例 ## 系统架构概述 新的配置管理系统采用了分离式的架构设计: - **ConfigManager**: 专门的配置管理类,负责共享内存监听和配置状态管理 - **GrabBagPresenter**: 业务逻辑处理器,实现配置变化监听接口,应用配置到实际设备 - **ConfigCmdParser**: 命令行工具,负责解析命令并发送到共享内存 ## 支持的配置参数 **重要说明**:配置命令现在使用空格分隔的参数格式,不再支持旧的连写格式。 ### 1. 相机曝光设置 ```bash # 设置所有相机曝光时间为100微秒 ./grabbag -c expose 100 # 设置相机1的曝光时间为150微秒 ./grabbag -c expose 1 150 ``` ### 2. 相机增益设置 ```bash # 设置所有相机增益为2.5 ./grabbag -c gain 2.5 # 设置相机2的增益为3.0 ./grabbag -c gain 2 3.0 ``` ### 3. 相机帧率设置 ```bash # 设置所有相机帧率为30fps ./grabbag -c framerate 30 # 设置相机1的帧率为25fps ./grabbag -c framerate 1 25 ``` ### 4. 相机摆动参数设置 ```bash # 设置所有相机摆动:速度10,角度0-180度 ./grabbag -c swing 10 0 180 # 设置相机1摆动:速度15,角度-45到45度 ./grabbag -c swing 1 15 -45 45 ``` ### 5. ROI区域设置 ```bash # 设置所有相机ROI区域:x=100, y=200, width=300, height=400 ./grabbag -c roi 100 200 300 400 # 设置相机2的ROI区域 ./grabbag -c roi 2 100 200 300 400 ``` ### 6. 算法参数设置 ```bash # 设置算法阈值参数 ./grabbag -c algo threshold 0.5 # 设置算法窗口大小参数 ./grabbag -c algo windowSize 10 ``` ## 配置变化监听机制 ### 监听器接口 ```cpp class IConfigChangeListener { public: // 系统配置整体变化 virtual void OnSystemConfigChanged(const SystemConfig& config) = 0; // 相机参数变化 virtual void OnCameraParamChanged(int cameraIndex, const CameraUIParam& cameraParam) = 0; // 算法参数变化 virtual void OnAlgorithmParamChanged(const VrAlgorithmParams& algorithmParams) = 0; }; ``` ### 注册监听器 ```cpp // 在您的类中实现IConfigChangeListener接口 class MyConfigListener : public IConfigChangeListener { public: void OnSystemConfigChanged(const SystemConfig& config) override { // 处理系统配置变化 } void OnCameraParamChanged(int cameraIndex, const CameraUIParam& cameraParam) override { // 处理相机参数变化 } void OnAlgorithmParamChanged(const VrAlgorithmParams& algorithmParams) override { // 处理算法参数变化 } }; // 注册监听器 ConfigManager* configManager = presenter->GetConfigManager(); auto listener = std::make_shared(); configManager->AddConfigChangeListener(listener); ``` ## 配置数据访问 ### 获取当前配置 ```cpp ConfigManager* configManager = presenter->GetConfigManager(); // 获取完整系统配置 SystemConfig config = configManager->GetConfig(); // 获取指定相机的UI参数 CameraUIParam cameraParam = configManager->GetCameraUIParam(1); // 获取算法参数 VrAlgorithmParams algoParams = configManager->GetAlgorithmParams(); // 获取VrConfig配置结果 ConfigResult configResult = configManager->GetConfigResult(); ``` ### 程序化更新配置 ```cpp ConfigManager* configManager = presenter->GetConfigManager(); // 更新相机参数 CameraUIParam newCameraParam; newCameraParam.cameraIndex = 1; newCameraParam.exposeTime = 120.0; newCameraParam.gain = 2.8; newCameraParam.frameRate = 25.0; configManager->UpdateCameraUIParam(1, newCameraParam); // 更新算法参数 VrAlgorithmParams newAlgoParams = configManager->GetAlgorithmParams(); newAlgoParams.bagParam.bagL = 700.0; configManager->UpdateAlgorithmParams(newAlgoParams); ``` ## 配置文件操作 ### 加载和保存配置 ```cpp ConfigManager* configManager = presenter->GetConfigManager(); // 从文件加载配置 if (configManager->LoadConfigFromFile("config/my_config.xml")) { std::cout << "配置加载成功" << std::endl; } // 保存配置到文件 if (configManager->SaveConfigToFile("config/my_config.xml")) { std::cout << "配置保存成功" << std::endl; } ``` ## 实际应用场景 ### 场景1:动态调整相机参数 ```bash # 在光线较暗的环境下增加曝光时间和增益 ./grabbag -c expose 200 ./grabbag -c gain 3.5 # 在高速运动场景下提高帧率,降低曝光时间 ./grabbag -c framerate 60 ./grabbag -c expose 50 ``` ### 场景2:多相机独立配置 ```bash # 相机1用于远距离检测,使用长曝光和高增益 ./grabbag -c expose 1 300 ./grabbag -c gain 1 4.0 # 相机2用于近距离检测,使用短曝光和低增益 ./grabbag -c expose 2 80 ./grabbag -c gain 2 1.5 ``` ### 场景3:根据检测区域调整ROI ```bash # 检测区域在图像左上角 ./grabbag -c roi 1 0 0 640 480 # 检测区域在图像中心 ./grabbag -c roi 2 320 240 640 480 ``` ## 错误处理 ### 命令行工具错误提示 ```bash # 参数格式错误 $ ./grabbag -c expose 错误: 曝光值必须是数字: expose # 相机索引超出范围 $ ./grabbag -c expose5:100 错误: 无效的相机索引: 5 # 参数值超出有效范围 $ ./grabbag -c gain-1 错误: 增益值必须为正数 ``` ### 系统监控和日志 - ConfigManager提供详细的日志记录 - 所有配置变化都会记录时间戳 - 失败的配置应用会记录错误原因 - 支持调试模式输出详细信息 ## 性能特点 - **实时性**: 配置变化在100ms内生效 - **可靠性**: 共享内存通信带校验和验证 - **线程安全**: 所有配置访问都是线程安全的 - **扩展性**: 易于添加新的配置参数类型 - **兼容性**: 保持与现有VrConfig系统的兼容 ## 注意事项 1. **相机索引**: 相机索引从1开始,-1表示所有相机 2. **参数范围**: 请确保参数值在设备支持的有效范围内 3. **设备连接**: 只有连接的相机才会应用参数变化 4. **配置持久化**: 配置变化不会自动保存到文件,需要手动保存 5. **权限要求**: 共享内存操作可能需要管理员权限