基于STM32与PX4飞控的视觉识别无人机开发与部署全流程指南

john
john 在知识的海洋中遨游

0 人点赞了该文章 · 506 浏览

      前面我们已经了解了树莓派5 和 Pixhawk 打造视觉识别智能无人机的过程,当然,其他任务的无人机也是类似的实现过程,区别只在于代码算法的实现,为了应对不同任务,我们仍然有可能采用不同的计算平台 和 飞控相结合,实现不同的任务,比如低功耗简单任务,或更复杂的智能任务,低功耗的简单任务可以使用stm32,更复杂的智能任务我们可以实现更高级配置的嵌入式Linux,主控等等。

下面我们以STM32单片机和PX4飞控为基础,详细介绍如何设计一套集成视觉识别功能的无人机系统,从硬件选型、软件开发到模型部署与运行,帮助大家了解更多的无人机方案。

项目概述

  • 目标:通过 STM32 和 PX4 飞控实现目标识别与无人机自主飞行。

  • 关键技术

    • YOLOv8 深度学习模型进行目标检测。

    • 使用 STM32 驱动外接视觉处理模块和通信接口。

    • PX4 飞控通过 MAVLink 实现飞行控制。


开发流程


1. 硬件选型与连接

(1) 硬件选型

  • 处理器:STM32F4 或更高型号,具备较强的计算能力。

  • 飞控:PX4 Pixhawk 系列飞控。

  • 视觉模块

    • 使用 USB 接口连接的 Jetson Nano 或 Coral Dev Board 作为视觉处理单元。

    • STM32 通过 UART 接口与视觉处理模块通信。

  • 摄像头:支持高分辨率的 CSI 摄像头,如 IMX219。

(2) 硬件连接

  • STM32 通过 UART 接口与 PX4 飞控连接,接收飞控数据和发送控制指令。

  • STM32 通过第二路 UART 与外接视觉处理模块通信,获取目标检测结果。

  • 摄像头通过 CSI 接口连接到视觉处理模块。


2. 系统功能设计

(1) 系统架构

系统包含三个主要部分:

  • 视觉处理模块:运行 YOLOv8 模型,负责目标检测和结果传输。

  • STM32 控制单元:解析目标检测结果,计算目标位置,并通过 MAVLink 向飞控发送导航指令。

  • PX4 飞控:执行飞行控制和姿态调整。

(1.1) 性能与功能对比

特性STM32树莓派 5
计算能力低,适合轻量级任务高,可运行优化后的深度学习模型
功耗极低,非常节能较高,需要良好的电源管理
扩展性强,适合低资源嵌入式应用强,支持多种外设和开发框架
操作系统支持无(基于裸机或 RTOS 开发)支持 Linux(如 Raspberry Pi OS)
视觉处理能力需要外部模块(如 Jetson Nano)协助内置强大算力,可直接处理图像数据

选择 STM32 或树莓派 5 主要取决于项目需求:

  • 如果追求极低功耗和可靠性,可选 STM32,视觉处理可外接计算模块。

  • 如果需要高性能计算和灵活开发环境,树莓派 5 更为适合。

系统包含三个主要部分:

  • 视觉处理模块:运行 YOLOv8 模型,负责目标检测和结果传输。

  • STM32 控制单元:解析目标检测结果,计算目标位置,并通过 MAVLink 向飞控发送导航指令。

  • PX4 飞控:执行飞行控制和姿态调整。

(2) 功能分配

  1. 视觉处理模块

    • 加载 YOLOv8 模型,实时处理摄像头画面。

    • 输出目标检测框的位置和类别信息,通过 UART 发送到 STM32。

  2. STM32 单片机

    • 接收并解析视觉处理模块的检测结果。

    • 根据目标位置计算导航指令,向 PX4 飞控发送 MAVLink 命令。

  3. PX4 飞控

    • 接收 MAVLink 指令,控制无人机飞向目标。


3. YOLOv8 模型训练与部署

(1) 模型训练

  • 训练环境:在 PC 上配置 Python 环境,安装 ultralytics。

    pip install ultralytics
  • 数据准备:准备包含目标物体的图像数据集,标注后生成 COCO 格式的数据。

  • 训练代码

    from ultralytics import YOLO
    
    model = YOLO('yolov8n.pt')
    model.train(data='dataset.yaml', epochs=50, imgsz=640, batch=16)
    model.export(format='tflite')  # 导出为 TFLite 模型

(2) 模型部署

  • 将导出的 model.tflite 上传到 Jetson Nano 或 Coral Dev Board。

  • 安装 TFLite 推理引擎:

    pip install tflite-runtime
  • 在视觉模块中运行目标检测代码:

    import cv2
    import numpy as np
    import tflite_runtime.interpreter as tflite
    
    interpreter = tflite.Interpreter(model_path='model.tflite')
    interpreter.allocate_tensors()
    
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()
    
    def preprocess(frame):
        input_image = cv2.resize(frame, (320, 320))
        input_image = np.expand_dims(input_image, axis=0).astype(np.float32) / 255.0
        return input_image
    
    def detect(frame):
        input_data = preprocess(frame)
        interpreter.set_tensor(input_details[0]['index'], input_data)
        interpreter.invoke()
        return interpreter.get_tensor(output_details[0]['index'])
    
    cap = cv2.VideoCapture(0)
    while True:
        ret, frame = cap.read()
        if not ret: break
        detections = detect(frame)
        # 将检测结果通过 UART 发送给 STM32

注意事项

  • STM32 的硬件资源限制较为显著,通常无法直接运行深度学习模型。

  • 推荐通过外接视觉处理模块(如 Jetson Nano)完成 YOLOv8 推理。

  • 相比 STM32,树莓派 5 具备更强的算力,可以直接运行部分优化后的模型。

(1) 模型训练

  • 训练环境:在 PC 上配置 Python 环境,安装 ultralytics。

    pip install ultralytics
  • 数据准备:准备包含目标物体的图像数据集,标注后生成 COCO 格式的数据。

  • 训练代码

    from ultralytics import YOLO
    
    model = YOLO('yolov8n.pt')
    model.train(data='dataset.yaml', epochs=50, imgsz=640, batch=16)
    model.export(format='tflite')  # 导出为 TFLite 模型

(2) 模型部署

  • 将导出的 model.tflite 上传到 Jetson Nano 或 Coral Dev Board。

  • 安装 TFLite 推理引擎:

    pip install tflite-runtime
  • 在视觉模块中运行目标检测代码:

    import cv2
    import numpy as np
    import tflite_runtime.interpreter as tflite
    
    interpreter = tflite.Interpreter(model_path='model.tflite')
    interpreter.allocate_tensors()
    
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()
    
    def preprocess(frame):
        input_image = cv2.resize(frame, (320, 320))
        input_image = np.expand_dims(input_image, axis=0).astype(np.float32) / 255.0
        return input_image
    
    def detect(frame):
        input_data = preprocess(frame)
        interpreter.set_tensor(input_details[0]['index'], input_data)
        interpreter.invoke()
        return interpreter.get_tensor(output_details[0]['index'])
    
    cap = cv2.VideoCapture(0)
    while True:
        ret, frame = cap.read()
        if not ret: break
        detections = detect(frame)
        # 将检测结果通过 UART 发送给 STM32


4. STM32 代码开发

(1) 数据解析

STM32 接收 UART 数据,解析检测到的目标位置:

#include "usart.h"
#include "mavlink.h"

void process_detection_data(char* data) {
    // 假设接收到的数据格式为: "x=100,y=150"
    int x, y;
    sscanf(data, "x=%d,y=%d", &x, &y);
    send_navigation_command(x, y);
}

void send_navigation_command(int x, int y) {
    mavlink_message_t msg;
    uint8_t buf[MAVLINK_MAX_PACKET_LEN];

    mavlink_msg_set_position_target_local_ned_pack(
        1, 200, &msg, HAL_GetTick(), 0, 0,
        MAV_FRAME_LOCAL_NED, 0b110111111000,
        x, y, -10, 0, 0, 0, 0, 0, 0, 0, 0
    );

    uint16_t len = mavlink_msg_to_send_buffer(buf, &msg);
    HAL_UART_Transmit(&huart1, buf, len, HAL_MAX_DELAY);
}

(2) 飞控通信配置

确保 PX4 飞控开启 MAVLink 通信,并在 QGroundControl 中配置 Offboard 模式。


5. 系统调试与优化

  1. 通信验证

    • 使用串口调试工具验证 STM32 与视觉模块、飞控的通信是否正常。

  2. 运行日志

    • 在 STM32 中添加 UART 日志输出,记录数据处理过程。

  3. 性能优化

    • 在 Jetson Nano 上使用 TensorRT 优化推理速度。

    • 调整 STM32 的任务优先级,确保实时性。


部署与测试

1. 硬件安装

  • 将 STM32 和视觉模块固定到无人机机架上。

  • 确保摄像头视野清晰,无遮挡。

  • 校准飞控传感器。

2. 测试步骤

  1. 启动视觉处理模块,确保目标检测结果准确。

  2. 启动 STM32,观察其接收和发送数据是否正确。

  3. 切换飞控到 Offboard 模式,测试无人机是否按目标位置飞行。

发布于 2024-12-29 11:10

免责声明:

本文由 john 原创或转载,著作权归作者所有,如有侵权,请联系我们删除。 info@frelink.top

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论

All Rights Reserved Frelink ©2025