1. 宠物自动跟随小车项目概述
作为一名长期关注智能硬件开发的工程师,我最近完成了一个特别有意思的项目——宠物自动跟随小车。这个项目的核心目标是解决宠物主人在户外活动时的几个常见痛点:
- 当狗狗在公园自由奔跑时,主人不再需要时刻盯着宠物位置
- 老年主人或行动不便者可以更轻松地遛狗
- 跑步爱好者可以专注于运动而不用担心宠物走丢
这个小车的核心功能是通过摄像头识别主人和宠物,并自动保持跟随状态。整个系统基于树莓派开发,采用了YOLOv8目标检测和FaceNet人脸识别技术,配合PID控制算法实现平滑跟随。
2. 系统架构设计
2.1 硬件组成
整个系统由以下几个核心硬件模块组成:
-
主控单元:树莓派4B(4GB内存版本)
- 选择原因:足够的计算能力运行轻量级YOLOv8模型
- 替代方案:Jetson Nano(成本较高但性能更好)
-
视觉模块:Raspberry Pi Camera Module V2
- 分辨率:支持1080p@30fps
- 安装位置:小车前方45度倾斜,兼顾地面和前方视野
-
驱动系统:
- 电机:12V直流减速电机(300RPM)
- 驱动板:L298N双H桥电机驱动模块
- 电源:18650锂电池组(2节串联,带保护板)
-
避障模块:HC-SR04超声波传感器
- 检测距离:2cm-400cm
- 安装角度:向前倾斜15度,检测前方障碍
2.2 软件架构
系统采用模块化设计,主要分为以下几个功能模块:
code复制感知层
├── 摄像头管理
├── 目标检测(YOLOv8)
└── 人脸识别(FaceNet)
决策层
├── PID控制器
├── 路径规划
└── 避障逻辑
执行层
├── 电机控制
└── 状态反馈
辅助模块
├── 蓝牙通信
├── 日志系统
└── 调试接口
3. 核心算法实现
3.1 目标检测模块
我们选择了YOLOv8-nano模型进行宠物和人物检测,主要考虑因素包括:
-
模型选择:
- YOLOv8-nano参数量仅3.2M
- 在树莓派上能达到8-10FPS的推理速度
- 准确率足够满足宠物检测需求
-
关键参数配置:
python复制# config/settings.yaml
detector:
model_path: "models/yolov8n.pt"
conf_threshold: 0.5 # 置信度阈值
iou_threshold: 0.45 # 重叠阈值
classes: ["dog", "cat", "person"] # 只检测这些类别
input_size: [640, 640] # 输入分辨率
- 距离估算算法:
python复制def _estimate_distance(self, bbox_height, frame_height, class_id):
# 已知目标平均高度(单位:米)
KNOWN_HEIGHTS = {
0: 1.7, # 成人高度
15: 0.3, # 猫平均高度
16: 0.5 # 狗平均高度
}
# 相机焦距(通过标定获得)
focal_length = 800 # 像素单位
if class_id not in KNOWN_HEIGHTS:
return 0.0
# 计算距离:距离 = (已知高度 × 焦距) / 像素高度
distance = (KNOWN_HEIGHTS[class_id] * focal_length) / bbox_height
return distance
3.2 人脸识别模块
为了确保小车只跟随自己的主人,我们增加了人脸识别验证:
-
工作流程:
- 先通过YOLOv8检测到人物
- 裁剪人脸区域并提取FaceNet特征
- 与预先注册的主人特征进行余弦相似度比对
-
关键代码:
python复制def verify_face(self, face_image):
# 提取人脸特征
input_tensor = self.transform(face_image).unsqueeze(0).to(self.device)
with torch.no_grad():
embedding = self.model(input_tensor)
# 计算与注册特征的相似度
similarity = cosine_similarity(embedding, self.owner_embedding)
return similarity > self.similarity_threshold
- 参数调优:
- 相似度阈值设为0.7(经过大量测试得出的平衡点)
- 人脸检测置信度要求0.9以上,减少误识别
4. 运动控制实现
4.1 PID控制器设计
跟随控制采用双PID控制器架构:
-
距离控制PID:
- 控制小车与目标的距离保持在1.5米左右
- 参数:Kp=0.8, Ki=0.01, Kd=0.05
-
角度控制PID:
- 控制小车始终面向目标
- 参数:Kp=1.2, Ki=0.02, Kd=0.08
-
电机混控算法:
python复制def calculate_motor_speeds(self, linear, angular):
# 将线速度和角速度转换为左右轮速度
base_speed = linear * self.max_speed
turn_adjust = angular * self.turn_sensitivity
left_speed = base_speed - turn_adjust
right_speed = base_speed + turn_adjust
# 限幅处理
left_speed = np.clip(left_speed, -1, 1)
right_speed = np.clip(right_speed, -1, 1)
return left_speed, right_speed
4.2 避障逻辑
超声波避障模块工作流程:
- 每100ms进行一次距离检测
- 当检测到前方0.5米内有障碍物时:
- 减速并重新计算路径
- 如果30cm内有障碍,立即停止
- 避障策略:
- 单侧障碍:向反方向微调
- 正前方障碍:停止并等待
5. 系统优化与调试
5.1 性能优化技巧
-
模型量化:
- 将YOLOv8模型转换为INT8量化版本
- 推理速度提升40%,精度损失约2%
-
多线程处理:
python复制# 创建处理管道
image_queue = Queue(maxsize=2)
result_queue = Queue(maxsize=2)
# 摄像头线程
def camera_thread():
while True:
ret, frame = camera.read()
if not image_queue.full():
image_queue.put(frame)
# 检测线程
def detection_thread():
while True:
frame = image_queue.get()
results = detector.detect(frame)
result_queue.put(results)
# 控制线程
def control_thread():
while True:
results = result_queue.get()
control.update(results)
- 电源管理:
- 采用动态频率调整
- 空闲时降低CPU频率
- 检测到长时间无目标进入低功耗模式
5.2 常见问题排查
-
目标丢失问题:
- 现象:小车偶尔会跟丢目标
- 解决方案:
- 增加目标丢失计数器
- 短暂丢失时按最后已知位置继续移动
- 超过3秒未发现则停止并报警
-
电机抖动问题:
- 现象:低速时电机出现明显抖动
- 解决方案:
- 提高PWM频率到1kHz以上
- 增加电机死区控制
- 软件滤波处理速度指令
-
阳光干扰问题:
- 现象:强光下人脸识别失败
- 解决方案:
- 增加曝光补偿算法
- 采用直方图均衡化预处理
- 备选RFID标签验证方案
6. 实际应用测试
6.1 测试场景设计
我们在三种典型场景下进行了系统测试:
-
公园开阔地:
- 测试距离:最长跟踪距离15米
- 速度测试:最高跟随速度1.2m/s
- 障碍测试:自动绕行树木、长椅等
-
小区道路:
- 行人干扰测试
- 坡度适应测试(最大15度)
- 突然转向测试
-
室内环境:
- 低光照测试
- 狭小空间避障
- 多宠物识别
6.2 性能指标
经过两周的实地测试,系统达到以下指标:
| 指标项 | 测试结果 |
|---|---|
| 最大跟随距离 | 15米(视线良好) |
| 平均跟随误差 | ±0.3米 |
| 响应延迟 | 200-300ms |
| 电池续航 | 3小时(连续使用) |
| 温度范围 | -10℃ ~ 45℃ |
7. 项目改进方向
根据实际使用反馈,下一步计划进行以下改进:
-
增加语音交互:
- 基础指令识别(停止、过来等)
- 状态语音反馈
-
多宠物识别:
- 扩展支持同时跟踪多只宠物
- 增加宠物个体识别功能
-
云端功能:
- 运动轨迹记录
- 电子围栏报警
- 远程状态查看
-
机械结构优化:
- 全地形轮胎升级
- 防水防尘设计
- 可折叠结构
这个项目从构思到实现用了约3个月时间,期间遇到了不少挑战,特别是如何在有限的计算资源下平衡检测精度和实时性。最终实现的系统虽然还有改进空间,但已经能很好地满足日常遛狗需求。