Compare commits
12 Commits
Author | SHA1 | Date |
---|---|---|
|
ee1f74a1d8 | 1 hour ago |
|
587eea23d0 | 23 hours ago |
|
755dd10a9f | 23 hours ago |
|
515ca88bb8 | 23 hours ago |
|
c6295d90a5 | 1 day ago |
|
3c96b6ff82 | 1 day ago |
|
d267b9119f | 2 days ago |
|
0c9293d339 | 2 days ago |
|
9115b25a2e | 2 days ago |
|
a2ca57f4fb | 2 days ago |
|
73fb625b26 | 2 days ago |
|
d446c2d177 | 2 days ago |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,206 @@
|
||||
@startuml 代码组织结构图
|
||||
title 基于空地协同的战场环境探索系统 - 代码组织结构图
|
||||
skinparam packageStyle rectangle
|
||||
skinparam packageFontSize 10
|
||||
skinparam packageFontStyle bold
|
||||
skinparam classFontSize 8
|
||||
skinparam classFontStyle normal
|
||||
|
||||
package "src/" {
|
||||
package "Client/ (Qt客户端应用)" {
|
||||
package "核心应用层" {
|
||||
file "main.cpp" as main
|
||||
file "BattlefieldExplorationSystem.pro" as proj
|
||||
file "Makefile" as make
|
||||
}
|
||||
|
||||
package "include/ (头文件)" {
|
||||
package "ui/ (用户界面)" {
|
||||
package "main/" {
|
||||
file "MainWindow.h" as mainH
|
||||
}
|
||||
package "components/ (组件)" {
|
||||
file "RightFunctionPanel.h" as rightPanelH
|
||||
file "DeviceListPanel.h" as deviceListH
|
||||
file "DeviceCard.h" as deviceCardH
|
||||
file "SystemLogPanel.h" as logPanelH
|
||||
}
|
||||
package "dialogs/ (对话框)" {
|
||||
file "RobotDogControlDialog.h" as dogDialogH
|
||||
file "EnemyStatsDialog.h" as enemyDialogH
|
||||
file "DroneControlDialog.h" as droneDialogH
|
||||
file "DeviceDialog.h" as deviceDialogH
|
||||
}
|
||||
file "UIInitializationManager.h" as uiInitH
|
||||
}
|
||||
|
||||
package "utils/ (工具类)" {
|
||||
file "ConfigManager.h" as configH
|
||||
file "SystemLogger.h" as loggerH
|
||||
}
|
||||
|
||||
package "core/ (核心功能)" {
|
||||
package "database/ (数据库)" {
|
||||
file "DatabaseManager.h" as dbManagerH
|
||||
file "DatabaseHelper.h" as dbHelperH
|
||||
file "DatabaseConfig.h" as dbConfigH
|
||||
file "EnemyDatabase.h" as enemyDbH
|
||||
file "DogDatabase.h" as dogDbH
|
||||
file "UAVDatabase.h" as uavDbH
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
package "src/ (源文件)" {
|
||||
package "ui/ (用户界面实现)" {
|
||||
package "main/" {
|
||||
file "MainWindow.cpp" as mainCpp
|
||||
}
|
||||
package "components/ (组件实现)" {
|
||||
file "RightFunctionPanel.cpp" as rightPanelCpp
|
||||
file "DeviceListPanel.cpp" as deviceListCpp
|
||||
file "DeviceCard.cpp" as deviceCardCpp
|
||||
file "SystemLogPanel.cpp" as logPanelCpp
|
||||
}
|
||||
package "dialogs/ (对话框实现)" {
|
||||
file "RobotDogControlDialog.cpp" as dogDialogCpp
|
||||
file "EnemyStatsDialog.cpp" as enemyDialogCpp
|
||||
file "DroneControlDialog.cpp" as droneDialogCpp
|
||||
file "DeviceDialog.cpp" as deviceDialogCpp
|
||||
}
|
||||
file "UIInitializationManager.cpp" as uiInitCpp
|
||||
}
|
||||
|
||||
package "utils/ (工具类实现)" {
|
||||
file "ConfigManager.cpp" as configCpp
|
||||
file "SystemLogger.cpp" as loggerCpp
|
||||
}
|
||||
|
||||
package "core/ (核心功能实现)" {
|
||||
package "database/ (数据库实现)" {
|
||||
file "DatabaseManager.cpp" as dbManagerCpp
|
||||
file "DatabaseHelper.cpp" as dbHelperCpp
|
||||
file "DatabaseConfig.cpp" as dbConfigCpp
|
||||
file "EnemyDatabase.cpp" as enemyDbCpp
|
||||
file "DogDatabase.cpp" as dogDbCpp
|
||||
file "UAVDatabase.cpp" as uavDbCpp
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
package "forms/ (UI设计文件)" {
|
||||
package "main/" {
|
||||
file "MainWindow.ui" as mainUi
|
||||
}
|
||||
package "dialogs/" {
|
||||
file "DeviceDialog.ui" as deviceUi
|
||||
}
|
||||
}
|
||||
|
||||
package "AudioModule/ (音频模块)" {
|
||||
file "IntelligenceUI.h" as audioH
|
||||
file "IntelligenceUI.cpp" as audioCpp
|
||||
file "IntelligenceUI.ui" as audioUi
|
||||
}
|
||||
|
||||
package "FaceLightModule/ (面部识别模块)" {
|
||||
file "FaceLightControl.h" as faceH
|
||||
file "FaceLightControl.cpp" as faceCpp
|
||||
file "FaceLightControl.ui" as faceUi
|
||||
}
|
||||
|
||||
package "config/ (配置文件)" {
|
||||
file "database.ini" as dbIni
|
||||
file "database.ini.example" as dbIniEx
|
||||
file "README.md" as configReadme
|
||||
}
|
||||
|
||||
package "database/ (数据库脚本)" {
|
||||
file "enemy_database_schema.sql" as enemySchema
|
||||
file "insert_additional_enemy_data.sql" as enemyData
|
||||
file "test_enemy_database.sql" as enemyTest
|
||||
file "update_enemy_locations.sql" as enemyUpdate
|
||||
}
|
||||
|
||||
package "其他资源" {
|
||||
file "res.qrc" as res
|
||||
file "代码规范.md" as codeStandard
|
||||
file "BUTTON_LAYOUT_OPTIMIZATION_REPORT.md" as layoutReport
|
||||
}
|
||||
}
|
||||
|
||||
package "catkin_dog/ (ROS机器人控制)" {
|
||||
package "unitree_ros_to_real/" {
|
||||
package "unitree_legged_real/" {
|
||||
package "src/exe/" as exe
|
||||
package "include/" as realInclude
|
||||
package "launch/" as launch
|
||||
package "scripts/" as scripts
|
||||
package "rviz/" as rviz
|
||||
file "CMakeLists.txt" as realCmake
|
||||
file "package.xml" as realPackage
|
||||
}
|
||||
}
|
||||
|
||||
package "unitree_legged_sdk/" {
|
||||
package "include/" as sdkInclude
|
||||
package "lib/" as lib
|
||||
package "example/" as example
|
||||
package "example_py/" as examplePy
|
||||
package "python_wrapper/" as pyWrapper
|
||||
file "CMakeLists.txt" as sdkCmake
|
||||
file "package.xml" as sdkPackage
|
||||
file "README.md" as sdkReadme
|
||||
}
|
||||
|
||||
package "unitree_legged_msgs/" {
|
||||
package "msg/ (ROS消息定义)" {
|
||||
file "HighCmd.msg" as highCmd
|
||||
file "HighState.msg" as highState
|
||||
file "LowCmd.msg" as lowCmd
|
||||
file "LowState.msg" as lowState
|
||||
file "MotorCmd.msg" as motorCmd
|
||||
file "MotorState.msg" as motorState
|
||||
file "IMU.msg" as imu
|
||||
file "BmsState.msg" as bmsState
|
||||
file "LED.msg" as led
|
||||
file "Cartesian.msg" as cartesian
|
||||
}
|
||||
file "CMakeLists.txt" as msgCmake
|
||||
file "package.xml" as msgPackage
|
||||
}
|
||||
|
||||
package "slamware_ros_sdk_linux-x86_64-gcc9/" as slamware
|
||||
file "CMakeLists.txt" as catkinCmake
|
||||
}
|
||||
}
|
||||
|
||||
' 主要模块关系
|
||||
package "系统架构层次" {
|
||||
note top of Client : "Qt客户端应用\n- 用户界面\n- 数据库管理\n- 设备控制\n- 音频处理\n- 面部识别"
|
||||
|
||||
note top of catkin_dog : "ROS机器人控制\n- 机器狗SDK\n- 消息通信\n- 导航控制\n- SLAM建图"
|
||||
}
|
||||
|
||||
' 核心功能模块
|
||||
package "核心功能模块" {
|
||||
note as N1 : "1. 空地协同控制\n- 无人机控制\n- 机器狗控制\n- 协同调度"
|
||||
|
||||
note as N2 : "2. 智能识别系统\n- YOLO目标检测\n- 面部识别\n- 音频处理"
|
||||
|
||||
note as N3 : "3. 数据管理系统\n- 敌方数据库\n- 设备数据库\n- 情报数据"
|
||||
|
||||
note as N4 : "4. 可视化界面\n- 3D战场地图\n- 实时视频显示\n- 态势分析"
|
||||
}
|
||||
|
||||
Client --> N1 : 控制指令
|
||||
Client --> N2 : 识别结果
|
||||
Client --> N3 : 数据存储
|
||||
Client --> N4 : 界面展示
|
||||
|
||||
catkin_dog --> N1 : 执行控制
|
||||
catkin_dog --> N2 : 传感器数据
|
||||
catkin_dog --> N3 : 位置信息
|
||||
catkin_dog --> N4 : 状态反馈
|
||||
|
||||
@enduml
|
@ -0,0 +1,350 @@
|
||||
@startuml 数据模型类图
|
||||
title 基于空地协同的战场环境探索系统 - 数据模型类图
|
||||
skinparam classAttributeIconSize 0
|
||||
skinparam classFontSize 10
|
||||
skinparam classFontStyle bold
|
||||
skinparam packageStyle rectangle
|
||||
|
||||
package "核心数据实体" {
|
||||
class Location {
|
||||
-locationId: String
|
||||
-x: double
|
||||
-y: double
|
||||
-z: double
|
||||
-timestamp: QDateTime
|
||||
+getCoordinates()
|
||||
+setCoordinates()
|
||||
+calculateDistance()
|
||||
+isValid()
|
||||
}
|
||||
|
||||
class Pose {
|
||||
-poseId: String
|
||||
-position: Location
|
||||
-orientation: QQuaternion
|
||||
-timestamp: QDateTime
|
||||
+getPosition()
|
||||
+getOrientation()
|
||||
+setPose()
|
||||
+transformPose()
|
||||
}
|
||||
|
||||
class SensorData {
|
||||
-sensorId: String
|
||||
-sensorType: String
|
||||
-dataType: String
|
||||
-rawData: QByteArray
|
||||
-processedData: QVariant
|
||||
-timestamp: QDateTime
|
||||
+getRawData()
|
||||
+getProcessedData()
|
||||
+processData()
|
||||
+validateData()
|
||||
}
|
||||
|
||||
class Target {
|
||||
-targetId: String
|
||||
-targetType: String
|
||||
-location: Location
|
||||
-threatLevel: int
|
||||
-confidence: double
|
||||
-status: String
|
||||
-timestamp: QDateTime
|
||||
+updateLocation()
|
||||
+updateThreatLevel()
|
||||
+assessThreat()
|
||||
+isActive()
|
||||
}
|
||||
}
|
||||
|
||||
package "设备数据模型" {
|
||||
class Device {
|
||||
-deviceId: String
|
||||
-deviceType: String
|
||||
-deviceName: String
|
||||
-status: String
|
||||
-connectionStatus: String
|
||||
-lastUpdate: QDateTime
|
||||
+getDeviceInfo()
|
||||
+updateStatus()
|
||||
+isConnected()
|
||||
+isOperational()
|
||||
}
|
||||
|
||||
class RobotDog {
|
||||
-dogId: String
|
||||
-dogType: String
|
||||
-batteryLevel: double
|
||||
-currentPose: Pose
|
||||
-movementStatus: String
|
||||
-sensorData: QList<SensorData>
|
||||
-lastCommand: MovementCommand
|
||||
+getBatteryLevel()
|
||||
+getCurrentPose()
|
||||
+updateStatus()
|
||||
+sendCommand()
|
||||
+emergencyStop()
|
||||
}
|
||||
|
||||
class UAV {
|
||||
-uavId: String
|
||||
-uavType: String
|
||||
-batteryLevel: double
|
||||
-altitude: double
|
||||
-currentPose: Pose
|
||||
-flightMode: String
|
||||
-sensorData: QList<SensorData>
|
||||
+getBatteryLevel()
|
||||
+getAltitude()
|
||||
+getCurrentPose()
|
||||
+updateFlightMode()
|
||||
+sendFlightCommand()
|
||||
}
|
||||
|
||||
class MovementCommand {
|
||||
-commandId: String
|
||||
-deviceId: String
|
||||
-commandType: String
|
||||
-targetPose: Pose
|
||||
-speed: double
|
||||
-priority: int
|
||||
-timestamp: QDateTime
|
||||
-status: String
|
||||
+executeCommand()
|
||||
+validateCommand()
|
||||
+getCommandStatus()
|
||||
+cancelCommand()
|
||||
}
|
||||
}
|
||||
|
||||
package "任务数据模型" {
|
||||
class Mission {
|
||||
-missionId: String
|
||||
-missionType: String
|
||||
-missionName: String
|
||||
-priority: int
|
||||
-status: String
|
||||
-startTime: QDateTime
|
||||
-endTime: QDateTime
|
||||
-assignedDevices: QList<String>
|
||||
-tasks: QList<Task>
|
||||
+createMission()
|
||||
+assignDevices()
|
||||
+addTask()
|
||||
+updateStatus()
|
||||
+completeMission()
|
||||
}
|
||||
|
||||
class Task {
|
||||
-taskId: String
|
||||
-missionId: String
|
||||
-taskType: String
|
||||
-taskName: String
|
||||
-priority: int
|
||||
-status: String
|
||||
-assignedDevice: String
|
||||
-startLocation: Location
|
||||
-endLocation: Location
|
||||
-parameters: QVariantMap
|
||||
+assignDevice()
|
||||
+updateStatus()
|
||||
+executeTask()
|
||||
+completeTask()
|
||||
}
|
||||
|
||||
class TaskResult {
|
||||
-resultId: String
|
||||
-taskId: String
|
||||
-deviceId: String
|
||||
-resultType: String
|
||||
-resultData: QVariant
|
||||
-success: boolean
|
||||
-errorMessage: String
|
||||
-timestamp: QDateTime
|
||||
+setResult()
|
||||
+getResult()
|
||||
+isSuccess()
|
||||
+getErrorMessage()
|
||||
}
|
||||
}
|
||||
|
||||
package "情报数据模型" {
|
||||
class IntelligenceData {
|
||||
-intelligenceId: String
|
||||
-dataType: String
|
||||
-source: String
|
||||
-content: QVariant
|
||||
-confidence: double
|
||||
-priority: int
|
||||
-timestamp: QDateTime
|
||||
-expiryTime: QDateTime
|
||||
+getContent()
|
||||
+setConfidence()
|
||||
+isExpired()
|
||||
+updatePriority()
|
||||
}
|
||||
|
||||
class EnemyTarget {
|
||||
-targetId: String
|
||||
-targetType: String
|
||||
-location: Location
|
||||
-threatLevel: int
|
||||
-confidence: double
|
||||
-detectionTime: QDateTime
|
||||
-lastUpdate: QDateTime
|
||||
-status: String
|
||||
-attributes: QVariantMap
|
||||
+updateLocation()
|
||||
+updateThreatLevel()
|
||||
+setAttributes()
|
||||
+isActive()
|
||||
}
|
||||
|
||||
class BattlefieldMap {
|
||||
-mapId: String
|
||||
-mapType: String
|
||||
-resolution: double
|
||||
-width: double
|
||||
-height: double
|
||||
-origin: Location
|
||||
-mapData: QImage
|
||||
-obstacles: QList<Obstacle>
|
||||
-lastUpdate: QDateTime
|
||||
+getMapData()
|
||||
+addObstacle()
|
||||
+removeObstacle()
|
||||
+updateMap()
|
||||
+getObstacles()
|
||||
}
|
||||
|
||||
class Obstacle {
|
||||
-obstacleId: String
|
||||
-obstacleType: String
|
||||
-location: Location
|
||||
-size: QVector3D
|
||||
-properties: QVariantMap
|
||||
-timestamp: QDateTime
|
||||
+getLocation()
|
||||
+getSize()
|
||||
+setProperties()
|
||||
+isBlocking()
|
||||
}
|
||||
}
|
||||
|
||||
package "系统配置数据" {
|
||||
class SystemConfig {
|
||||
-configId: String
|
||||
-configType: String
|
||||
-configName: String
|
||||
-configValue: QVariant
|
||||
-description: String
|
||||
-lastModified: QDateTime
|
||||
+getValue()
|
||||
+setValue()
|
||||
+getDescription()
|
||||
+isValid()
|
||||
}
|
||||
|
||||
class UserConfig {
|
||||
-userId: String
|
||||
-username: String
|
||||
-userRole: String
|
||||
-permissions: QList<String>
|
||||
-preferences: QVariantMap
|
||||
-lastLogin: QDateTime
|
||||
+getPermissions()
|
||||
+setPreferences()
|
||||
+hasPermission()
|
||||
+updateLastLogin()
|
||||
}
|
||||
|
||||
class DeviceConfig {
|
||||
-deviceId: String
|
||||
-configType: String
|
||||
-parameters: QVariantMap
|
||||
-lastModified: QDateTime
|
||||
+getParameters()
|
||||
+setParameters()
|
||||
+validateConfig()
|
||||
+applyConfig()
|
||||
}
|
||||
}
|
||||
|
||||
package "日志和监控数据" {
|
||||
class SystemLog {
|
||||
-logId: String
|
||||
-logLevel: String
|
||||
-logSource: String
|
||||
-logMessage: String
|
||||
-timestamp: QDateTime
|
||||
-userId: String
|
||||
-deviceId: String
|
||||
+getLogInfo()
|
||||
+setLogLevel()
|
||||
+formatMessage()
|
||||
}
|
||||
|
||||
class PerformanceMetrics {
|
||||
-metricId: String
|
||||
-metricType: String
|
||||
-metricName: String
|
||||
-metricValue: double
|
||||
-unit: String
|
||||
-timestamp: QDateTime
|
||||
-deviceId: String
|
||||
+getMetricValue()
|
||||
+setMetricValue()
|
||||
+getUnit()
|
||||
+isWithinRange()
|
||||
}
|
||||
|
||||
class Alert {
|
||||
-alertId: String
|
||||
-alertType: String
|
||||
-alertLevel: String
|
||||
-alertMessage: String
|
||||
-source: String
|
||||
-timestamp: QDateTime
|
||||
-acknowledged: boolean
|
||||
-resolved: boolean
|
||||
+getAlertInfo()
|
||||
+acknowledgeAlert()
|
||||
+resolveAlert()
|
||||
+isActive()
|
||||
}
|
||||
}
|
||||
|
||||
' 关系定义
|
||||
Location ||--o{ Pose : 组成
|
||||
Location ||--o{ Target : 定位
|
||||
Location ||--o{ RobotDog : 定位
|
||||
Location ||--o{ UAV : 定位
|
||||
Location ||--o{ Obstacle : 定位
|
||||
|
||||
Pose ||--o{ MovementCommand : 目标位置
|
||||
Pose ||--o{ Task : 起始/结束位置
|
||||
|
||||
Device ||--o{ RobotDog : 继承
|
||||
Device ||--o{ UAV : 继承
|
||||
|
||||
RobotDog ||--o{ MovementCommand : 执行
|
||||
UAV ||--o{ MovementCommand : 执行
|
||||
|
||||
Mission ||--o{ Task : 包含
|
||||
Task ||--o{ TaskResult : 产生
|
||||
Task ||--o{ MovementCommand : 生成
|
||||
|
||||
IntelligenceData ||--o{ EnemyTarget : 包含
|
||||
BattlefieldMap ||--o{ Obstacle : 包含
|
||||
BattlefieldMap ||--o{ Location : 覆盖
|
||||
|
||||
SystemConfig ||--o{ DeviceConfig : 配置
|
||||
UserConfig ||--o{ SystemLog : 记录
|
||||
Device ||--o{ DeviceConfig : 配置
|
||||
|
||||
SystemLog ||--o{ PerformanceMetrics : 记录
|
||||
SystemLog ||--o{ Alert : 生成
|
||||
Device ||--o{ PerformanceMetrics : 监控
|
||||
Device ||--o{ Alert : 产生
|
||||
|
||||
@enduml
|
@ -0,0 +1,515 @@
|
||||
@startuml 软件系统分析类图
|
||||
title 基于空地协同的战场环境探索系统 - 软件系统分析类图
|
||||
skinparam classAttributeIconSize 0
|
||||
skinparam classFontSize 10
|
||||
skinparam classFontStyle bold
|
||||
skinparam packageStyle rectangle
|
||||
skinparam packageFontSize 12
|
||||
|
||||
' 定义样式
|
||||
skinparam class {
|
||||
BackgroundColor<<Qt>> #E1F5FE
|
||||
BackgroundColor<<ROS>> #F3E5F5
|
||||
BackgroundColor<<AI>> #E8F5E8
|
||||
BackgroundColor<<Database>> #FFF3E0
|
||||
BackgroundColor<<Core>> #FCE4EC
|
||||
}
|
||||
|
||||
package "用户界面层 (Qt Client)" <<Qt>> {
|
||||
class MainWindow {
|
||||
-mainWindowId: String
|
||||
-windowTitle: String
|
||||
-windowSize: QSize
|
||||
+initializeUI()
|
||||
+setupMenuBar()
|
||||
+setupToolBar()
|
||||
+setupStatusBar()
|
||||
+handleMenuAction()
|
||||
+updateStatus()
|
||||
+closeEvent()
|
||||
}
|
||||
|
||||
class UIInitializationManager {
|
||||
-uiManagerId: String
|
||||
-initializationStatus: String
|
||||
+initializeAllComponents()
|
||||
+setupDatabaseConnection()
|
||||
+setupDeviceConnections()
|
||||
+setupSignalSlots()
|
||||
+validateInitialization()
|
||||
+handleInitializationError()
|
||||
}
|
||||
|
||||
package "UI组件 (Components)" {
|
||||
class RightFunctionPanel {
|
||||
-panelId: String
|
||||
-panelType: String
|
||||
-isVisible: boolean
|
||||
+setupFunctionButtons()
|
||||
+handleButtonClick()
|
||||
+updatePanelContent()
|
||||
+showPanel()
|
||||
+hidePanel()
|
||||
}
|
||||
|
||||
class DeviceListPanel {
|
||||
-deviceListId: String
|
||||
-deviceCount: int
|
||||
-selectedDevice: String
|
||||
+loadDeviceList()
|
||||
+addDevice()
|
||||
+removeDevice()
|
||||
+selectDevice()
|
||||
+updateDeviceStatus()
|
||||
+refreshDeviceList()
|
||||
}
|
||||
|
||||
class DeviceCard {
|
||||
-deviceId: String
|
||||
-deviceType: String
|
||||
-deviceStatus: String
|
||||
-deviceIcon: QIcon
|
||||
+displayDeviceInfo()
|
||||
+updateStatus()
|
||||
+handleClick()
|
||||
+showDetails()
|
||||
}
|
||||
|
||||
class SystemLogPanel {
|
||||
-logPanelId: String
|
||||
-logLevel: String
|
||||
-maxLogEntries: int
|
||||
+addLogEntry()
|
||||
+clearLogs()
|
||||
+filterLogs()
|
||||
+exportLogs()
|
||||
+setLogLevel()
|
||||
}
|
||||
}
|
||||
|
||||
package "对话框 (Dialogs)" {
|
||||
class RobotDogControlDialog {
|
||||
-dialogId: String
|
||||
-dogId: String
|
||||
-controlMode: String
|
||||
+setupControlInterface()
|
||||
+sendMovementCommand()
|
||||
+sendNavigationCommand()
|
||||
+updateDogStatus()
|
||||
+emergencyStop()
|
||||
+closeDialog()
|
||||
}
|
||||
|
||||
class DroneControlDialog {
|
||||
-dialogId: String
|
||||
-droneId: String
|
||||
-flightMode: String
|
||||
+setupFlightInterface()
|
||||
+sendTakeoffCommand()
|
||||
+sendLandingCommand()
|
||||
+sendFlightCommand()
|
||||
+updateDroneStatus()
|
||||
+emergencyLanding()
|
||||
}
|
||||
|
||||
class EnemyStatsDialog {
|
||||
-dialogId: String
|
||||
-enemyCount: int
|
||||
-threatLevel: int
|
||||
+loadEnemyData()
|
||||
+displayStatistics()
|
||||
+updateThreatLevel()
|
||||
+exportReport()
|
||||
+closeDialog()
|
||||
}
|
||||
|
||||
class DeviceDialog {
|
||||
-dialogId: String
|
||||
-deviceId: String
|
||||
-deviceType: String
|
||||
+setupDeviceInterface()
|
||||
+configureDevice()
|
||||
+testDevice()
|
||||
+updateDeviceInfo()
|
||||
+saveConfiguration()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
package "核心业务层 (Core Business)" <<Core>> {
|
||||
package "数据库管理 (Database)" <<Database>> {
|
||||
class DatabaseManager {
|
||||
-dbManagerId: String
|
||||
-connectionStatus: String
|
||||
-dbConfig: DatabaseConfig
|
||||
+connectToDatabase()
|
||||
+disconnectFromDatabase()
|
||||
+createTables()
|
||||
+executeQuery()
|
||||
+beginTransaction()
|
||||
+commitTransaction()
|
||||
+rollbackTransaction()
|
||||
}
|
||||
|
||||
class DatabaseHelper {
|
||||
-helperId: String
|
||||
-queryBuilder: QueryBuilder
|
||||
+buildSelectQuery()
|
||||
+buildInsertQuery()
|
||||
+buildUpdateQuery()
|
||||
+buildDeleteQuery()
|
||||
+executeQuery()
|
||||
+handleQueryError()
|
||||
}
|
||||
|
||||
class DatabaseConfig {
|
||||
-configId: String
|
||||
-host: String
|
||||
-port: int
|
||||
-databaseName: String
|
||||
-username: String
|
||||
-password: String
|
||||
+loadFromFile()
|
||||
+saveToFile()
|
||||
+validateConfig()
|
||||
+getConnectionString()
|
||||
}
|
||||
|
||||
class EnemyDatabase {
|
||||
-enemyDbId: String
|
||||
-tableName: String
|
||||
+insertEnemyTarget()
|
||||
+updateEnemyTarget()
|
||||
+deleteEnemyTarget()
|
||||
+getEnemyTarget()
|
||||
+getAllEnemyTargets()
|
||||
+getEnemyTargetsByType()
|
||||
+getEnemyTargetsByThreatLevel()
|
||||
}
|
||||
|
||||
class DogDatabase {
|
||||
-dogDbId: String
|
||||
-tableName: String
|
||||
+insertDogStatus()
|
||||
+updateDogStatus()
|
||||
+getDogStatus()
|
||||
+getAllDogStatus()
|
||||
+insertDogLocation()
|
||||
+getDogLocationHistory()
|
||||
}
|
||||
|
||||
class UAVDatabase {
|
||||
-uavDbId: String
|
||||
-tableName: String
|
||||
+insertUAVStatus()
|
||||
+updateUAVStatus()
|
||||
+getUAVStatus()
|
||||
+getAllUAVStatus()
|
||||
+insertUAVFlightData()
|
||||
+getUAVFlightTrajectory()
|
||||
}
|
||||
}
|
||||
|
||||
package "工具类 (Utils)" {
|
||||
class ConfigManager {
|
||||
-configManagerId: String
|
||||
-configFile: String
|
||||
-configData: QVariantMap
|
||||
+loadConfiguration()
|
||||
+saveConfiguration()
|
||||
+getValue()
|
||||
+setValue()
|
||||
+validateConfiguration()
|
||||
+reloadConfiguration()
|
||||
}
|
||||
|
||||
class SystemLogger {
|
||||
-loggerId: String
|
||||
-logLevel: String
|
||||
-logFile: String
|
||||
+logInfo()
|
||||
+logWarning()
|
||||
+logError()
|
||||
+logDebug()
|
||||
+setLogLevel()
|
||||
+setLogFile()
|
||||
+rotateLogFile()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
package "AI算法层 (AI Algorithms)" <<AI>> {
|
||||
class YOLODetector {
|
||||
-detectorId: String
|
||||
-modelPath: String
|
||||
-confidenceThreshold: double
|
||||
-nmsThreshold: double
|
||||
-modelLoaded: boolean
|
||||
+loadModel()
|
||||
+detectObjects()
|
||||
+classifyTargets()
|
||||
+updateModel()
|
||||
+setConfidenceThreshold()
|
||||
+setNMSThreshold()
|
||||
+getDetectionResults()
|
||||
}
|
||||
|
||||
class TargetClassifier {
|
||||
-classifierId: String
|
||||
-classifierType: String
|
||||
-trainingData: QList<QImage>
|
||||
+trainClassifier()
|
||||
+classifyTarget()
|
||||
+updateClassifier()
|
||||
+getClassificationResults()
|
||||
+validateClassification()
|
||||
}
|
||||
|
||||
class SLAMProcessor {
|
||||
-slamId: String
|
||||
-slamType: String
|
||||
-mapResolution: double
|
||||
-currentPose: Pose
|
||||
+processSensorData()
|
||||
+buildMap()
|
||||
+localizePosition()
|
||||
+updateMap()
|
||||
+getCurrentPose()
|
||||
+getMapData()
|
||||
}
|
||||
|
||||
class PathPlanner {
|
||||
-plannerId: String
|
||||
-algorithmType: String
|
||||
-heuristicFunction: String
|
||||
-obstacleMap: QImage
|
||||
+planOptimalPath()
|
||||
+avoidObstacles()
|
||||
+optimizeRoute()
|
||||
+replanPath()
|
||||
+getPathData()
|
||||
+validatePath()
|
||||
}
|
||||
|
||||
class DataFusion {
|
||||
-fusionId: String
|
||||
-fusionAlgorithm: String
|
||||
-weightMatrix: Matrix
|
||||
-sensorData: QList<SensorData>
|
||||
+fuseMultiSourceData()
|
||||
+weightData()
|
||||
+resolveConflicts()
|
||||
+generateFusedMap()
|
||||
+getFusionResults()
|
||||
+updateFusionAlgorithm()
|
||||
}
|
||||
}
|
||||
|
||||
package "ROS机器人控制层 (ROS Control)" <<ROS>> {
|
||||
package "Unitree机器狗控制" {
|
||||
class UnitreeController {
|
||||
-controllerId: String
|
||||
-dogId: String
|
||||
-connectionStatus: String
|
||||
-currentState: DogState
|
||||
+connectToDog()
|
||||
+disconnectFromDog()
|
||||
+sendMovementCommand()
|
||||
+sendNavigationCommand()
|
||||
+getDogStatus()
|
||||
+emergencyStop()
|
||||
}
|
||||
|
||||
class DogState {
|
||||
-stateId: String
|
||||
-batteryLevel: double
|
||||
-currentPose: Pose
|
||||
-movementStatus: String
|
||||
-sensorData: SensorData
|
||||
+updateState()
|
||||
+getBatteryLevel()
|
||||
+getCurrentPose()
|
||||
+getMovementStatus()
|
||||
}
|
||||
|
||||
class MovementCommand {
|
||||
-commandId: String
|
||||
-commandType: String
|
||||
-targetPose: Pose
|
||||
-speed: double
|
||||
-timestamp: QDateTime
|
||||
+executeCommand()
|
||||
+validateCommand()
|
||||
+getCommandStatus()
|
||||
}
|
||||
}
|
||||
|
||||
package "ROS消息定义" {
|
||||
class HighCmd {
|
||||
-mode: int
|
||||
-gaitType: int
|
||||
-speedLevel: int
|
||||
-footRaiseHeight: float
|
||||
-bodyHeight: float
|
||||
+serialize()
|
||||
+deserialize()
|
||||
}
|
||||
|
||||
class HighState {
|
||||
-mode: int
|
||||
-gaitType: int
|
||||
-footRaiseHeight: float
|
||||
-bodyHeight: float
|
||||
-position: Cartesian
|
||||
+serialize()
|
||||
+deserialize()
|
||||
}
|
||||
|
||||
class IMU {
|
||||
-quaternion: QVector4D
|
||||
-gyroscope: QVector3D
|
||||
-accelerometer: QVector3D
|
||||
-timestamp: QDateTime
|
||||
+getQuaternion()
|
||||
+getGyroscope()
|
||||
+getAccelerometer()
|
||||
}
|
||||
|
||||
class MotorState {
|
||||
-motorId: int
|
||||
-position: float
|
||||
-velocity: float
|
||||
-torque: float
|
||||
-temperature: float
|
||||
+getPosition()
|
||||
+getVelocity()
|
||||
+getTorque()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
package "通信层 (Communication)" {
|
||||
class CommunicationManager {
|
||||
-commManagerId: String
|
||||
-connectionType: String
|
||||
-connectionStatus: String
|
||||
+establishConnection()
|
||||
+closeConnection()
|
||||
+sendMessage()
|
||||
+receiveMessage()
|
||||
+handleConnectionError()
|
||||
+getConnectionStatus()
|
||||
}
|
||||
|
||||
class NetworkProtocol {
|
||||
-protocolId: String
|
||||
-protocolType: String
|
||||
-port: int
|
||||
-timeout: int
|
||||
+encodeMessage()
|
||||
+decodeMessage()
|
||||
+validateMessage()
|
||||
+handleProtocolError()
|
||||
}
|
||||
|
||||
class DataTransmission {
|
||||
-transmissionId: String
|
||||
-dataType: String
|
||||
-compressionEnabled: boolean
|
||||
-encryptionEnabled: boolean
|
||||
+transmitData()
|
||||
+receiveData()
|
||||
+compressData()
|
||||
+decompressData()
|
||||
+encryptData()
|
||||
+decryptData()
|
||||
}
|
||||
}
|
||||
|
||||
package "任务控制层 (Mission Control)" {
|
||||
class MissionController {
|
||||
-missionId: String
|
||||
-missionType: String
|
||||
-priority: int
|
||||
-status: String
|
||||
-startTime: QDateTime
|
||||
+createMission()
|
||||
+assignTasks()
|
||||
+monitorProgress()
|
||||
+handleEmergency()
|
||||
+generateReport()
|
||||
+abortMission()
|
||||
}
|
||||
|
||||
class TaskScheduler {
|
||||
-schedulerId: String
|
||||
-taskQueue: QQueue<Task>
|
||||
-schedulingAlgorithm: String
|
||||
+addTask()
|
||||
+removeTask()
|
||||
+scheduleTasks()
|
||||
+getNextTask()
|
||||
+updateTaskStatus()
|
||||
+optimizeSchedule()
|
||||
}
|
||||
|
||||
class CoordinationController {
|
||||
-coordinationId: String
|
||||
-coordinationType: String
|
||||
-deviceList: QList<Device>
|
||||
+coordinatePlatforms()
|
||||
+optimizeTaskAllocation()
|
||||
+resolveConflicts()
|
||||
+maintainFormation()
|
||||
+getCoordinationStatus()
|
||||
}
|
||||
}
|
||||
|
||||
' 关系定义
|
||||
MainWindow ||--o{ UIInitializationManager : 使用
|
||||
MainWindow ||--o{ RightFunctionPanel : 包含
|
||||
MainWindow ||--o{ DeviceListPanel : 包含
|
||||
MainWindow ||--o{ SystemLogPanel : 包含
|
||||
|
||||
DeviceListPanel ||--o{ DeviceCard : 包含
|
||||
MainWindow ||--o{ RobotDogControlDialog : 打开
|
||||
MainWindow ||--o{ DroneControlDialog : 打开
|
||||
MainWindow ||--o{ EnemyStatsDialog : 打开
|
||||
MainWindow ||--o{ DeviceDialog : 打开
|
||||
|
||||
UIInitializationManager ||--o{ DatabaseManager : 初始化
|
||||
UIInitializationManager ||--o{ ConfigManager : 配置
|
||||
|
||||
DatabaseManager ||--o{ DatabaseHelper : 使用
|
||||
DatabaseManager ||--o{ DatabaseConfig : 配置
|
||||
DatabaseManager ||--o{ EnemyDatabase : 管理
|
||||
DatabaseManager ||--o{ DogDatabase : 管理
|
||||
DatabaseManager ||--o{ UAVDatabase : 管理
|
||||
|
||||
RobotDogControlDialog ||--o{ UnitreeController : 控制
|
||||
DroneControlDialog ||--o{ CommunicationManager : 通信
|
||||
|
||||
UnitreeController ||--o{ DogState : 监控
|
||||
UnitreeController ||--o{ MovementCommand : 发送
|
||||
UnitreeController ||--o{ HighCmd : 发送
|
||||
UnitreeController ||--o{ HighState : 接收
|
||||
UnitreeController ||--o{ IMU : 接收
|
||||
UnitreeController ||--o{ MotorState : 接收
|
||||
|
||||
YOLODetector ||--o{ TargetClassifier : 使用
|
||||
SLAMProcessor ||--o{ PathPlanner : 提供地图
|
||||
DataFusion ||--o{ YOLODetector : 融合数据
|
||||
DataFusion ||--o{ SLAMProcessor : 融合数据
|
||||
|
||||
MissionController ||--o{ TaskScheduler : 使用
|
||||
MissionController ||--o{ CoordinationController : 使用
|
||||
TaskScheduler ||--o{ UnitreeController : 调度
|
||||
TaskScheduler ||--o{ CommunicationManager : 调度
|
||||
|
||||
CommunicationManager ||--o{ NetworkProtocol : 使用
|
||||
CommunicationManager ||--o{ DataTransmission : 使用
|
||||
|
||||
SystemLogger ||--o{ MainWindow : 记录
|
||||
ConfigManager ||--o{ MainWindow : 配置
|
||||
|
||||
@enduml
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -0,0 +1 @@
|
||||
|
@ -0,0 +1,153 @@
|
||||
#ifndef TESTCONFIG_H
|
||||
#define TESTCONFIG_H
|
||||
|
||||
#include <QString>
|
||||
#include <QDir>
|
||||
#include <QStandardPaths>
|
||||
|
||||
// 测试配置常量
|
||||
namespace TestConfig {
|
||||
// 测试数据库配置
|
||||
const QString TEST_DB_HOST = "localhost";
|
||||
const int TEST_DB_PORT = 3306;
|
||||
const QString TEST_DB_NAME = "test_battlefield_exploration";
|
||||
const QString TEST_DB_USER = "test_user";
|
||||
const QString TEST_DB_PASSWORD = "test_password";
|
||||
|
||||
// 测试文件路径
|
||||
const QString TEST_DATA_DIR = QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/battlefield_test_data";
|
||||
const QString TEST_IMAGES_DIR = TEST_DATA_DIR + "/images";
|
||||
const QString TEST_VIDEOS_DIR = TEST_DATA_DIR + "/videos";
|
||||
const QString TEST_MAPS_DIR = TEST_DATA_DIR + "/maps";
|
||||
const QString TEST_LOGS_DIR = TEST_DATA_DIR + "/logs";
|
||||
|
||||
// 测试图像配置
|
||||
const int TEST_IMAGE_WIDTH = 640;
|
||||
const int TEST_IMAGE_HEIGHT = 480;
|
||||
const QString TEST_IMAGE_FORMAT = "PNG";
|
||||
|
||||
// 测试视频配置
|
||||
const int TEST_VIDEO_FPS = 30;
|
||||
const int TEST_VIDEO_DURATION = 10; // 秒
|
||||
|
||||
// 测试地图配置
|
||||
const double TEST_MAP_WIDTH = 100.0; // 米
|
||||
const double TEST_MAP_HEIGHT = 100.0; // 米
|
||||
const double TEST_MAP_RESOLUTION = 0.1; // 米/像素
|
||||
|
||||
// 测试设备配置
|
||||
const QString TEST_DRONE_ID = "TEST_DRONE_001";
|
||||
const QString TEST_DOG_ID = "TEST_DOG_001";
|
||||
const QString TEST_SENSOR_ID = "TEST_SENSOR_001";
|
||||
|
||||
// 测试目标配置
|
||||
const QString TEST_ENEMY_ID = "TEST_ENEMY_001";
|
||||
const QString TEST_TARGET_TYPE = "TANK";
|
||||
const double TEST_THREAT_LEVEL = 8.0;
|
||||
const double TEST_CONFIDENCE = 0.95;
|
||||
|
||||
// 测试位置配置
|
||||
const double TEST_START_X = 0.0;
|
||||
const double TEST_START_Y = 0.0;
|
||||
const double TEST_START_Z = 0.0;
|
||||
const double TEST_END_X = 50.0;
|
||||
const double TEST_END_Y = 50.0;
|
||||
const double TEST_END_Z = 0.0;
|
||||
|
||||
// 测试时间配置
|
||||
const int TEST_TIMEOUT_MS = 5000;
|
||||
const int TEST_INTERVAL_MS = 100;
|
||||
const int TEST_DURATION_MS = 10000;
|
||||
|
||||
// 测试性能阈值
|
||||
const double MAX_DETECTION_LATENCY_MS = 100.0;
|
||||
const double MAX_NAVIGATION_ERROR_M = 0.5;
|
||||
const double MAX_FUSION_ERROR = 0.1;
|
||||
const double MIN_DETECTION_ACCURACY = 0.8;
|
||||
|
||||
// 测试网络配置
|
||||
const QString TEST_SERVER_HOST = "127.0.0.1";
|
||||
const int TEST_SERVER_PORT = 8080;
|
||||
const int TEST_CLIENT_PORT = 8081;
|
||||
|
||||
// 测试加密配置
|
||||
const QString TEST_ENCRYPTION_KEY = "test_encryption_key_12345";
|
||||
const QString TEST_IV = "test_iv_12345678";
|
||||
|
||||
// 测试日志配置
|
||||
const QString TEST_LOG_LEVEL = "DEBUG";
|
||||
const bool TEST_LOG_TO_FILE = true;
|
||||
const bool TEST_LOG_TO_CONSOLE = true;
|
||||
|
||||
// 测试模式配置
|
||||
const bool TEST_SIMULATION_MODE = true;
|
||||
const bool TEST_REAL_DEVICE_MODE = false;
|
||||
const bool TEST_DEBUG_MODE = true;
|
||||
|
||||
// 测试数据生成配置
|
||||
const int NUM_TEST_IMAGES = 100;
|
||||
const int NUM_TEST_TARGETS = 50;
|
||||
const int NUM_TEST_WAYPOINTS = 20;
|
||||
const int NUM_TEST_OBSTACLES = 10;
|
||||
|
||||
// 测试场景配置
|
||||
enum TestScenario {
|
||||
SCENARIO_URBAN_COMBAT,
|
||||
SCENARIO_OPEN_FIELD,
|
||||
SCENARIO_FOREST,
|
||||
SCENARIO_UNDERGROUND,
|
||||
SCENARIO_MIXED_ENVIRONMENT
|
||||
};
|
||||
|
||||
// 测试环境配置
|
||||
enum TestEnvironment {
|
||||
ENV_DAYLIGHT,
|
||||
ENV_NIGHT,
|
||||
ENV_RAIN,
|
||||
ENV_FOG,
|
||||
ENV_DUST
|
||||
};
|
||||
|
||||
// 测试难度配置
|
||||
enum TestDifficulty {
|
||||
DIFFICULTY_EASY,
|
||||
DIFFICULTY_MEDIUM,
|
||||
DIFFICULTY_HARD,
|
||||
DIFFICULTY_EXTREME
|
||||
};
|
||||
}
|
||||
|
||||
// 测试工具函数
|
||||
namespace TestUtils {
|
||||
// 创建测试目录
|
||||
bool createTestDirectories();
|
||||
|
||||
// 清理测试数据
|
||||
void cleanupTestData();
|
||||
|
||||
// 生成测试图像
|
||||
QString generateTestImage(const QString& filename, int width = TestConfig::TEST_IMAGE_WIDTH, int height = TestConfig::TEST_IMAGE_HEIGHT);
|
||||
|
||||
// 生成测试视频
|
||||
QString generateTestVideo(const QString& filename, int duration = TestConfig::TEST_VIDEO_DURATION);
|
||||
|
||||
// 生成测试地图
|
||||
QString generateTestMap(const QString& filename);
|
||||
|
||||
// 生成测试传感器数据
|
||||
QByteArray generateTestSensorData();
|
||||
|
||||
// 生成测试目标数据
|
||||
QByteArray generateTestTargetData();
|
||||
|
||||
// 验证测试结果
|
||||
bool verifyTestResult(const QString& testName, bool result, const QString& message = "");
|
||||
|
||||
// 记录测试日志
|
||||
void logTestResult(const QString& testName, bool passed, const QString& details = "");
|
||||
|
||||
// 计算测试统计
|
||||
void calculateTestStatistics();
|
||||
}
|
||||
|
||||
#endif // TESTCONFIG_H
|
@ -0,0 +1,105 @@
|
||||
#ifndef TESTDATAFUSION_H
|
||||
#define TESTDATAFUSION_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QTest>
|
||||
#include <QDebug>
|
||||
#include <QVector3D>
|
||||
#include <QMatrix4x4>
|
||||
#include <QElapsedTimer>
|
||||
#include <QThread>
|
||||
|
||||
// 包含被测试的类
|
||||
#include "../include/core/DataFusion.h"
|
||||
#include "../include/core/SensorFusion.h"
|
||||
#include "../include/core/KalmanFilter.h"
|
||||
|
||||
class TestDataFusion : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
// 初始化测试环境
|
||||
void initTestCase();
|
||||
void init();
|
||||
void cleanup();
|
||||
void cleanupTestCase();
|
||||
|
||||
// 数据融合初始化测试
|
||||
void testDataFusionInitialization();
|
||||
void testSensorRegistration();
|
||||
void testCoordinateTransformation();
|
||||
void testFusionAlgorithmSetup();
|
||||
|
||||
// 多源数据融合测试
|
||||
void testMultiSensorFusion();
|
||||
void testTemporalFusion();
|
||||
void testSpatialFusion();
|
||||
void testFeatureFusion();
|
||||
|
||||
// 传感器数据融合测试
|
||||
void testLidarCameraFusion();
|
||||
void testIMUGPSFusion();
|
||||
void testRadarLidarFusion();
|
||||
void testOpticalInfraredFusion();
|
||||
|
||||
// 目标跟踪融合测试
|
||||
void testTargetTrackingFusion();
|
||||
void testMultiTargetTracking();
|
||||
void testTrackAssociation();
|
||||
void testTrackPrediction();
|
||||
|
||||
// 地图融合测试
|
||||
void testMapFusion();
|
||||
void testOccupancyGridFusion();
|
||||
void testFeatureMapFusion();
|
||||
void testSemanticMapFusion();
|
||||
|
||||
// 态势感知融合测试
|
||||
void testSituationalAwareness();
|
||||
void testThreatAssessment();
|
||||
void testRiskEvaluation();
|
||||
void testDecisionSupport();
|
||||
|
||||
// 数据质量测试
|
||||
void testDataQualityAssessment();
|
||||
void testOutlierDetection();
|
||||
void testNoiseFiltering();
|
||||
void testDataValidation();
|
||||
|
||||
// 性能测试
|
||||
void testFusionSpeed();
|
||||
void testMemoryUsage();
|
||||
void testRealTimePerformance();
|
||||
void testScalability();
|
||||
|
||||
// 鲁棒性测试
|
||||
void testSensorFailureHandling();
|
||||
void testDataLossHandling();
|
||||
void testInconsistentDataHandling();
|
||||
void testDynamicSensorConfiguration();
|
||||
|
||||
private:
|
||||
DataFusion* m_dataFusion;
|
||||
SensorFusion* m_sensorFusion;
|
||||
KalmanFilter* m_kalmanFilter;
|
||||
|
||||
// 测试数据
|
||||
QList<SensorData> m_testSensorData;
|
||||
QList<TargetData> m_testTargetData;
|
||||
QList<MapData> m_testMapData;
|
||||
|
||||
// 测试数据准备
|
||||
void prepareTestSensorData();
|
||||
void prepareTestTargetData();
|
||||
void prepareTestMapData();
|
||||
void cleanupTestData();
|
||||
|
||||
// 测试辅助函数
|
||||
bool verifyFusionResult(const FusionResult& result);
|
||||
double calculateFusionAccuracy(const QList<FusionResult>& results);
|
||||
bool verifyDataConsistency(const QList<SensorData>& data);
|
||||
void simulateFusionScenario(const QString& scenario);
|
||||
};
|
||||
|
||||
#endif // TESTDATAFUSION_H
|
@ -0,0 +1,69 @@
|
||||
#ifndef TESTDATABASEMANAGER_H
|
||||
#define TESTDATABASEMANAGER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QTest>
|
||||
#include <QDebug>
|
||||
#include <QSqlDatabase>
|
||||
#include <QSqlQuery>
|
||||
#include <QSqlError>
|
||||
#include <QVariant>
|
||||
#include <QDateTime>
|
||||
|
||||
// 包含被测试的类
|
||||
#include "../include/core/database/DatabaseManager.h"
|
||||
#include "../include/core/database/EnemyDatabase.h"
|
||||
#include "../include/core/database/DogDatabase.h"
|
||||
#include "../include/core/database/UAVDatabase.h"
|
||||
|
||||
class TestDatabaseManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
// 初始化测试环境
|
||||
void initTestCase();
|
||||
void init();
|
||||
void cleanup();
|
||||
void cleanupTestCase();
|
||||
|
||||
// 数据库连接测试
|
||||
void testDatabaseConnection();
|
||||
void testDatabaseCreation();
|
||||
void testDatabaseConfig();
|
||||
|
||||
// 敌方数据库测试
|
||||
void testEnemyDatabaseOperations();
|
||||
void testEnemyDataInsertion();
|
||||
void testEnemyDataQuery();
|
||||
void testEnemyDataUpdate();
|
||||
void testEnemyDataDeletion();
|
||||
|
||||
// 机器狗数据库测试
|
||||
void testDogDatabaseOperations();
|
||||
void testDogStatusUpdate();
|
||||
void testDogLocationTracking();
|
||||
|
||||
// 无人机数据库测试
|
||||
void testUAVDatabaseOperations();
|
||||
void testUAVStatusUpdate();
|
||||
void testUAVFlightData();
|
||||
|
||||
// 数据库性能测试
|
||||
void testDatabasePerformance();
|
||||
void testConcurrentAccess();
|
||||
void testDataIntegrity();
|
||||
|
||||
private:
|
||||
DatabaseManager* m_dbManager;
|
||||
EnemyDatabase* m_enemyDb;
|
||||
DogDatabase* m_dogDb;
|
||||
UAVDatabase* m_uavDb;
|
||||
|
||||
// 测试数据
|
||||
void createTestData();
|
||||
void cleanupTestData();
|
||||
bool verifyTestData();
|
||||
};
|
||||
|
||||
#endif // TESTDATABASEMANAGER_H
|
@ -0,0 +1,76 @@
|
||||
#ifndef TESTDEVICECONTROL_H
|
||||
#define TESTDEVICECONTROL_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QTest>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
#include <QSignalSpy>
|
||||
#include <QThread>
|
||||
|
||||
// 包含被测试的类
|
||||
#include "../include/ui/dialogs/RobotDogControlDialog.h"
|
||||
#include "../include/ui/dialogs/DroneControlDialog.h"
|
||||
#include "../include/ui/components/DeviceListPanel.h"
|
||||
|
||||
class TestDeviceControl : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
// 初始化测试环境
|
||||
void initTestCase();
|
||||
void init();
|
||||
void cleanup();
|
||||
void cleanupTestCase();
|
||||
|
||||
// 机器狗控制测试
|
||||
void testRobotDogInitialization();
|
||||
void testRobotDogMovement();
|
||||
void testRobotDogNavigation();
|
||||
void testRobotDogStatusMonitoring();
|
||||
void testRobotDogEmergencyStop();
|
||||
|
||||
// 无人机控制测试
|
||||
void testDroneInitialization();
|
||||
void testDroneTakeoff();
|
||||
void testDroneFlight();
|
||||
void testDroneLanding();
|
||||
void testDroneStatusMonitoring();
|
||||
void testDroneEmergencyLanding();
|
||||
|
||||
// 设备列表管理测试
|
||||
void testDeviceListManagement();
|
||||
void testDeviceConnection();
|
||||
void testDeviceDisconnection();
|
||||
void testDeviceStatusUpdate();
|
||||
|
||||
// 协同控制测试
|
||||
void testCoordinatedMovement();
|
||||
void testFormationControl();
|
||||
void testTaskAllocation();
|
||||
void testConflictResolution();
|
||||
|
||||
// 通信测试
|
||||
void testDeviceCommunication();
|
||||
void testCommandTransmission();
|
||||
void testStatusFeedback();
|
||||
void testErrorHandling();
|
||||
|
||||
// 性能测试
|
||||
void testControlLatency();
|
||||
void testResponseTime();
|
||||
void testConcurrentControl();
|
||||
|
||||
private:
|
||||
RobotDogControlDialog* m_robotDogDialog;
|
||||
DroneControlDialog* m_droneDialog;
|
||||
DeviceListPanel* m_deviceListPanel;
|
||||
|
||||
// 模拟设备状态
|
||||
void simulateDeviceStatus();
|
||||
void simulateCommunicationDelay();
|
||||
bool verifyDeviceResponse();
|
||||
};
|
||||
|
||||
#endif // TESTDEVICECONTROL_H
|
@ -0,0 +1,69 @@
|
||||
#include <QApplication>
|
||||
#include <QTest>
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QStandardPaths>
|
||||
|
||||
// 测试模块头文件
|
||||
#include "TestDatabaseManager.h"
|
||||
#include "TestDeviceControl.h"
|
||||
#include "TestYOLODetector.h"
|
||||
#include "TestSLAMProcessor.h"
|
||||
#include "TestDataFusion.h"
|
||||
#include "TestCommunication.h"
|
||||
#include "TestMissionController.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
|
||||
qDebug() << "=== 基于空地协同的战场环境探索系统 - 测试套件 ===";
|
||||
qDebug() << "开始执行测试...";
|
||||
|
||||
int testResult = 0;
|
||||
|
||||
// 1. 数据库管理测试
|
||||
qDebug() << "\n--- 执行数据库管理测试 ---";
|
||||
TestDatabaseManager dbTest;
|
||||
testResult += QTest::qExec(&dbTest, argc, argv);
|
||||
|
||||
// 2. 设备控制测试
|
||||
qDebug() << "\n--- 执行设备控制测试 ---";
|
||||
TestDeviceControl deviceTest;
|
||||
testResult += QTest::qExec(&deviceTest, argc, argv);
|
||||
|
||||
// 3. YOLO检测器测试
|
||||
qDebug() << "\n--- 执行YOLO检测器测试 ---";
|
||||
TestYOLODetector yoloTest;
|
||||
testResult += QTest::qExec(&yoloTest, argc, argv);
|
||||
|
||||
// 4. SLAM处理器测试
|
||||
qDebug() << "\n--- 执行SLAM处理器测试 ---";
|
||||
TestSLAMProcessor slamTest;
|
||||
testResult += QTest::qExec(&slamTest, argc, argv);
|
||||
|
||||
// 5. 数据融合测试
|
||||
qDebug() << "\n--- 执行数据融合测试 ---";
|
||||
TestDataFusion fusionTest;
|
||||
testResult += QTest::qExec(&fusionTest, argc, argv);
|
||||
|
||||
// 6. 通信模块测试
|
||||
qDebug() << "\n--- 执行通信模块测试 ---";
|
||||
TestCommunication commTest;
|
||||
testResult += QTest::qExec(&commTest, argc, argv);
|
||||
|
||||
// 7. 任务控制器测试
|
||||
qDebug() << "\n--- 执行任务控制器测试 ---";
|
||||
TestMissionController missionTest;
|
||||
testResult += QTest::qExec(&missionTest, argc, argv);
|
||||
|
||||
// 测试结果汇总
|
||||
qDebug() << "\n=== 测试结果汇总 ===";
|
||||
if (testResult == 0) {
|
||||
qDebug() << "✅ 所有测试通过!";
|
||||
} else {
|
||||
qDebug() << "❌ 有" << testResult << "个测试失败";
|
||||
}
|
||||
|
||||
return testResult;
|
||||
}
|
@ -0,0 +1,96 @@
|
||||
#ifndef TESTMISSIONCONTROLLER_H
|
||||
#define TESTMISSIONCONTROLLER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QTest>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
#include <QSignalSpy>
|
||||
#include <QThread>
|
||||
|
||||
// 包含被测试的类
|
||||
#include "../include/core/MissionController.h"
|
||||
#include "../include/core/TaskScheduler.h"
|
||||
#include "../include/core/CoordinationController.h"
|
||||
|
||||
class TestMissionController : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
// 初始化测试环境
|
||||
void initTestCase();
|
||||
void init();
|
||||
void cleanup();
|
||||
void cleanupTestCase();
|
||||
|
||||
// 任务管理测试
|
||||
void testMissionCreation();
|
||||
void testMissionPlanning();
|
||||
void testMissionExecution();
|
||||
void testMissionMonitoring();
|
||||
|
||||
// 任务调度测试
|
||||
void testTaskScheduling();
|
||||
void testTaskAllocation();
|
||||
void testTaskPrioritization();
|
||||
void testTaskDependencies();
|
||||
|
||||
// 协同控制测试
|
||||
void testCoordinatedControl();
|
||||
void testFormationControl();
|
||||
void testConflictResolution();
|
||||
void testResourceSharing();
|
||||
|
||||
// 任务执行测试
|
||||
void testExplorationMission();
|
||||
void testSurveillanceMission();
|
||||
void testReconnaissanceMission();
|
||||
void testIntelligenceGatheringMission();
|
||||
|
||||
// 状态管理测试
|
||||
void testMissionStateManagement();
|
||||
void testDeviceStateTracking();
|
||||
void testSystemHealthMonitoring();
|
||||
void testPerformanceMetrics();
|
||||
|
||||
// 异常处理测试
|
||||
void testMissionAbort();
|
||||
void testDeviceFailureHandling();
|
||||
void testEmergencyResponse();
|
||||
void testRecoveryProcedures();
|
||||
|
||||
// 性能测试
|
||||
void testMissionExecutionSpeed();
|
||||
void testResourceUtilization();
|
||||
void testConcurrentMissions();
|
||||
void testScalability();
|
||||
|
||||
// 集成测试
|
||||
void testEndToEndMission();
|
||||
void testMultiDeviceIntegration();
|
||||
void testSystemIntegration();
|
||||
void testUserInterfaceIntegration();
|
||||
|
||||
private:
|
||||
MissionController* m_missionController;
|
||||
TaskScheduler* m_taskScheduler;
|
||||
CoordinationController* m_coordinationController;
|
||||
|
||||
// 测试数据
|
||||
QList<Mission> m_testMissions;
|
||||
QList<Task> m_testTasks;
|
||||
|
||||
// 测试数据准备
|
||||
void prepareTestMissions();
|
||||
void prepareTestTasks();
|
||||
void cleanupTestData();
|
||||
|
||||
// 测试辅助函数
|
||||
bool verifyMissionExecution(const Mission& mission);
|
||||
double calculateMissionSuccessRate(const QList<Mission>& missions);
|
||||
bool verifyTaskCompletion(const Task& task);
|
||||
void simulateMissionScenario(const QString& scenario);
|
||||
};
|
||||
|
||||
#endif // TESTMISSIONCONTROLLER_H
|
@ -0,0 +1,105 @@
|
||||
#ifndef TESTSLAMPROCESSOR_H
|
||||
#define TESTSLAMPROCESSOR_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QTest>
|
||||
#include <QDebug>
|
||||
#include <QVector3D>
|
||||
#include <QMatrix4x4>
|
||||
#include <QElapsedTimer>
|
||||
#include <QThread>
|
||||
|
||||
// 包含被测试的类
|
||||
#include "../include/core/SLAMProcessor.h"
|
||||
#include "../include/core/PathPlanner.h"
|
||||
#include "../include/core/MapBuilder.h"
|
||||
|
||||
class TestSLAMProcessor : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
// 初始化测试环境
|
||||
void initTestCase();
|
||||
void init();
|
||||
void cleanup();
|
||||
void cleanupTestCase();
|
||||
|
||||
// SLAM初始化测试
|
||||
void testSLAMInitialization();
|
||||
void testSensorCalibration();
|
||||
void testCoordinateSystemSetup();
|
||||
void testParameterConfiguration();
|
||||
|
||||
// 传感器数据处理测试
|
||||
void testLidarDataProcessing();
|
||||
void testIMUDataProcessing();
|
||||
void testCameraDataProcessing();
|
||||
void testMultiSensorFusion();
|
||||
|
||||
// 定位测试
|
||||
void testLocalization();
|
||||
void testPoseEstimation();
|
||||
void testPositionTracking();
|
||||
void testOrientationEstimation();
|
||||
|
||||
// 建图测试
|
||||
void testMapBuilding();
|
||||
void testOccupancyGridGeneration();
|
||||
void testFeatureExtraction();
|
||||
void testLoopClosureDetection();
|
||||
|
||||
// 路径规划测试
|
||||
void testPathPlanning();
|
||||
void testObstacleAvoidance();
|
||||
void testGlobalPathPlanning();
|
||||
void testLocalPathPlanning();
|
||||
|
||||
// 导航测试
|
||||
void testNavigation();
|
||||
void testWaypointFollowing();
|
||||
void testDynamicObstacleAvoidance();
|
||||
void testNavigationAccuracy();
|
||||
|
||||
// 地图管理测试
|
||||
void testMapLoading();
|
||||
void testMapSaving();
|
||||
void testMapUpdating();
|
||||
void testMapOptimization();
|
||||
|
||||
// 性能测试
|
||||
void testProcessingSpeed();
|
||||
void testMemoryEfficiency();
|
||||
void testRealTimePerformance();
|
||||
void testScalability();
|
||||
|
||||
// 鲁棒性测试
|
||||
void testSensorFailureHandling();
|
||||
void testNoiseRobustness();
|
||||
void testDynamicEnvironment();
|
||||
void testLongTermOperation();
|
||||
|
||||
private:
|
||||
SLAMProcessor* m_slamProcessor;
|
||||
PathPlanner* m_pathPlanner;
|
||||
MapBuilder* m_mapBuilder;
|
||||
|
||||
// 测试数据
|
||||
QList<SensorData> m_testSensorData;
|
||||
QList<QVector3D> m_testTrajectory;
|
||||
QList<Obstacle> m_testObstacles;
|
||||
|
||||
// 测试数据准备
|
||||
void prepareTestSensorData();
|
||||
void generateSyntheticTrajectory();
|
||||
void createTestEnvironment();
|
||||
void cleanupTestData();
|
||||
|
||||
// 测试辅助函数
|
||||
bool verifyPoseEstimation(const Pose& estimated, const Pose& groundTruth);
|
||||
double calculateLocalizationAccuracy(const QList<Pose>& estimated, const QList<Pose>& groundTruth);
|
||||
bool verifyPathFeasibility(const QList<QVector3D>& path);
|
||||
void simulateNavigationScenario(const QString& scenario);
|
||||
};
|
||||
|
||||
#endif // TESTSLAMPROCESSOR_H
|
@ -0,0 +1,95 @@
|
||||
#ifndef TESTYOLODETECTOR_H
|
||||
#define TESTYOLODETECTOR_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QTest>
|
||||
#include <QDebug>
|
||||
#include <QImage>
|
||||
#include <QPixmap>
|
||||
#include <QDir>
|
||||
#include <QFileInfo>
|
||||
#include <QElapsedTimer>
|
||||
|
||||
// 包含被测试的类
|
||||
#include "../include/core/YOLODetector.h"
|
||||
#include "../include/core/TargetClassifier.h"
|
||||
|
||||
class TestYOLODetector : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
// 初始化测试环境
|
||||
void initTestCase();
|
||||
void init();
|
||||
void cleanup();
|
||||
void cleanupTestCase();
|
||||
|
||||
// 模型加载测试
|
||||
void testModelLoading();
|
||||
void testModelValidation();
|
||||
void testModelPerformance();
|
||||
|
||||
// 目标检测测试
|
||||
void testObjectDetection();
|
||||
void testTargetClassification();
|
||||
void testConfidenceScoring();
|
||||
void testBoundingBoxAccuracy();
|
||||
|
||||
// 图像处理测试
|
||||
void testImagePreprocessing();
|
||||
void testImageResizing();
|
||||
void testImageNormalization();
|
||||
void testBatchProcessing();
|
||||
|
||||
// 特定目标检测测试
|
||||
void testMilitaryVehicleDetection();
|
||||
void testPersonDetection();
|
||||
void testWeaponDetection();
|
||||
void testBuildingDetection();
|
||||
|
||||
// 实时检测测试
|
||||
void testRealTimeDetection();
|
||||
void testVideoStreamProcessing();
|
||||
void testDetectionLatency();
|
||||
void testDetectionAccuracy();
|
||||
|
||||
// 多目标检测测试
|
||||
void testMultipleObjectDetection();
|
||||
void testObjectTracking();
|
||||
void testOcclusionHandling();
|
||||
void testSmallObjectDetection();
|
||||
|
||||
// 环境适应性测试
|
||||
void testLightingConditions();
|
||||
void testWeatherConditions();
|
||||
void testDistanceVariation();
|
||||
void testAngleVariation();
|
||||
|
||||
// 性能优化测试
|
||||
void testDetectionSpeed();
|
||||
void testMemoryUsage();
|
||||
void testGPUAcceleration();
|
||||
void testModelOptimization();
|
||||
|
||||
private:
|
||||
YOLODetector* m_yoloDetector;
|
||||
TargetClassifier* m_targetClassifier;
|
||||
|
||||
// 测试图像
|
||||
QList<QImage> m_testImages;
|
||||
QList<QString> m_testImagePaths;
|
||||
|
||||
// 测试数据准备
|
||||
void prepareTestImages();
|
||||
void createSyntheticTestImages();
|
||||
void loadRealTestImages();
|
||||
void cleanupTestImages();
|
||||
|
||||
// 测试辅助函数
|
||||
bool verifyDetectionResult(const DetectionResult& result);
|
||||
double calculateDetectionAccuracy(const QList<DetectionResult>& results);
|
||||
void simulateDetectionScenario(const QString& scenario);
|
||||
};
|
||||
|
||||
#endif // TESTYOLODETECTOR_H
|
@ -0,0 +1,212 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 基于空地协同的战场环境探索系统 - 测试运行脚本
|
||||
# 作者: 系统开发团队
|
||||
# 日期: 2024年
|
||||
|
||||
echo "=========================================="
|
||||
echo "基于空地协同的战场环境探索系统 - 测试套件"
|
||||
echo "=========================================="
|
||||
|
||||
# 设置环境变量
|
||||
export QT_QPA_PLATFORM=offscreen
|
||||
export QT_LOGGING_RULES="*.debug=true;qt.qpa.*=false"
|
||||
|
||||
# 测试配置
|
||||
TEST_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
BUILD_DIR="$TEST_DIR/../build"
|
||||
BIN_DIR="$BUILD_DIR/bin"
|
||||
LOG_DIR="$TEST_DIR/logs"
|
||||
REPORT_DIR="$TEST_DIR/reports"
|
||||
|
||||
# 创建必要的目录
|
||||
mkdir -p "$LOG_DIR"
|
||||
mkdir -p "$REPORT_DIR"
|
||||
|
||||
# 测试时间戳
|
||||
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
||||
LOG_FILE="$LOG_DIR/test_run_$TIMESTAMP.log"
|
||||
REPORT_FILE="$REPORT_DIR/test_report_$TIMESTAMP.html"
|
||||
|
||||
echo "测试开始时间: $(date)"
|
||||
echo "日志文件: $LOG_FILE"
|
||||
echo "报告文件: $REPORT_FILE"
|
||||
echo ""
|
||||
|
||||
# 检查构建目录
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo "❌ 错误: 构建目录不存在,请先编译项目"
|
||||
echo "运行: cd $BUILD_DIR && make"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查可执行文件
|
||||
TEST_EXECUTABLE="$BIN_DIR/TestMain"
|
||||
if [ ! -f "$TEST_EXECUTABLE" ]; then
|
||||
echo "❌ 错误: 测试可执行文件不存在: $TEST_EXECUTABLE"
|
||||
echo "请先编译测试程序"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 函数:运行单个测试模块
|
||||
run_test_module() {
|
||||
local module_name="$1"
|
||||
local test_args="$2"
|
||||
|
||||
echo "🧪 运行 $module_name 测试..."
|
||||
echo "----------------------------------------"
|
||||
|
||||
# 运行测试并捕获输出
|
||||
if [ -n "$test_args" ]; then
|
||||
"$TEST_EXECUTABLE" $test_args 2>&1 | tee -a "$LOG_FILE"
|
||||
else
|
||||
"$TEST_EXECUTABLE" 2>&1 | tee -a "$LOG_FILE"
|
||||
fi
|
||||
|
||||
local exit_code=${PIPESTATUS[0]}
|
||||
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
echo "✅ $module_name 测试通过"
|
||||
return 0
|
||||
else
|
||||
echo "❌ $module_name 测试失败 (退出码: $exit_code)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 函数:生成测试报告
|
||||
generate_test_report() {
|
||||
echo "📊 生成测试报告..."
|
||||
|
||||
cat > "$REPORT_FILE" << EOF
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>战场环境探索系统 - 测试报告</title>
|
||||
<meta charset="UTF-8">
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; margin: 20px; }
|
||||
.header { background-color: #f0f0f0; padding: 20px; border-radius: 5px; }
|
||||
.summary { margin: 20px 0; }
|
||||
.test-module { margin: 10px 0; padding: 10px; border: 1px solid #ddd; border-radius: 3px; }
|
||||
.passed { background-color: #d4edda; border-color: #c3e6cb; }
|
||||
.failed { background-color: #f8d7da; border-color: #f5c6cb; }
|
||||
.log { background-color: #f8f9fa; padding: 10px; border-radius: 3px; font-family: monospace; font-size: 12px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>基于空地协同的战场环境探索系统 - 测试报告</h1>
|
||||
<p>生成时间: $(date)</p>
|
||||
<p>测试环境: $(uname -a)</p>
|
||||
</div>
|
||||
|
||||
<div class="summary">
|
||||
<h2>测试摘要</h2>
|
||||
<p>总测试模块: 7</p>
|
||||
<p>通过模块: $PASSED_COUNT</p>
|
||||
<p>失败模块: $FAILED_COUNT</p>
|
||||
<p>成功率: $((PASSED_COUNT * 100 / (PASSED_COUNT + FAILED_COUNT)))%</p>
|
||||
</div>
|
||||
|
||||
<div class="test-modules">
|
||||
<h2>测试模块详情</h2>
|
||||
$(cat "$LOG_DIR/test_results_$TIMESTAMP.txt" 2>/dev/null || echo "<p>无详细结果</p>")
|
||||
</div>
|
||||
|
||||
<div class="log">
|
||||
<h2>测试日志</h2>
|
||||
<pre>$(tail -n 100 "$LOG_FILE" 2>/dev/null || echo "无日志数据")</pre>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
|
||||
echo "📄 测试报告已生成: $REPORT_FILE"
|
||||
}
|
||||
|
||||
# 主测试流程
|
||||
echo "🚀 开始执行测试套件..."
|
||||
echo ""
|
||||
|
||||
# 初始化计数器
|
||||
PASSED_COUNT=0
|
||||
FAILED_COUNT=0
|
||||
|
||||
# 1. 数据库管理测试
|
||||
if run_test_module "数据库管理" "--database"; then
|
||||
((PASSED_COUNT++))
|
||||
else
|
||||
((FAILED_COUNT++))
|
||||
fi
|
||||
|
||||
# 2. 设备控制测试
|
||||
if run_test_module "设备控制" "--device"; then
|
||||
((PASSED_COUNT++))
|
||||
else
|
||||
((FAILED_COUNT++))
|
||||
fi
|
||||
|
||||
# 3. YOLO检测器测试
|
||||
if run_test_module "YOLO检测器" "--yolo"; then
|
||||
((PASSED_COUNT++))
|
||||
else
|
||||
((FAILED_COUNT++))
|
||||
fi
|
||||
|
||||
# 4. SLAM处理器测试
|
||||
if run_test_module "SLAM处理器" "--slam"; then
|
||||
((PASSED_COUNT++))
|
||||
else
|
||||
((FAILED_COUNT++))
|
||||
fi
|
||||
|
||||
# 5. 数据融合测试
|
||||
if run_test_module "数据融合" "--fusion"; then
|
||||
((PASSED_COUNT++))
|
||||
else
|
||||
((FAILED_COUNT++))
|
||||
fi
|
||||
|
||||
# 6. 通信模块测试
|
||||
if run_test_module "通信模块" "--communication"; then
|
||||
((PASSED_COUNT++))
|
||||
else
|
||||
((FAILED_COUNT++))
|
||||
fi
|
||||
|
||||
# 7. 任务控制器测试
|
||||
if run_test_module "任务控制器" "--mission"; then
|
||||
((PASSED_COUNT++))
|
||||
else
|
||||
((FAILED_COUNT++))
|
||||
fi
|
||||
|
||||
# 测试结果汇总
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "测试结果汇总"
|
||||
echo "=========================================="
|
||||
echo "总测试模块: $((PASSED_COUNT + FAILED_COUNT))"
|
||||
echo "通过模块: $PASSED_COUNT"
|
||||
echo "失败模块: $FAILED_COUNT"
|
||||
echo "成功率: $((PASSED_COUNT * 100 / (PASSED_COUNT + FAILED_COUNT)))%"
|
||||
echo ""
|
||||
|
||||
# 生成测试报告
|
||||
generate_test_report
|
||||
|
||||
# 清理临时文件
|
||||
echo "🧹 清理临时文件..."
|
||||
rm -f "$LOG_DIR/test_results_$TIMESTAMP.txt" 2>/dev/null
|
||||
|
||||
# 最终结果
|
||||
if [ $FAILED_COUNT -eq 0 ]; then
|
||||
echo "🎉 所有测试通过!系统质量良好。"
|
||||
exit 0
|
||||
else
|
||||
echo "⚠️ 有 $FAILED_COUNT 个测试模块失败,请检查系统功能。"
|
||||
echo "详细日志请查看: $LOG_FILE"
|
||||
echo "测试报告请查看: $REPORT_FILE"
|
||||
exit 1
|
||||
fi
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue