树莓派4B视觉识别机械臂制作教程:从零开始打造你的智能助手
在这个智能化的时代,结合计算机视觉和机械臂技术,我们可以打造一个既有趣又实用的智能助手。本文将详细介绍如何从零开始使用树莓派4B制作一个视觉识别机械臂,包含完整的硬件清单、接线图、代码实现和调试技巧。
一、项目概述
1.1 功能特点
- 视觉识别:基于OpenCV的物体识别和定位
- 机械臂控制:6轴机械臂,支持多种运动模式
- 自动抓取:识别物体后自动移动到目标位置并抓取
- 远程监控:实时摄像头画面传输
- 语音控制:支持语音命令控制机械臂动作
1.2 所需技能
- Linux系统基础操作
- Python编程基础
- OpenCV图像处理基础
- 基本的电路连接和焊接
- 3D打印(可选,用于机械臂外壳)
二、硬件清单
2.1 核心部件
| 名称 | 型号/规格 | 数量 | 用途 |
|---|---|---|---|
| 主控板 | 树莓派4B(4GB) | 1 | 核心控制器 |
| SD卡 | SanDisk Extreme 32GB Class 10 | 1 | 系统存储 |
| 摄像头 | 树莓派摄像头V2(800万像素) | 1 | 视觉采集 |
| 机械臂 | 6轴金属机械臂(带舵机) | 1 | 动作执行 |
| 舵机驱动板 | PCA9685 16通道PWM驱动 | 1 | 舵机控制 |
| 电源模块 | 5V 10A开关电源 | 1 | 供电 |
| LED灯带 | WS2812B RGB灯带(1米) | 1 | 状态指示 |
| 触摸屏 | 7寸1024×600电容触摸屏 | 1 | 人机交互 |
2.2 辅助配件
| 名称 | 规格 | 数量 | 用途 |
|---|---|---|---|
| 杜邦线 | 公对母、母对母各40根 | 1套 | 电路连接 |
| 面包板 | 830孔面包板 | 1 | 原型测试 |
| 电阻 | 10kΩ、1kΩ各10个 | 20 | 上拉、限流电阻 |
| 电容 | 100μF、10μF电解电容 | 5 | 滤波 |
| 开关 | 自锁开关、轻触开关各1 | 2 | 电源控制 |
| 散热片 | 树莓派专用散热片 | 1 | 散热 |
| 外壳 | 亚克力/3D打印外壳 | 1 | 机械臂底座 |
2.3 工具清单
- 电烙铁:30-40W恒温电烙铁
- 焊锡丝:0.8mm含铅焊锡
- 万用表:用于电压、电流测量
- 剥线钳:用于剥去线缆绝缘层
- 斜口钳:用于剪断线缆
- 螺丝刀套装:十字、一字各型号
- USB数据线:用于树莓派供电和数据传输
三、采购清单与预算
3.1 硬件采购清单
| 分类 | 物品 | 推荐品牌/型号 | 预计价格(元) | 购买渠道 |
|---|---|---|---|---|
| 主控 | 树莓派4B 4GB | 树莓派基金会 | 380 | 立创商城、淘宝 |
| 存储 | 32GB Class 10 SD卡 | SanDisk Extreme | 45 | 京东、淘宝 |
| 视觉 | 树莓派摄像头V2 | 树莓派基金会 | 130 | 立创商城、淘宝 |
| 机械臂 | 6轴金属机械臂套件 | DFRobot/淘宝 | 280 | 淘宝、亚马逊 |
| 驱动 | PCA9685舵机驱动板 | Adafruit/淘宝 | 25 | 淘宝、亚马逊 |
| 电源 | 5V 10A开关电源 | 明纬/航嘉 | 35 | 京东、淘宝 |
| 显示 | 7寸电容触摸屏 | 微雪/淘宝 | 120 | 淘宝 |
| 配件 | 杜邦线、电阻等 | 杂牌 | 30 | 淘宝 |
硬件总计:约1045元
3.2 软件准备
- 操作系统:Raspberry Pi OS(64位)
- 编程环境:Python 3.9+、OpenCV 4.5+
- IDE:Thonny或VS Code
- 库文件:RPi.GPIO、Adafruit_PCA9685、OpenCV
四、硬件连接与安装
4.1 树莓派引脚分配
PCA9685舵机驱动板(I2C):
- VCC → 5V电源
- GND → GND
- SDA → GPIO 2(SDA1)
- SCL → GPIO 3(SCL1)
摄像头模块:
- SDA → CSI接口
- SCL → CSI接口
- VCC → 3.3V
- GND → GND
触摸屏(HDMI接口):
- HDMI → HDMI0
- USB → USB3.0
- VCC → 5V
- GND → GND
LED灯带(GPIO控制):
- DATA → GPIO 18(PWM)
- VCC → 5V
- GND → GND
机械臂舵机连接(PCA9685通道):
- 底部旋转舵机 → 通道0
- 大臂舵机 → 通道1
- 小臂舵机 → 通道2
- 手腕舵机 → 通道3
- 手爪旋转舵机 → 通道4
- 手爪开合舵机 → 通道54.2 电源电路设计
5V 10A开关电源
│
├─→ 树莓派(5V/3A)
├─→ PCA9685驱动板(5V/2A)
├─→ 机械臂舵机(5V/3A)
├─→ 摄像头(5V/0.5A)
├─→ 触摸屏(5V/1A)
└─→ LED灯带(5V/0.5A)
注意:总电流约7A,电源需有足够余量重要提示:
- 确保电源输出稳定,电压纹波小于100mV
- 舵机工作时电流较大,建议添加1000μF滤波电容
- 树莓派GPIO口电流限制为16mA,不要直接驱动LED
- I2C总线(SDA/SCL)需要添加4.7kΩ上拉电阻
4.3 机械臂组装步骤
- 底座安装:将机械臂底座固定在亚克力板上
- 舵机安装:按顺序安装6个舵机到底座上
- 连杆组装:将机械臂各段通过连杆连接
- 线缆整理:使用扎带整理线缆,避免干扰
- 树莓派固定:将树莓派固定在底座后方
- 摄像头安装:将摄像头安装在机械臂前上方
五、软件安装与配置
5.1 系统安装
5.1.1 烧录系统镜像
下载Raspberry Pi OS(64位)并烧录到SD卡:
# 下载官方镜像
wget https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2023-05-03.zip
# 使用Raspberry Pi Imager烧录
# Windows: 下载Raspberry Pi Imager from https://www.raspberrypi.com/software/
# Linux/Mac: 使用dd命令烧录
dd if=raspios_arm64-2023-05-03.img of=/dev/sdX bs=4M status=progress5.1.2 首次启动配置
- 启动树莓派:插入SD卡、连接HDMI和USB键鼠
- 系统设置:选择语言、时区、WiFi等
- 更新系统:
sudo apt update sudo apt upgrade -y - 开启I2C和SPI:使用raspi-config配置
- 重启系统:
sudo reboot
5.2 开发环境搭建
5.2.1 安装Python依赖库
# 更新pip
pip3 install --upgrade pip
# 安装OpenCV
pip3 install opencv-python==4.7.0.72
# 安装PCA9685驱动库
pip3 install adafruit-circuitpython-pca9685
# 安装GPIO库
pip3 install RPi.GPIO
# 安装其他依赖
pip3 install numpy==1.24.3
pip3 install pillow==10.0.0
# 安装系统库
sudo apt install -y python3-dev
sudo apt install -y libi2c-dev
sudo apt install -y libopencv-dev5.2.2 启用摄像头接口
# 编辑config.txt
sudo nano /boot/config.txt
# 添加或取消注释以下行:
start_x=1
gpu_mem=128
# 重启
sudo reboot5.2.3 创建项目目录
# 创建项目目录
mkdir -p ~/robot_arm_project
cd ~/robot_arm_project
# 创建子目录
mkdir -p src
mkdir -p config
mkdir -p models
mkdir -p logs
# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate5.3 摄像头测试
创建摄像头测试脚本:
import cv2
import time
def test_camera():
# 初始化摄像头
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头!")
return
print("摄像头测试开始,按'q'键退出")
while True:
ret, frame = cap.read()
if not ret:
print("无法读取帧!")
break
# 显示画面
cv2.imshow('Camera Test', frame)
# 按'q'退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
print("摄像头测试结束")
if __name__ == '__main__':
test_camera()六、核心代码实现
6.1 PCA9685舵机控制
创建舵机控制模块:
from adafruit_servo import Servo
from board import SCL, SDA
import busio
import time
class ArmServoController:
def __init__(self):
# 初始化I2C总线
self.i2c = busio.I2C(SCL, SDA)
# 初始化PCA9685
self.pca = Servo(0, 0x40) # 使用I2C地址0x40
self.pca.frequency = 50
# 初始化6个舵机通道
self.servos = {
'base': Servo(0), # 通道0:底部旋转
'shoulder': Servo(1), # 通道1:大臂
'elbow': Servo(2), # 通道2:小臂
'wrist': Servo(3), # 通道3:手腕
'wrist_rot': Servo(4), # 通道4:手腕旋转
'gripper': Servo(5) # 通道5:手爪
}
# 初始位置(0-180度)
self.home_position = {
'base': 90,
'shoulder': 90,
'elbow': 90,
'wrist': 90,
'wrist_rot': 90,
'gripper': 90
}
# 移动到初始位置
self.move_to_home()
def move_to_home(self):
"""移动所有舵机到初始位置"""
print("机械臂归零中...")
for name, angle in self.home_position.items():
self.servos[name].angle = angle
time.sleep(1)
print("机械臂归零完成")
def move_servo(self, servo_name, angle):
"""移动指定舵机到指定角度
Args:
servo_name: 舵机名称(base, shoulder, elbow, wrist, wrist_rot, gripper)
angle: 角度(0-180)
"""
if servo_name in self.servos:
self.servos[servo_name].angle = angle
print(f"{servo_name}: {angle}度")
else:
print(f"未找到舵机: {servo_name}")
def set_pose(self, pose):
"""设置机械臂姿态
Args:
pose: 姿态字典 {'base': angle, 'shoulder': angle, ...}
"""
for name, angle in pose.items():
if name in self.servos:
self.servos[name].angle = angle
# 等待舵机移动完成
time.sleep(0.5)
def gripper_open(self):
"""打开手爪"""
self.servos['gripper'].angle = 0
time.sleep(0.5)
print("手爪已打开")
def gripper_close(self):
"""闭合手爪"""
self.servos['gripper'].angle = 180
time.sleep(0.5)
print("手爪已闭合")
def shutdown(self):
"""关闭所有舵机(释放脉冲)"""
for name, servo in self.servos.items():
servo.angle = None
print("机械臂已关闭")
if __name__ == '__main__':
# 测试舵机控制器
controller = ArmServoController()
# 测试各个舵机
controller.move_servo('base', 120)
time.sleep(1)
controller.move_servo('shoulder', 60)
time.sleep(1)
controller.gripper_open()
time.sleep(1)
controller.gripper_close()
time.sleep(1)
# 返回初始位置
controller.move_to_home()6.2 视觉识别模块
创建基于OpenCV的物体识别模块:
import cv2
import numpy as np
class VisionDetector:
def __init__(self):
# 初始化摄像头
self.cap = cv2.VideoCapture(0)
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
# 颜色定义(HSV)
self.colors = {
'red': {
'lower': np.array([0, 120, 70]),
'upper': np.array([10, 255, 255])
},
'green': {
'lower': np.array([40, 50, 50]),
'upper': np.array([80, 255, 255])
},
'blue': {
'lower': np.array([100, 100, 50]),
'upper': np.array([130, 255, 255])
}
}
# 目标物体中心点
self.target_center = None
def detect_object(self, color_name='red', show_frame=False):
"""检测指定颜色的物体
Args:
color_name: 颜色名称(red, green, blue)
show_frame: 是否显示处理画面
Returns:
(x, y): 物体中心坐标
success: 是否检测到物体
"""
if not self.cap.isOpened():
return None, False
ret, frame = self.cap.read()
if not ret:
return None, False
# 转换为HSV颜色空间
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 获取指定颜色的范围
color = self.colors.get(color_name)
if not color:
return None, False
# 创建颜色掩膜
mask = cv2.inRange(hsv, color['lower'], color['upper'])
# 形态学操作
kernel = np.ones((5,5), np.uint8)
mask = cv2.erode(mask, kernel, iterations=1)
mask = cv2.dilate(mask, kernel, iterations=2)
# 查找轮廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if contours:
# 找到最大的轮廓
largest_contour = max(contours, key=cv2.contourArea)
# 计算最小外接矩形
x, y, w, h = cv2.boundingRect(largest_contour)
# 计算中心点
center_x = x + w // 2
center_y = y + h // 2
# 在原图上绘制检测框
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.circle(frame, (center_x, center_y), 5, (0, 0, 255), -1)
self.target_center = (center_x, center_y)
if show_frame:
cv2.imshow(f'{color_name} Detection', frame)
return (center_x, center_y), True
else:
self.target_center = None
if show_frame:
cv2.imshow(f'{color_name} Detection', frame)
return None, False
def calibrate_camera(self):
"""摄像头标定(可选)"""
print("开始摄像头标定...")
# 使用棋盘格标定
chessboard_size = (9, 6)
square_size = 25 # mm
# 准备标定点
objp = np.zeros((chessboard_size[0]*chessboard_size[1], 3), np.float32)
objp[:,:2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)
objp *= square_size
objpoints = []
imgpoints = []
cap = self.cap
if not cap.isOpened():
print("无法打开摄像头进行标定!")
return
print("移动棋盘格到摄像头视野内,按'q'键拍摄下一张图片")
print("总共需要20张图片")
count = 0
while count < 20:
ret, frame = cap.read()
if not ret:
continue
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 寻找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)
if ret:
objpoints.append(objp)
corners = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1))
imgpoints.append(corners)
# 绘制角点
cv2.drawChessboardCorners(frame, chessboard_size, corners, True)
count += 1
print(f"已采集 {count}/20 张图片")
cv2.imshow('Camera Calibration', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if len(objpoints) > 0:
# 计算相机参数
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# 保存标定结果
print("标定完成!")
print("相机内参矩阵:")
print(mtx)
print("畸变系数:")
print(dist)
# 保存到文件
np.save('camera_calibration.npz', mtx=mtx, dist=dist)
return mtx, dist
else:
print("标定失败!")
return None, None
def release(self):
"""释放摄像头资源"""
if self.cap.isOpened():
self.cap.release()
print("摄像头已释放")
if __name__ == '__main__':
detector = VisionDetector()
# 测试物体检测
print("开始检测红色物体...")
while True:
center, success = detector.detect_object('red', show_frame=True)
if success:
print(f"检测到物体!中心点: ({center[0]}, {center[1]})")
if cv2.waitKey(1) & 0xFF == ord('q'):
break
detector.release()
cv2.destroyAllWindows()6.3 主控制程序
创建主控制程序,整合视觉识别和机械臂控制:
import cv2
import numpy as np
import time
import threading
from arm_servo_controller import ArmServoController
from vision_detector import VisionDetector
class RoboticArmController:
def __init__(self):
# 初始化视觉识别
self.vision = VisionDetector()
# 初始化机械臂
self.arm = ArmServoController()
# 目标位置(图像坐标)
self.target_position = None
# 工作空间边界(图像坐标系)
self.workspace = {
'left': 200,
'right': 1080,
'top': 100,
'bottom': 600
}
# 抓取序列
self.grab_sequence = [
{'base': 90, 'shoulder': 90, 'elbow': 90, 'wrist': 90, 'wrist_rot': 90, 'gripper': 90}, # 初始位置
{'base': 90, 'shoulder': 45, 'elbow': 45, 'wrist': 90, 'wrist_rot': 90, 'gripper': 90}, # 移动到上方
{'base': 90, 'shoulder': 45, 'elbow': 45, 'wrist': 45, 'wrist_rot': 90, 'gripper': 90}, # 下降
{'base': 90, 'shoulder': 45, 'elbow': 45, 'wrist': 45, 'wrist_rot': 90, 'gripper': 0}, # 打开手爪
{'base': 90, 'shoulder': 45, 'elbow': 45, 'wrist': 45, 'wrist_rot': 90, 'gripper': 90}, # 抓取
{'base': 90, 'shoulder': 45, 'elbow': 45, 'wrist': 45, 'wrist_rot': 90, 'gripper': 90}, # 抬起
{'base': 90, 'shoulder': 90, 'elbow': 90, 'wrist': 90, 'wrist_rot': 90, 'gripper': 90}, # 回到初始位置
]
self.is_running = False
self.capture_thread = None
def image_to_robot(self, image_point):
"""将图像坐标转换为机械臂关节角度
Args:
image_point: (x, y) 图像坐标
Returns:
angles: 舵机角度字典
"""
x, y = image_point
# 简化的逆运动学(实际应用需要更复杂的计算)
# 将图像坐标映射到关节角度
# X轴映射到base和shoulder
base_angle = 90 + (x - 640) * 0.1
base_angle = max(0, min(180, base_angle))
# Y轴映射到elbow和wrist
elbow_angle = 90 + (y - 360) * 0.1
elbow_angle = max(0, min(180, elbow_angle))
angles = {
'base': int(base_angle),
'shoulder': 90,
'elbow': int(elbow_angle),
'wrist': 90,
'wrist_rot': 90,
'gripper': 90
}
return angles
def detect_and_grab(self, color='red'):
"""检测并抓取物体
Args:
color: 目标物体颜色
"""
print(f"开始检测{color}色物体...")
# 1. 检测物体
center, success = self.vision.detect_object(color)
if not success:
print("未检测到目标物体!")
return False
print(f"检测到物体!位置: {center}")
# 2. 检查是否在工作空间内
x, y = center
if not (self.workspace['left'] <= x <= self.workspace['right'] and
self.workspace['top'] <= y <= self.workspace['bottom']):
print("物体超出工作空间范围!")
return False
# 3. 计算机械臂角度
angles = self.image_to_robot(center)
print(f"计算得到的机械臂角度: {angles}")
# 4. 移动到目标位置
print("移动到目标位置...")
self.arm.set_pose({
'base': angles['base'],
'shoulder': angles['shoulder'],
'elbow': angles['elbow'],
'wrist': angles['wrist'],
'wrist_rot': angles['wrist_rot'],
'gripper': angles['gripper']
})
time.sleep(1)
# 5. 执行抓取序列
print("开始抓取...")
self.execute_grab_sequence()
return True
def execute_grab_sequence(self):
"""执行抓取序列"""
for i, pose in enumerate(self.grab_sequence):
print(f"执行第{i+1}步...")
self.arm.set_pose(pose)
time.sleep(0.5)
print("抓取序列完成!")
def run_continuous_mode(self, color='red'):
"""连续抓取模式"""
self.is_running = True
while self.is_running:
success = self.detect_and_grab(color)
if success:
print("抓取成功!等待5秒后继续...")
time.sleep(5)
else:
print("抓取失败,重试中...")
time.sleep(1)
def stop(self):
"""停止连续抓取模式"""
self.is_running = False
print("连续抓取模式已停止")
def cleanup(self):
"""清理资源"""
print("正在清理资源...")
self.arm.move_to_home()
self.arm.shutdown()
self.vision.release()
print("资源清理完成")
if __name__ == '__main__':
# 创建控制器
controller = RoboticArmController()
try:
# 测试模式:检测并抓取一次
print("=== 测试模式 ===")
controller.detect_and_grab('red')
# 等待5秒
time.sleep(5)
# 连续模式:持续检测和抓取
print("\n=== 连续抓取模式 ===")
print("按Ctrl+C停止")
# 在单独的线程中运行连续模式
# controller.run_continuous_mode('red')
except KeyboardInterrupt:
print("\n用户中断")
finally:
# 清理资源
controller.cleanup()七、系统调试与优化
7.1 舵机校准
如果机械臂定位不准确,需要进行舵机校准:
def calibrate_servos(self):
"""舵机校准程序"""
print("开始舵机校准...")
for name, servo in self.servos.items():
print(f"校准{name}舵机...")
# 测试90度位置
servo.angle = 90
time.sleep(1)
# 测试0度位置
servo.angle = 0
time.sleep(1)
# 测试180度位置
servo.angle = 180
time.sleep(1)
# 返回90度
servo.angle = 90
time.sleep(1)
print(f"{name}舵机校准完成")
print("所有舵机校准完成!")7.2 视觉优化
def optimize_vision(self):
"""视觉优化"""
print("开始视觉优化...")
# 调整摄像头参数
self.cap.set(cv2.CAP_PROP_BRIGHTNESS, 50) # 亮度
self.cap.set(cv2.CAP_PROP_CONTRAST, 50) # 对比度
self.cap.set(cv2.CAP_PROP_SATURATION, 50) # 饱和度
self.cap.set(cv2.CAP_PROP_EXPOSURE, -6) # 曝光
# 自动白平衡
self.cap.set(cv2.CAP_PROP_AUTO_WB, 1)
# 自动曝光
self.cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 1)
print("视觉参数已优化!")7.3 性能监控
import psutil
def monitor_system():
"""系统性能监控"""
cpu_percent = psutil.cpu_percent(interval=1)
memory = psutil.virtual_memory()
disk = psutil.disk_usage('/')
print("=== 系统性能 ===")
print(f"CPU使用率: {cpu_percent}%")
print(f"内存使用: {memory.percent}%")
print(f"磁盘使用: {disk.percent}%")
# 检查温度
try:
temps = psutil.sensors_temperatures()
for name, entries in temps.items():
for entry in entries:
print(f"{name} {entry.label}: {entry.current}°C")
except Exception as e:
print(f"无法读取温度: {e}")
if __name__ == '__main__':
monitor_system()八、常见问题与解决
8.1 树莓派无法启动
问题:树莓派上电后无反应
解决:
- 检查SD卡是否正确插入
- 使用新的SD卡重新烧录系统
- 检查电源是否正常(5V/3A)
- 检查HDMI线是否连接正确
8.2 摄像头无法识别
问题:无法打开摄像头
解决:
- 检查摄像头排线是否连接正确
- 在 /boot/config.txt 中启用 start_x=1
- 执行 ls /dev/video* 检查摄像头设备
- 重启系统后再试
8.3 舵机抖动
问题:舵机运动时抖动严重
解决:
- 检查电源是否足够(电流不足会导致抖动)
- 在PCA9685驱动板上添加1000μF滤波电容
- 调整舵机速度参数
- 检查机械臂是否有摩擦
8.4 视觉识别不准确
问题:物体识别失败或位置偏差大
解决:
- 调整HSV颜色范围
- 改善光照条件
- 进行摄像头标定
- 使用更高分辨率的摄像头
8.5 机械臂动作卡顿
问题:机械臂移动不流畅
解决:
- 检查I2C通信是否正常
- 增加舵机运动延迟时间
- 优化代码,减少不必要的计算
- 使用更快的Python解释器(如PyPy)
九、项目扩展与优化
9.1 深度学习识别
使用TensorFlow Lite或PyTorch Mobile实现更高级的物体识别:
import tensorflow as tf
# 加载预训练模型
model = tf.saved_model.load('models/object_detection')
def detect_objects_with_ml(self):
"""使用深度学习模型检测物体"""
# 加载图像
ret, frame = self.cap.read()
# 预处理
input_tensor = tf.convert_to_tensor(frame)
input_tensor = input_tensor[tf.newaxis, ...]
# 预测
detections = model(input_tensor)
# 处理检测结果
return detections9.2 语音控制
集成语音识别模块,实现语音控制机械臂:
import speech_recognition as sr
class VoiceController:
def __init__(self):
self.recognizer = sr.Recognizer()
def listen_command(self):
"""监听语音命令"""
with sr.Microphone() as source:
print("正在聆听...")
audio = self.recognizer.listen(source)
try:
command = self.recognizer.recognize_google(audio, language='zh-CN')
print(f"识别到命令: {command}")
return command
except sr.UnknownValueError:
print("无法识别语音")
return None
except sr.RequestError as e:
print(f"语音识别服务错误: {e}")
return None
if __name__ == '__main__':
voice = VoiceController()
command = voice.listen_command()
if command and '抓取' in command:
print("执行抓取动作...")
# 调用机械臂抓取函数
elif command and '放下' in command:
print("执行放下动作...")
# 调用机械臂放下函数9.3 远程控制
使用Flask创建Web服务器,实现远程控制:
from flask import Flask, jsonify, request
app = Flask(__name__)
arm_controller = None
@app.route('/api/grab', methods=['POST'])
def grab_command():
"""抓取命令API"""
color = request.json.get('color', 'red')
success = arm_controller.detect_and_grab(color)
return jsonify({'success': success})
@app.route('/api/move', methods=['POST'])
def move_command():
"""移动命令API"""
pose = request.json.get('pose')
arm_controller.arm.set_pose(pose)
return jsonify({'success': True})
@app.route('/api/status')
def status_command():
"""状态查询API"""
status = {
'running': arm_controller.is_running,
'gripper_closed': False
}
return jsonify(status)
if __name__ == '__main__':
# 初始化控制器
arm_controller = RoboticArmController()
# 启动Web服务器
app.run(host='0.0.0.0', port=5000, debug=True)十、项目总结
10.1 成本总结
| 类别 | 项目 | 预估成本(元) |
|---|---|---|
| 核心硬件 | 树莓派4B + SD卡 + 摄像头 | 555 |
| 机械臂 | 6轴金属机械臂 + 驱动板 | 305 |
| 配件 | 电源、触摸屏、LED灯带等 | 185 |
| 总计 | 约1045元 |
10.2 项目收获
- 掌握了树莓派GPIO和I2C通信
- 学习了OpenCV图像处理和物体识别
- 理解了舵机控制和逆运动学基础
- 掌握了Python多线程编程
- 提升了系统集成和调试能力
10.3 后续改进方向
- 引入深度学习:使用TensorFlow Lite实现更准确的物体识别
- 增加6轴力反馈:在机械臂上增加力传感器,实现更精细的控制
- 开发移动APP:使用React Native开发手机APP,实现远程监控和控制
- 集成ROS:使用Robot Operating System实现更复杂的机器人控制
- 添加AI决策:集成GPT模型,实现自主决策和任务规划
十一、参考资源
11.1 硬件资源
- 树莓派官网:https://www.raspberrypi.com/
- Adafruit驱动库:https://github.com/adafruit/Adafruit_CircuitPython_PCA9685
- OpenCV官方文档:https://docs.opencv.org/4.x/
- 机械臂供应商:https://www.dfrobot.com.cn/
11.2 软件资源
- Python官方文档:https://docs.python.org/3/
- OpenCV-Python:https://github.com/opencv/opencv-python
- RPi.GPIO:https://pypi.org/project/RPi.GPIO
- Flask官方文档:https://flask.palletsprojects.com/
11.3 学习资源
- 树莓派教程:https://www.raspberrypi.org/documentation/
- OpenCV教程:https://www.learnopencv.org/
- 机器人学基础:https://www.coursera.org/learn/robotics
- Python图像处理:https://www.pyimagesearch.com/
版权声明:本文原创,欢迎转载分享,请注明出处。
作者:AI助手
发布日期:2026年2月9日
适用版本:树莓派4B + Raspberry Pi OS (64位) + Python 3.9+
祝你DIY愉快!有任何问题欢迎在评论区交流讨论!
评论 (0)