这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 开源硬件 » RaspberryPi5开发板方案创意赛】鸟类直播机器人-过程贴

共2条 1/1 1 跳转至

RaspberryPi5开发板方案创意赛】鸟类直播机器人-过程贴

菜鸟
2026-01-31 21:52:04     打赏

基于树莓派 5 开发一套 “广角镜头拍照→自动识别鸟类→驱动长焦镜头追踪→直播视频” 的完整系统,这个需求涉及硬件选型、AI 识别、电机控制、视频推流几个环节,我将从硬件到软件、从核心功能到整合调试,给出详细的分步实现方案。

一、整体方案架构梳理

先明确系统的核心流程:

 



二、硬件选型(

硬件是基础,兼顾树莓派 5 的性能、功耗和接口兼容性,重点关注以下组件:

组件类型

具体选型

核心要求

主控板

树莓派 5(2GB RAM 版)+ PCIE扩展+ssd硬盘 +   5V 5A 电源

2GB RAM 实用YOLOv8 勉强够用,5A电流保证稳定供电

广角摄像头

手头正好有个100度的USB 广角摄像头

视角≥100°,帧率≥15fps,分辨率 1080P 即可(仅用于识别定位,无需超高清)

长焦摄像头

微雪电子的 25mm 长焦镜头+树莓派 HQ 摄像头

支持手动 / 电动调焦,分辨率≥1080P,帧率≥25fps(保证直播流畅)

云台 / 电机

二轴数字舵机云台MG996R

扭矩≥5kgcm(带动长焦镜头不卡顿),支持 PWM 控制(树莓派 GPIO 直驱)

视频推流配件

直接通过树莓派5的无线网卡推流

树莓派 5 自带千兆网,保证推流带宽

关键选择:

  1. 虽然树莓派官方摄像头(CSI 接口)更好,比USB 摄像头延迟更低,适配性更好,但手头正好有个usb的摄像头,先用这个顶着;长焦镜头使用微雪电子的25mm镜头,比较便宜,只要两百多


  2. 舵机务必选数字舵机(精度高),避免模拟舵机定位偏差大,正好手头有个MG996R就先用这个了;

  3. 暂时考虑部署在室内环境,所以防雨防雾暂时可以简单保护即可。

三、分步实现步骤(核心落地环节)

步骤 1:环境搭建(树莓派 5 基础配置)

树莓派 5 的系统和依赖配置是基础,需优化性能适配 YOLOv8 和视频处理:

  1. 刷写系统:安装 Raspberry Pi OS 64 位,并购买PCIE 到m2 nvme ssd扩展卡和nvme ssd硬盘,这样配置的读写速度比使用micro sd快得多

  2. 安装核心依赖

# 安装YOLOv8依赖

pip install ultralytics opencv-python-headless numpy

# 安装舵机控制库pigpio

pip install RPi.GPIO pigpio

# 安装视频推流依赖ffmpeg

sudo apt install ffmpeg -y

  1. 优化 YOLOv8 推理速度

树莓派 5 算力有限,需对 YOLOv8 模型轻量化:

    • 用yolov8n.pt(最小模型)自己训练鸟类专属轻量化模型;

    • 开启 OpenVINO加速:


步骤 2:YOLOv8 鸟类识别与定位(核心 AI 环节)

核心目标是:从广角画面中识别鸟类,并输出目标的像素坐标 / 相对角度,为云台追踪提供依据。

  1. 数据集准备

YOLOv8 默认模型对鸟类识别精度不足,需训练专属鸟类数据集:

    • 下载开源鸟类数据集:Birds-525(525 种鸟类,标注好的 YOLO 格式);

    • 补充实拍数据:用广角摄像头拍附近区域的鸟类,用 LabelImg 标注,扩充数据集;

    • 训练轻量化模型:在 PC 上训练(树莓派训练太慢):

# 训练命令(PC端执行,适配树莓派)

yolo detect train data=birds.yaml model=yolov8n.pt epochs=50 imgsz=640 batch=16 device=cpu  # 无GPU用cpu

  1. 实时识别与坐标提取

编写代码,从广角摄像头读取画面,识别鸟类并输出目标中心坐标:

from ultralytics import YOLO

import cv2

import numpy as np

 

# 加载训练好的轻量化模型

model = YOLO("birds_yolov8n.pt")

# 打开广角摄像头(usb摄像头)

cap = cv2.VideoCapture(1)

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)

cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

 

def get_bird_position(frame):

    """识别鸟类并返回目标中心坐标 (x,y),无鸟返回None"""

    results = model(frame, imgsz=640, conf=0.5)  # conf=0.5过滤低置信度

    if len(results[0].boxes) == 0:

        return None

    # 取置信度最高的鸟类目标

    box = results[0].boxes[0]

    x1, y1, x2, y2 = box.xyxy[0].cpu().numpy()  # 目标框坐标

    center_x = (x1 + x2) / 2

    center_y = (y1 + y2) / 2

    return (center_x, center_y)

 

# 实时识别测试

while True:

    ret, frame = cap.read()

    if not ret:

        break

    bird_pos = get_bird_position(frame)

    if bird_pos:

        print(f"识别到鸟类,中心坐标:{bird_pos}")

        # 画框标注

        cv2.circle(frame, (int(bird_pos[0]), int(bird_pos[1])), 5, (0,255,0), -1)

    cv2.imshow("Wide Angle View", frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):

        break

cap.release()

cv2.destroyAllWindows()

  1. 坐标转角度(云台控制前置)

广角画面的像素坐标需转为云台的旋转角度,核心逻辑:

    • 标定:先记录云台 “中心位置” 对应的画面中心坐标(约为中心640,360);

    • 计算偏移:dx = bird_x - 640,dy = bird_y - 360;

    • 像素转角度:提前测试 “1 像素对应云台旋转多少度”(经测约10 像素 = 1°),公式:angle_x = dx / 10,angle_y = dy / 10。

步骤 3:云台控制(驱动长焦镜头追踪)

树莓派 5 通过 GPIO 控制二轴舵机,驱动长焦镜头对准鸟类:

  1. 舵机初始化(用 pigpio 库,精度更高)

# 启动pigpio服务

sudo pigpiod

  1. 舵机控制代码

import pigpio

import time

 

# 初始化pigpio

pi = pigpio.pi()

if not pi.connected:

    exit()

 

# 舵机引脚定义(水平X轴,垂直Y轴)

SERVO_X_PIN = 18

SERVO_Y_PIN = 19

 

# 舵机参数:500=0°,1500=90°,2500=180°

MIN_PULSE = 500

MAX_PULSE = 2500

CENTER_PULSE = 1500

 

def set_servo_angle(pin, angle):

    """将角度转为舵机脉冲宽度,控制旋转角度"""

    # 角度范围0-180°

    angle = max(0, min(180, angle))

    pulse = MIN_PULSE + (angle / 180) * (MAX_PULSE - MIN_PULSE)

    pi.set_servo_pulsewidth(pin, pulse)

    time.sleep(0.1)  # 等待舵机到位

 

def track_bird(bird_pos):

    """根据鸟类坐标控制云台追踪"""

    # 初始角度(中心位置)

    current_x_angle = 90

    current_y_angle = 90

    # 计算偏移角度(10像素=1°)

    dx = bird_pos[0] - 640

    dy = bird_pos[1] - 360

    delta_x = dx / 10

    delta_y = dy / 10

    # 更新角度

    new_x_angle = current_x_angle + delta_x

    new_y_angle = current_y_angle + delta_y

    # 控制舵机旋转

    set_servo_angle(SERVO_X_PIN, new_x_angle)

    set_servo_angle(SERVO_Y_PIN, new_y_angle)

    return (new_x_angle, new_y_angle)

 

# 测试:控制云台回到中心

set_servo_angle(SERVO_X_PIN, 90)

set_servo_angle(SERVO_Y_PIN, 90)

步骤 4:视频直播推流(长焦镜头视频输出)

树莓派 5 将长焦摄像头的视频编码后推流到直播平台(先用本地测试,后面推到B 站等),核心用 ffmpeg 实现:

  1. 先测试长焦摄像头采集

# 读取长焦摄像头视频(假设CSI接口,编号1)

cap_long = cv2.VideoCapture(1)

cap_long.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)

cap_long.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)

cap_long.set(cv2.CAP_PROP_FPS, 25)

  1. ffmpeg 推流命令(核心)

树莓派 5 的 CPU 足够编码 1080P 25fps 视频,推流到本地测试:

#直接读取CSI摄像头推流(低延迟)

ffmpeg -f v4l2 -input_format h264 -video_size 1920x1080 -framerate 25 -i /dev/video1 \

-c:v copy -f flv "rtmp://localhost:1935/live/birds"

 

步骤 5:系统整合(核心逻辑串联)

将 “识别→追踪→推流” 整合为完整代码,加入异常处理和状态判断,基本达到预定目标。

 





关键词: RaspberryPi5     开发     方案     创意     鸟类         

高工
2026-02-01 21:26:29     打赏
2楼

有个问题,都上yolov8了,为啥还要高精度舵机?我的理解,只需要保证yolov8输出的框在画面的正中间就行,上个动态纠偏就能搞定


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]