项目名称:基于毫米波雷达+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

# 硬件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

# 硬件接线说明
## 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

#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(雷达解析片段)

#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

# 全局配置
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

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

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【三重联合判定核心】

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 上位机主程序

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

path: ./datasets/mosquito
train: images/train
val: images/val

names:
  0: mosquito
  1: person

11、hardware/debug_manual.md

# 实物调试手册
1. 上电前:断开激光输出引脚,先调试雷达、红外、摄像头、云台,确认全部正常。
2. 雷达调试:观察是否可以正常输出角度、距离、人体标志位。
3. 红外调试:手靠近MLX90640,应当识别高温热源;小热源模拟蚊虫测试阈值。
4. YOLO测试:单独跑推理,确认可以识别蚊虫、人。
5. 融合逻辑:模拟目标,观察是否满足三重条件才输出激光指令。
6. 最后接入激光,全程严禁对准人眼。

12、docs/fault_troubleshoot.md

# 故障排查
1. 雷达无数据:检查串口接线、波特率,确认雷达供电正常。
2. MLX90640读取失败:确认I2C开启,3.3V供电,不要接5V。
3. YOLO推理慢:使用nano模型,开启树莓派GPU加速。
4. 激光总是不开启:检查三重条件,优先看是否误触发人体检测。
5. 云台抖动:增大舵机延时,限制角度变化步长。

项目使用步骤

  1. ESP32‑S3:使用PlatformIO打开 esp32_s3_slave,编译烧录到硬件。
  2. 树莓派环境准备
pip install ultralytics pyyaml mlx90640 opencv‑python pyserial numpy
  1. 修改 config.yaml 串口、距离、温度阈值。
  2. 树莓派运行:python3 main.py,整机进入雷达扫描待机模式。

⚠️安全警告:激光模组存在致盲风险,开发调试务必做好防护,禁止在无防护条件下直接开机。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐