项目名称:基于毫米波雷达+MLX90640红外热成像+YOLOv8的多特征识别激光灭蚊机器人
平台:ESP32‑S3下位机 + 树莓派4B上位机
开发语言:C++(ESP‑IDF/Arduino‑ESP32)、Python3
功能:雷达全域扫描唤醒、红外活体热源校验、YOLOv8目标分类、二维云台追踪、激光打击、多重人体安全联锁
项目目录结构
laser_mosquito_killer/
├─ hardware/ # 硬件相关文档
│ ├─ hardware_bom.md # BOM硬件清单
│ ├─ wiring_diagram.md # 接线说明
│ └─ debug_manual.md # 实物调试手册
├─ esp32_s3_slave/ # ESP32‑S3下位机工程
│ ├─ src/
│ │ ├─ main.cpp # 主程序
│ │ ├─ radar_parse.cpp # 毫米波雷达解析
│ │ ├─ servo_driver.cpp # 二维云台舵机驱动
│ │ ├─ laser_ctrl.cpp # 激光安全控制
│ │ └─ uart_comm.cpp # 和树莓派串口通信
│ └─ platformio.ini
├─ raspberry_master/ # 树莓派上位机
│ ├─ config.yaml # 全局参数配置
│ ├─ main.py # 上位机主入口,多传感器融合
│ ├─ radar_parser.py # 雷达数据解析
│ ├─ mlx90640_ir.py # MLX90640红外热成像ROI热源提取
│ ├─ yolo_infer.py # YOLOv8推理封装
│ ├─ fusion_logic.py # 雷达‑红外‑YOLO三重判定核心逻辑
│ └─ serial_comm.py # 串口与ESP32‑S3交互
├─ yolo_model/
│ ├─ mosquito_train.yaml # YOLOv8训练配置
│ └─ best_nano.pt # 轻量化蚊虫识别模型
└─ docs/
├─ fault_troubleshoot.md # 故障排查文档
└─ architecture.md # 系统架构说明
1、hardware/hardware_bom.md
markdown
# 硬件BOM清单|三模融合激光灭蚊机器人
|器件|型号|数量|备注|
|---|---|---|---|
|下位机主控|ESP32‑S3 DevKit|1|云台控制、雷达解析、安全逻辑、串口通信|
|上位机|树莓派4B 4G/8G|1|YOLO推理、多传感器数据融合|
|毫米波雷达|24GHz扫描雷达|1|输出角度、距离、多普勒速度、人体检测|
|红外热成像模块|MLX90640(32×24)|1|I2C接口,热源提取|
|摄像头|USB广角摄像头|1|与红外镜头同轴安装|
|二维云台|二维数字舵机云台|1|水平±60°,垂直±45°|
|激光模组|可调焦500mW激光|1|带TTL开关控制,务必做好防护|
|舵机|SG90/MG996R|2|驱动二维云台|
|电源|5V 5A稳压电源|1|整机供电|
|杜邦线、散热片|若干||
2、hardware/wiring_diagram.md
markdown
# 硬件接线说明
## ESP32‑S3接线
1. 毫米波雷达 UART:TX→GPIO17,RX→GPIO16
2. 云台水平舵机:GPIO13;垂直舵机:GPIO14
3. 激光控制引脚:GPIO15(高电平开启激光)
4. 串口连接树莓派:GPIO4(TX)、GPIO5(RX)
## MLX90640红外热成像(接树莓派I2C)
- VCC →3.3V;GND→GND;SDA→GPIO2;SCL→GPIO3
## USB摄像头
直接插入树莓派USB口
> 重要安全提示:激光对人眼伤害极大,调试阶段务必遮挡激光头,禁止对着人调试。
3、esp32_s3_slave/src/main.cpp
cpp
#include <Arduino.h>
#include "radar_parse.h"
#include "servo_driver.h"
#include "laser_ctrl.h"
#include "uart_comm.h"
void setup()
{
Serial.begin(115200);
radar_init();
servo_init();
laser_init();
uart_bridge_init();
}
void loop()
{
// 解析毫米波雷达数据
radar_task();
// 接收上位机指令,控制云台、激光
uart_recv_task();
// 如果上位机允许激光,才可以打开激光
if(get_laser_enable_flag()){
laser_on();
}else{
laser_off();
}
delay(20);
}
4、esp32_s3_slave/src/radar_parse.cpp(雷达解析片段)
cpp
#include "radar_parse.h"
RadarData g_radar_data;
void radar_init(void){
Serial2.begin(115200, SERIAL_8N1, 16,17);
memset(&g_radar_data,0,sizeof(RadarData));
}
void radar_task(void)
{
if(Serial2.available()){
uint8_t ch = Serial2.read();
// 解析雷达协议帧,填充:exist、angle、distance、speed、human_exist
// 此处省略协议解析,输出结构体 g_radar_data
}
}
RadarData get_radar_data(void)
{
return g_radar_data;
}
5、raspberry_master/config.yaml
yaml
# 全局配置
serial_port: "/dev/ttyUSB0"
baudrate: 115200
# 红外热源阈值
ir_temp_min: 28.0
ir_temp_max: 38.0
ir_delta_min: 1.5
ir_delta_max: 7.0
# YOLO置信度
yolo_conf_thresh: 0.65
# 雷达有效打击距离
radar_dist_min: 0.3
radar_dist_max: 3.0
6、raspberry_master/mlx90640_ir.py
python
import mlx90640
import numpy as np
class Mlx90640IR:
def __init__(self):
mlx90640.setup(16)
self.frame_buf = [0]*768
def get_roi_heat_target(self):
"""读取热成像,提取ROI区域,判断是否存在小型活体热源"""
mlx90640.getFrame(self.frame_buf)
temp_matrix = np.array(mlx90640.calculate_to(self.frame_buf)).reshape((24,32))
roi_x1, roi_y1 = 10, 8
roi_x2, roi_y2 = 22, 16
roi = temp_matrix[roi_y1:roi_y2, roi_x1:roi_x2]
max_t = np.max(roi)
min_t = np.min(roi)
delta = max_t - min_t
return (28.0 < max_t < 38.0) and (1.5 < delta <7.0), float(max_t)
7、raspberry_master/yolo_infer.py
python
from ultralytics import YOLO
class YoloInfer:
def __init__(self,model_path,conf_thresh=0.65):
self.model = YOLO(model_path)
self.conf_thresh = conf_thresh
def detect(self,frame):
res = self.model(frame,conf=self.conf_thresh)[0]
mosquito_flag = False
human_flag = False
for box in res.boxes:
cls_name = self.model.names[int(box.cls)]
if cls_name == "mosquito":
mosquito_flag = True
if cls_name == "person":
human_flag = True
return {"mosquito":mosquito_flag,"human":human_flag}
8、raspberry_master/fusion_logic.py【三重联合判定核心】
python
def judge_laser_permit(radar_info,ir_has_target,yolo_result,cfg):
"""
radar_info: dict {"exist":bool,"distance":float,"human_exist":bool}
ir_has_target: bool 红外是否检测小型活体热源
yolo_result: dict {"mosquito":bool,"human":bool}
return True=允许激光;False=禁止
"""
# 安全第一:任意一路检测到人,直接禁止激光输出
if radar_info["human_exist"] or yolo_result["human"]:
return False
cond1 = radar_info["exist"] and cfg["radar_dist_min"] < radar_info["distance"] < cfg["radar_dist_max"]
cond2 = ir_has_target
cond3 = yolo_result["mosquito"]
if cond1 and cond2 and cond3:
return True
return False
9、raspberry_master/main.py 上位机主程序
python
import yaml
import time
from serial_comm import SerialComm
from mlx90640_ir import Mlx90640IR
from yolo_infer import YoloInfer
from fusion_logic import judge_laser_permit
import cv2
def main():
with open("config.yaml","r",encoding="utf‑8") as f:
cfg = yaml.safe_load(f)
ser = SerialComm(port=cfg["serial_port"],baudrate=cfg["baudrate"])
ir_dev = Mlx90640IR()
yolo = YoloInfer("../yolo_model/best_nano.pt",conf_thresh=cfg["yolo_conf_thresh"])
cap = cv2.VideoCapture(0)
print("系统启动,进入雷达扫描待机...")
while True:
radar_info = ser.get_radar_data()
if radar_info["exist"]:
# 云台转动到雷达给出的角度
ser.send_servo_angle(radar_info["angle"])
time.sleep(0.12)
# 红外活体校验
ir_has_target,_ = ir_dev.get_roi_heat_target()
# YOLO视觉识别
ret,img = cap.read()
yolo_res = yolo.detect(img)
# 三重融合判定
allow_laser = judge_laser_permit(radar_info,ir_has_target,yolo_res,cfg)
if allow_laser:
ser.send_laser_enable(True)
time.sleep(0.4)
ser.send_laser_enable(False)
else:
ser.send_laser_enable(False)
time.sleep(0.05)
if __name__ == "__main__":
main()
10、yolo_model/mosquito_train.yaml
yaml
path: ./datasets/mosquito
train: images/train
val: images/val
names:
0: mosquito
1: person
11、hardware/debug_manual.md
markdown
# 实物调试手册
1. 上电前:断开激光输出引脚,先调试雷达、红外、摄像头、云台,确认全部正常。
2. 雷达调试:观察是否可以正常输出角度、距离、人体标志位。
3. 红外调试:手靠近MLX90640,应当识别高温热源;小热源模拟蚊虫测试阈值。
4. YOLO测试:单独跑推理,确认可以识别蚊虫、人。
5. 融合逻辑:模拟目标,观察是否满足三重条件才输出激光指令。
6. 最后接入激光,全程严禁对准人眼。
12、docs/fault_troubleshoot.md
markdown
# 故障排查
1. 雷达无数据:检查串口接线、波特率,确认雷达供电正常。
2. MLX90640读取失败:确认I2C开启,3.3V供电,不要接5V。
3. YOLO推理慢:使用nano模型,开启树莓派GPU加速。
4. 激光总是不开启:检查三重条件,优先看是否误触发人体检测。
5. 云台抖动:增大舵机延时,限制角度变化步长。
项目使用步骤
- ESP32‑S3:使用PlatformIO打开 esp32_s3_slave,编译烧录到硬件。
- 树莓派环境准备
bash
pip install ultralytics pyyaml mlx90640 opencv‑python pyserial numpy
- 修改
config.yaml串口、距离、温度阈值。 - 树莓派运行:
python3 main.py,整机进入雷达扫描待机模式。
⚠️安全警告:激光模组存在致盲风险,开发调试务必做好防护,禁止在无防护条件下直接开机。