基于STM32与PX4飞控的视觉识别无人机开发与部署全流程指南
前面我们已经了解了树莓派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) 功能分配
视觉处理模块:
加载 YOLOv8 模型,实时处理摄像头画面。
输出目标检测框的位置和类别信息,通过 UART 发送到 STM32。
STM32 单片机:
接收并解析视觉处理模块的检测结果。
根据目标位置计算导航指令,向 PX4 飞控发送 MAVLink 命令。
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. 系统调试与优化
通信验证:
使用串口调试工具验证 STM32 与视觉模块、飞控的通信是否正常。
运行日志:
在 STM32 中添加 UART 日志输出,记录数据处理过程。
性能优化:
在 Jetson Nano 上使用 TensorRT 优化推理速度。
调整 STM32 的任务优先级,确保实时性。
部署与测试
1. 硬件安装
将 STM32 和视觉模块固定到无人机机架上。
确保摄像头视野清晰,无遮挡。
校准飞控传感器。
2. 测试步骤
启动视觉处理模块,确保目标检测结果准确。
启动 STM32,观察其接收和发送数据是否正确。
切换飞控到 Offboard 模式,测试无人机是否按目标位置飞行。
全部 0条评论