睿诚科技协会

Arduino移动跟踪无人机如何实现精准跟随?

核心概念

项目的核心是“闭环反馈控制”系统,这个系统包含三个主要部分:

Arduino移动跟踪无人机如何实现精准跟随?-图1
(图片来源网络,侵删)
  1. 传感器: 用来获取无人机当前位置的信息,这是最关键的一步,决定了跟踪的精度和方式。
  2. 控制器: Arduino微处理器,它接收传感器的数据,与目标位置(例如画面中心)进行比较,计算出误差,然后发出控制指令。
  3. 执行器: 负责移动平台的电机、云台舵机等,它们接收Arduino的指令,进行物理移动,以减小误差。

工作流程图: 无人机飞过传感器检测无人机位置控制器计算误差控制器发送指令执行器移动平台无人机再次出现在视野中心循环...


基于视觉的跟踪 (最常用,精度较高)

这是最主流和直观的方法,类似于人脸识别或球类跟踪。

所需硬件

  1. 核心控制器:

    • Arduino Uno/Nano: 适合初学者,但处理能力有限。
    • Arduino Mega: 拥有更多内存和IO口,适合处理更复杂的图像数据。
    • ESP32: 强烈推荐! 它自带Wi-Fi和蓝牙,以及双核处理器,可以轻松运行摄像头和Wi-Fi通信,性能远超传统Arduino。
  2. 视觉传感器:

    Arduino移动跟踪无人机如何实现精准跟随?-图2
    (图片来源网络,侵删)
    • OV7670 摄像头模块: 价格便宜,但分辨率低(VGA),且需要大量的内存缓存,对Arduino是巨大挑战。
    • ESP32-CAM 模块: 最佳选择! 它将ESP32和摄像头(通常是OV2640或更高分辨率)集成在一起,专为这类视觉项目设计,它可以独立完成图像捕捉、处理和部分识别工作。
  3. 移动平台:

    • 底盘: 可以是现成的智能小车底盘,或自己3D打印/制作。
    • 电机: 通常使用TT马达(带减速箱的直流电机)。
    • 电机驱动: L298NTB6612FNG 模块,用于控制电机的正反转和速度。
    • 转向机构:
      • 差速转向: 通过控制左右轮的速度差来实现转向(如大多数智能小车),适合360度范围内跟踪。
      • 舵机转向: 前轮或后轮由舵机控制方向,后轮为驱动轮,转向角度有限,但结构简单。
  4. 云台 (可选但推荐):

    • 如果平台不移动,或者为了更灵活的跟踪,可以添加一个由两个舵机组成的云台(一个控制俯仰/上下,一个控制水平/左右),将摄像头安装在上面,这样平台本身可以不动,只靠云台转动来跟踪。

软件与逻辑 (以ESP32-CAM为例)

  1. 开发环境: Arduino IDE,并安装ESP32的相关开发板管理包。

  2. 核心库:

    Arduino移动跟踪无人机如何实现精准跟随?-图3
    (图片来源网络,侵删)
    • esp_camera.h: ESP32官方库,用于控制摄像头。
    • OpenCV for ArduinoTensorFlow Lite for Microcontrollers: 对于ESP32来说,直接运行完整的OpenCV太重了,通常采用简化的颜色跟踪或形状跟踪算法。
    • ArduinoJson: 如果需要通过网络传输数据,这个库非常有用。
  3. 跟踪算法 (颜色跟踪是入门首选):

    • 原理: 给无人机安装一个高对比度、独特的颜色标记(如一个鲜艳的红色或绿色圆环),摄像头捕捉画面后,算法会遍历所有像素,找出符合目标颜色范围的区域。
    • 步骤: a. 图像捕捉: 摄像头获取一帧图像。 b. 颜色阈值化: 将图像转换为HSV色彩空间,然后设定一个颜色范围(红色的H范围是0-10和170-180,S和V范围较高),将所有在这个范围内的像素点设为白色,其他设为黑色,这样就得到了一个二值化的黑白图像,目标无人机区域是白色斑点。 c. 寻找质心: 遍历这个黑白图像,计算所有白色像素点的平均坐标 (x, y),这个点就是目标无人机的“质心”。 d. 计算误差: 将无人机的质心坐标 (x, y) 与画面的中心坐标 (center_x, center_y) 进行比较,得到误差 error_x = x - center_xerror_y = y - center_y。 e. PID控制: 使用PID(比例-积分-微分)算法来根据误差计算一个合适的控制输出。
      • P (比例): 误差越大,移动速度越快,这是最基本的部分。
      • I (积分): 累积过去的误差,用于消除系统存在的稳态误差(比如一直向左偏一点)。
      • D (微分): 预测误差的未来趋势,用于防止过冲和振荡,让系统更稳定。 f. 输出控制指令: PID计算出的结果会被转换成给左右轮的PWM信号(控制速度)或给舵机的角度指令。
  4. 代码流程示例 (伪代码):

#include <esp_camera.h>
#include <PID_v1.h> // 使用现成的PID库
// 定义PID参数
double Kp=1, Ki=0.5, Kd=0.1;
double SetpointX, InputX, OutputX;
PID myPIDX(&InputX, &OutputX, &SetpointX, Kp, Ki, Kd, DIRECT);
void setup() {
  // 初始化摄像头
  camera_config_t config = { ... };
  esp_camera_init(&config);
  // 初始化PID
  SetpointX = (摄像头宽度 / 2); // 目标位置是画面中心
  myPIDX.SetMode(AUTOMATIC);
  // 初始化电机引脚
  pinMode(MOTOR_A1, OUTPUT);
  // ... 其他引脚
}
void loop() {
  // 1. 捕捉一帧图像
  camera_fb_t *fb = esp_camera_fb_get();
  if (!fb) { /* 处理错误 */ }
  // 2. 在图像上寻找目标无人机的质心
  int drone_x = findDroneCenter(fb->buf, fb->width, fb->height);
  // 3. 计算误差
  InputX = drone_x;
  // 4. PID计算
  myPIDX.Compute();
  // 5. 根据OutputX控制电机
  // OutputX > 0,说明目标在右边,需要左转或右轮加速
  controlMotors(OutputX);
  // 释放图像帧
  esp_camera_fb_return(fb);
}
// 这是一个简化的函数,实际需要自己实现颜色阈值和质心计算
int findDroneCenter(uint8_t *buf, int w, int h) {
  // ... 遍历像素,进行颜色判断,计算质心 ...
  return calculated_x;
}

基于无线电信号强度的跟踪 (DIY,精度较低)

这种方法不依赖视觉,而是通过测量无人机遥控器与地面站之间的信号强度来估算方向。

所需硬件

  • Arduino: 任何型号均可。
  • 无线电接收模块: 需要能接收你无人机遥控器所使用的频段信号,并输出RSSI(Received Signal Strength Indicator,接收信号强度指示)值。
    • 4GHz遥控器: 可以使用像 NRF24L01+ 模块,但需要额外电路或固件来解锁RSSI功能。
    • 遥控/数传一体机: 一些高端遥控器(如TBS Unify Pro32)或数传(如RFD900X)可以直接输出RSSI信号,这是最方便的。
  • 旋转平台: 这个平台需要能够360度水平旋转,通常用一个高精度数字舵机(如MG996R)来驱动一个转盘。
  • 电机驱动: 如果舵机电流较大,可能需要独立的电源和驱动电路。
  • 红外对管或限位开关: 用于确定平台的初始“0度”位置。

软件与逻辑

  1. 原理: RSSI值通常与距离成反比,当无人机在某个方向时,该方向的RSSI值最高,通过不断旋转天线,找到RSSI值最大的角度,这个角度就是无人机的方向。

  2. 步骤: a. 初始化: 将平台旋转到初始位置(0度),并归零。 b. 扫描: 让平台以一个

分享:
扫描分享到社交APP
上一篇
下一篇