阶段 1
:视觉算法基础
- 图像处理基础
滤波操作:通过 OpenCV 实现图像模糊、降噪等操作。常见的滤波器包括均值滤波、Gaussian滤波、中值滤波等。
代码示例:均值滤波python
import cv2
img = cv2.imread('image.jpg')
blurred_img = cv2.blur(img, (5, 5)) # 5x5 kernel
cv2.imshow('Blurred Image', blurred_img)
cv2.waitKey(0)
阈值分割:二值化图像,常用于物体识别。
代码示例:阈值分割python
_, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('Thresholded Image', thresh)
cv2.waitKey(0)
边缘检测:使用 Canny 边缘检测。
代码示例:python
edges = cv2.Canny(img, 100, 200)
cv2.imshow('Edge Detection', edges)
cv2.waitKey(0)
- 目标特征提取
ORB:结合 FAST 和 BRIEF,用于检测图像中的特征点。
代码示例:python
orb = cv2.ORB_create()
kp, des = orb.detectAndCompute(img, None)
img_kp = cv2.drawKeypoints(img, kp, None)
cv2.imshow('ORB Features', img_kp)
cv2.waitKey(0)
SIFT:尺度不变特征变换,经典的特征点提取算法(需OpenCV的非自由版本)。
代码示例:python
sift = cv2.SIFT_create()
kp, des = sift.detectAndCompute(img, None)
img_kp = cv2.drawKeypoints(img, kp, None)
cv2.imshow('SIFT Features', img_kp)
cv2.waitKey(0)
- 基础跟踪逻辑
Meanshift 跟踪:通过颜色直方图进行简单的目标跟踪。
代码示例:python
# 初始化跟踪窗口(例如目标区域)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lowerb, upperb) # 定义目标颜色范围
hist = cv2.calcHist([hsv], [0], mask, [256], [0, 256])
# 跟踪循环
while True:
ret, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
back_proj = cv2.calcBackProject([hsv], [0], hist, [0, 256], 1)
ret, track_window = cv2.meanShift(back_proj, track_window, term_crit)
cv2.rectangle(frame, track_window, (0, 255, 0), 2)
cv2.imshow('Tracking', frame)
if cv2.waitKey(1) == 27: # ESC to exit
break
Kalman 滤波器:用于目标的预测与滤波,减少噪声影响。
代码示例:python
kalman = cv2.KalmanFilter(4, 2)
kalman.measurementMatrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0]], np.float32)
kalman.transitionMatrix = np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32)
while True:
ret, frame = cap.read()
# 测量值
measurement = np.array([np.float32(x), np.float32(y)], np.float32)
kalman.correct(measurement)
prediction = kalman.predict()
# 使用预测值进行目标跟踪
阶段 2
:运动控制闭环入门
-
运动执行器基础
步进电机控制:使用 L298N/L293D 驱动步进电机或直流电机。
代码示例:使用Arduino控制步进电机cpp
#include <Stepper.h>
Stepper motor(200, 8, 9, 10, 11); // 200步,连接到 Arduino 引脚 8-11
void setup() { motor.setSpeed(60); // 设置速度 }
void loop() { motor.step(100); // 步进电机走 100 步 delay(500); }
-
反馈传感器应用
编码器读取:获取电机位置和速度。
代码示例:通过编码器读取转速cpp
volatile int encoderPos = 0;
void encoderISR() { encoderPos++; // 每次编码器脉冲增加 }
void setup() { attachInterrupt(digitalPinToInterrupt(2), encoderISR, RISING); }
超声波传感器应用:获取距离信息,用于避障或位置修正。
代码示例:超声波距离测量cpp
long duration, distance;
void setup() { pinMode(7, OUTPUT); // Trigger pinMode(8, INPUT); // Echo }
void loop() { digitalWrite(7, LOW); delayMicroseconds(2); digitalWrite(7, HIGH); delayMicroseconds(10); digitalWrite(7, LOW); duration = pulseIn(8, HIGH); distance = (duration / 2) * 0.0344; // 转换为 cm }
- 闭环控制逻辑
视觉+运动控制:根据视觉识别目标,计算偏差后驱动电机进行修正。
伪代码:
目标位置 = 视觉算法检测到的目标位置
当前位移 = 电机编码器读取的位置
运动偏差 = 目标位置 - 当前位移
修正运动 = 通过电机驱动模块调整电机位置
阶段 3
:PID 控制与参数整定
-
PID 控制原理
PID 控制算法:基本的比例、积分、微分控制。
代码示例:cpp
float kp = 1.0, ki = 0.1, kd = 0.01;
float lastError = 0, integral = 0;
void loop() { float error = targetPosition - currentPosition; integral += error; float derivative = error - lastError; float output = kp * error + ki * integral + kd * derivative; motorControl(output); lastError = error; }
-
自整定
自动调节PID参数:通过系统震荡频率自动计算初始参数(例如 Ziegler-Nichols 方法)。
代码示例:开源的 PID 库(如 Arduino PID Library)cpp
#include <PID_v1.h>
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);
void setup() { myPID.SetMode(AUTOMATIC); myPID.SetTunings(2, 5, 1); }
阶段 4
:多协议通信协同
- 基础通信协议
UART 串口通信:Arduino 与上位机之间的数据传输。
代码示例:cpp
Serial.begin(9600); // 初始化串口
Serial.print("Data: ");
Serial.println(sensorData);
I2C 通信:用于多个传感器间的数据同步。
代码示例:读取 I2C 传感器数据cpp
Wire.begin(); // 启动 I2C 总线
Wire.requestFrom(0x68, 2); // 请求来自设备的 2 字节数据
- 工业协议入门
Modbus RTU:适用于多模块控制。
代码示例:通过 ModbusMaster 库与设备通信。cpp
#include <ModbusMaster.h>
ModbusMaster node; node.begin(1, Serial); // 设备地址为 1
阶段 5
:视觉算法优化与轻量化部署
-
高级跟踪算法
YOLOv5-nano:轻量级目标检测模型。
使用 PyTorch/TensorFlow 训练并优化 YOLO 模型,支持多目标跟踪。 -
模型压缩技术
量化与剪枝:减少模型大小,提高推理速度。
TensorRT 或 ONNX 进行模型优化与部署。
例如,使用 ONNX Runtime:python
import onnxruntime as ort
session = ort.InferenceSession('model.onnx')
outputs = session.run(None, {"input": input_data})
-
边缘部署
树莓派/Jetson Nano 部署:部署优化后的模型到边缘设备,确保实时性。
使用 TensorRT 或 OpenVINO 加速推理过程。