# MulRadar **Repository Path**: wrdoct/mul-radar ## Basic Information - **Project Name**: MulRadar - **Description**: 多雷达数据融合 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-07 - **Last Updated**: 2025-05-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 多雷达数据融合系统 ## 简介 本项目实现了一个高级多雷达数据融合系统,专门设计用于实时处理和分析来自多个雷达源的数据。系统集成了数据实时接收及解析/模拟输入、多线程处理、时间对齐、空间同步、野值剔除、聚类分析、航迹起始、航迹关联、卡尔曼滤波和航迹质量管理等多项基础功能,还集成了目标识别和事件检测,同时具有视频处理功能,最后发送至上位机进行显示。 ## 功能列表 - **实时数据接收与处理**:系统能够实时接收并解析雷达数据(支持TCP/UDP传输)。 - **数据模拟输入**:模拟多雷达数据输入以进行系统测试。 - **多线程处理**:利用C++11多线程提高数据处理效率。 - **时间对齐与空间同步**:确保数据在时间和空间上的一致性。 - **野值剔除**:使用高斯滤波器去除数据中的异常值,提高数据质量。 - **DBSCAN聚类**:使用DBSCAN算法进行聚类分析,支持大小车目标识别。 - **逻辑法航迹起始**:基于逻辑规则确定航迹起始点。 - **矩形波门建立**:建立用于航迹关联的矩形波门。 - **航迹关联**:使用NNDA/PDA/JPDA进行航迹关联。 - **滤波更新**:利用KF/EKF/UKF对航迹进行状态估计和更新。 - **分数法航迹质量管理**:采用分数法进行航迹质量管理,确保航迹准确性。 - **事件检测**:支持停车、超速等事件的实时检测。 - **日志记录**:使用单例模式管理日志系统,便于问题追踪和性能监控。 - **配置管理**:通过配置文件动态调整系统参数,确保配置的全局唯一性。 - **可扩展性**:采用抽象工厂模式,便于扩展跟踪流程。 - **正常模式和调试模式切换**:通过添加编译时可选的宏定义,支持切换正常模式和调试模式。 ## 目录树 项目的文件结构如下: ```bash . ├── build.sh ├── cloud_point_data │ ├── amplitude_info1.log │ ├── amplitude_info.log │ ├── data1.log │ ├── data2.log │ ├── data3.log │ ├── data4.log │ ├── d.log │ ├── frameRadarData_192.168.2.12.txt │ ├── frameRadarData_192.168.2.13.txt │ ├── frameRadarData_192.168.2.14.txt │ └── genzongqian.log ├── CMakeLists.txt ├── config_file │ ├── config20240918.conf │ └── config.conf ├── generate_data │ ├── generate_data.c │ └── test_data.log ├── include │ ├── algorithms │ │ ├── dbscan.hpp │ │ ├── event_detection │ │ │ └── event_detection.hpp │ │ ├── ml │ │ │ └── ml_model.hpp │ │ └── tracker │ │ ├── data_association_strategy.hpp │ │ ├── filtering_update_strategy.hpp │ │ ├── gate_establishment_strategy.hpp │ │ ├── tracker.hpp │ │ └── tracking_system_factory.hpp │ ├── config │ │ └── config.hpp │ ├── data │ │ ├── data_receiver.hpp │ │ ├── radar_frame_data_struct.hpp │ │ ├── self_developed_radar │ │ │ ├── data_receiver_network.hpp │ │ │ ├── data_receiver_uart.hpp │ │ │ └── self_data_receiver.hpp │ │ └── server │ │ └── data_sender.hpp │ ├── log │ │ ├── logger_interface.hpp │ │ ├── logger_manager.hpp │ │ └── simple_logger.hpp │ ├── multimedia │ │ └── multimedia.hpp │ ├── protocol │ │ ├── radar_in_protocol.h │ │ ├── radar_out_protocol.h │ │ ├── radar_point_cloud_in_protocol.h │ │ └── radar_tracker_out_protocol.h │ ├── radar_point_cloud_data.hpp │ └── utils │ ├── callback_manager.hpp │ ├── id_pool.hpp │ ├── thread-pool-cpp │ │ └── include │ │ ├── thread_pool │ │ │ ├── fixed_function.hpp │ │ │ ├── mpmc_bounded_queue.hpp │ │ │ ├── thread_pool.hpp │ │ │ ├── thread_pool_options.hpp │ │ │ └── worker.hpp │ │ └── thread_pool.hpp │ └── thread_pool.hpp ├── lib ├── LICENSE ├── README.md ├── src │ ├── algorithms │ │ ├── dbscan.cpp │ │ ├── event_detection │ │ │ └── event_detection.cpp │ │ └── tracker │ │ ├── data_association_strategy.cpp │ │ ├── filtering_update_strategy.cpp │ │ ├── gate_establishment_strategy.cpp │ │ └── tracker.cpp │ ├── config │ │ └── config.cpp │ ├── data │ │ ├── data_receiver.cpp │ │ ├── self_developed_radar │ │ │ ├── data_receiver_network.cpp │ │ │ ├── data_receiver_uart.cpp │ │ │ └── self_data_receiver.cpp │ │ └── server │ │ └── data_sender.cpp │ ├── log │ │ └── logger_manager.cpp │ ├── main.cpp │ ├── multimedia │ │ └── multimedia.cpp │ └── radar_point_cloud_data.cpp └── test ├── AbstractFactoryMode.cpp ├── dbscan.cpp ├── divideIntoRegionals.cpp ├── draw_line ├── draw_line.c ├── EKF.cpp ├── iterative_closest_point.cpp ├── iterative_closest_point.hpp ├── kdtree.cpp ├── kdtree_n.cpp ├── main_offline.cpp ├── opencvTest12 ├── opencvTest12.cpp ├── opencvTest14 ├── opencvTest14.cpp ├── output_192.168.1.12.avi ├── point_cloud_parse.cpp ├── random_point_cloud.cpp ├── socket_client.cpp ├── socket_server.cpp ├── svm.cpp ├── test ├── test.hex ├── test_protocol.cpp ├── test_send_data.cpp ├── uartParseData ├── uartParseData.cpp ├── uartReceiveAndParseData.cpp ├── udpServerAndParseData ├── udpServerAndParseData.cpp ├── ukf.cpp ├── ukfTest.cpp └── v4l2Test.c ``` ## 技术栈 - **编程语言**:C++ - 提供强大的系统级编程能力,以及对底层硬件的精细控制。 - **并发编程**: - **C++11多线程**:利用C++11标准提供的线程库,实现高效的并发数据处理。 - **线程间通信**:使用线程安全的数据结构和同步机制,如条件变量、信号量等,实现线程间有效且安全的通信。 - **线程同步**:采用互斥锁(`std::mutex`)、锁_guard、unique_lock等同步工具,保护共享数据,避免竞争条件。 - **条件变量**:用于线程间的协调,可以在某些条件不满足时挂起线程,条件满足时唤醒线程。 - **线程池**:实现一个可扩展的线程池,管理和优化线程的生命周期和资源使用,提升系统性能。 - **线程安全容器**:如 `std::unordered_map`(哈希表)、`std::queue`(队列)等,用于多线程环境下的数据存储和管理。 - **回调函数**:使用函数作为数据传递的机制,允许在异步操作完成时执行特定的处理逻辑,增强了系统的响应性和模块间的解耦。 - **网络通信**: - **Socket套接字**:实现系统与外部设备或服务之间的实时数据交换,包括客户端和服务器端的实现。 - **TCP/IP协议栈**:确保数据传输的可靠性和顺序性。 - **epoll**:使用I/O复用技术Epoll机制优化服务端数据发送,提高并发处理能力,将雷达航迹数据发送至上位机。 - **设计模式**: - **单例模式**:确保日志和配置管理的全局唯一性和线程安全性。 - **抽象工厂模式**:用于灵活创建跟踪流程的各个组件,提高系统的可扩展性和可维护性。 - **数据结构**: - **标准模板库(STL)**:包括但不限于 `vector`、`list`、`map`、`unordered_map`、`set` 等,提供丰富的数据结构支持。 - **航迹跟踪ID池**:使用 `std::unordered_set` 集合实现航迹跟踪的ID管理,确保ID的唯一性和快速检索。 - **数学库**: - **Eigen3**:一个高级的C++库,提供线性代数、矩阵和向量运算等数学功能。 - **协议实现**: - **雷达点云接收协议**:使用命名空间 `radarPointCloudInProtocol` 进行定义和实现。 - **雷达航迹发送协议**:使用命名空间 `radarTrackerOutProtocol` 进行定义和实现。 ## 工作机制 本系统采用生产者-消费者设计模式,结合回调函数实现数据处理和发送的高效解耦。 ### 生产者线程(雷达数据接收与解析线程) - **职责**:负责实时接收来自四个雷达的数据,并进行解析和初步处理。 - **处理内容**: - 数据接收:实时获取雷达原始数据流。 - 数据解析:将原始数据转换为系统可处理的格式。 ### 综合数据处理线程 - **职责**:负责从四个雷达的数据队列中获取数据,执行包括时间对齐、空间同步在内的高级处理操作。 - **处理内容**: - 时间对齐:确保来自不同雷达的数据在时间维度上的一致性。 - 空间同步:确保数据在空间位置和坐标系上的一致性。 - 数据融合:整合来自不同雷达的数据,形成统一的数据流。 - 聚类分析:使用DBSCAN等算法对数据进行聚类,区分不同的目标。 - 航迹跟踪:利用逻辑法航迹起始,NNDA/PDA/JPDA和KF/EKF/UKF等技术进行航迹关联和状态估计。 - 事件检测:实时检测停车、超速等事件。 ### 消费者线程(数据发送线程) - **职责**:通过回调函数接收综合处理线程处理后的航迹数据,并执行数据发送。 - **处理内容**: - 数据发送:将处理后的航迹数据发送至其他系统或存储。 ### 回调函数 - **作用**:作为综合数据处理线程和数据发送线程之间的桥梁,实现数据的异步传输和处理。 - **工作流程**: - 综合处理线程完成包括时间对齐和空间同步在内的数据处理后,将数据和对应的回调函数放入回调管理器。 - 回调管理器触发回调函数,将数据传递给数据发送线程。 - 数据发送线程接收数据并执行发送操作。 ## 启动指南 ### 环境要求 - 操作系统:Linux/Unix - 编译器:支持 C++11 或更新版本的编译器 - 依赖库:Eigen3(线性代数库) ### 安装步骤 1. 克隆项目到本地机器 ```bash git clone https://gitee.com/wrdoct/mul-radar ``` 2. 进入项目目录 ```bash cd mul-radar ``` 3. 在项目根目录下执行以下命令编译项目 ```bash ./build.sh ``` ## 运行项目 启动多雷达数据融合系统: ```bash cd bin ./MulRadar ```