124 lines
4.2 KiB
C
124 lines
4.2 KiB
C
|
#pragma once
|
|||
|
#include <string>
|
|||
|
#include <vector>
|
|||
|
#include <cstdint>
|
|||
|
#include <memory>
|
|||
|
|
|||
|
// 前向声明
|
|||
|
namespace unitree_lidar_sdk {
|
|||
|
class UnitreeLidarReader;
|
|||
|
}
|
|||
|
|
|||
|
struct ULPoint {
|
|||
|
float x, y, z, intensity;
|
|||
|
float timestamp; // 对应SDK中的time字段
|
|||
|
uint32_t ring; // 对应SDK中的ring字段
|
|||
|
};
|
|||
|
|
|||
|
// 裂缝信息结构体
|
|||
|
struct CrackInfo {
|
|||
|
float start_x, start_y, start_z; // 裂缝起点
|
|||
|
float end_x, end_y, end_z; // 裂缝终点
|
|||
|
float length; // 裂缝长度
|
|||
|
float depth; // 裂缝深度
|
|||
|
float width; // 裂缝宽度
|
|||
|
bool is_critical; // 是否为严重裂缝
|
|||
|
uint32_t point_count; // 相关点数
|
|||
|
};
|
|||
|
|
|||
|
// 遮挡物信息结构体
|
|||
|
struct OcclusionInfo {
|
|||
|
float center_x = 0.0f, center_y = 0.0f, center_z = 0.0f; // 遮挡物位置
|
|||
|
float distance = 0.0f; // 距离雷达的距离
|
|||
|
float size = 0.0f; // 遮挡物大小
|
|||
|
float width = 0.0f, height = 0.0f; // 遮挡物尺寸
|
|||
|
bool is_blocking = false; // 是否严重遮挡
|
|||
|
uint32_t point_count = 0; // 遮挡物点数
|
|||
|
};
|
|||
|
|
|||
|
// 预警级别枚举
|
|||
|
enum class AlertLevel {
|
|||
|
NORMAL = 0, // 正常
|
|||
|
WARNING = 1, // 警告
|
|||
|
CRITICAL = 2 // 严重
|
|||
|
};
|
|||
|
|
|||
|
// 检测结果结构体
|
|||
|
struct DetectionResult {
|
|||
|
std::vector<CrackInfo> cracks; // 检测到的裂缝
|
|||
|
std::vector<OcclusionInfo> occlusions; // 检测到的遮挡物
|
|||
|
AlertLevel alert_level = AlertLevel::NORMAL; // 当前预警级别
|
|||
|
std::string alert_message = ""; // 预警消息
|
|||
|
uint32_t total_points = 0; // 总点数
|
|||
|
float scan_coverage = 1.0f; // 扫描覆盖率
|
|||
|
|
|||
|
// 构造函数确保正确初始化
|
|||
|
DetectionResult()
|
|||
|
: alert_level(AlertLevel::NORMAL)
|
|||
|
, alert_message("")
|
|||
|
, total_points(0)
|
|||
|
, scan_coverage(1.0f)
|
|||
|
{}
|
|||
|
};
|
|||
|
|
|||
|
// 坡面分析器类
|
|||
|
class SlopeAnalyzer {
|
|||
|
private:
|
|||
|
struct Config {
|
|||
|
float crack_threshold = 100.0f; // 裂缝阈值100米
|
|||
|
float min_crack_length = 100.0f; // 最小裂缝长度100米
|
|||
|
float occlusion_threshold = 0.20f; // 遮挡阈值改为20厘米
|
|||
|
float alert_distance = 0.20f; // 预警距离20厘米
|
|||
|
float severe_alert_distance = 0.15f; // 严重预警距离15厘米
|
|||
|
float critical_distance = 0.05f; // 关键距离5厘米
|
|||
|
float scan_width = 16.0f; // 扫描宽度16米
|
|||
|
float height_diff_threshold = 0.1f; // 高度差阈值10厘米
|
|||
|
bool enable_voice_alert = true; // 启用语音预警
|
|||
|
int voice_repeat_count = 3; // 语音重复3次
|
|||
|
} config_;
|
|||
|
|
|||
|
// 历史数据用于趋势分析
|
|||
|
std::vector<DetectionResult> history_;
|
|||
|
static const size_t MAX_HISTORY = 10;
|
|||
|
|
|||
|
public:
|
|||
|
SlopeAnalyzer();
|
|||
|
|
|||
|
// 设置检测参数
|
|||
|
void setConfig(float crack_threshold, float min_crack_length,
|
|||
|
float occlusion_threshold, float alert_distance);
|
|||
|
|
|||
|
// 分析点云数据
|
|||
|
DetectionResult analyze(const std::vector<ULPoint>& points);
|
|||
|
|
|||
|
// 获取历史检测结果
|
|||
|
const std::vector<DetectionResult>& getHistory() const { return history_; }
|
|||
|
|
|||
|
private:
|
|||
|
// 检测裂缝
|
|||
|
std::vector<CrackInfo> detectCracks(const std::vector<ULPoint>& points);
|
|||
|
|
|||
|
// 检测遮挡物
|
|||
|
std::vector<OcclusionInfo> detectOcclusions(const std::vector<ULPoint>& points);
|
|||
|
|
|||
|
// 计算预警级别
|
|||
|
AlertLevel calculateAlertLevel(const std::vector<CrackInfo>& cracks,
|
|||
|
const std::vector<OcclusionInfo>& occlusions);
|
|||
|
|
|||
|
// 生成预警消息
|
|||
|
std::string generateAlertMessage(const DetectionResult& result);
|
|||
|
};
|
|||
|
|
|||
|
class UnitreeDriver {
|
|||
|
private:
|
|||
|
unitree_lidar_sdk::UnitreeLidarReader* lreader;
|
|||
|
|
|||
|
public:
|
|||
|
UnitreeDriver() : lreader(nullptr) {} // 构造函数初始化
|
|||
|
~UnitreeDriver() { close(); } // 析构函数确保资源释放
|
|||
|
|
|||
|
// 串口:/dev/ttyACM0 或 /dev/ttyUSB0;以太网可用 "udp://ip:port" 自己扩展
|
|||
|
bool open(const std::string& port, int baudrate);
|
|||
|
bool readFrame(std::vector<ULPoint>& out_points); // 读取一帧点云;返回false表示暂时无数据
|
|||
|
void close();
|
|||
|
};
|