最近在折腾智能家居自动化时,发现一个特别有意思的开源项目——OpenClaw。这个项目原本是设计用来控制机械臂完成抓取动作的,但社区里的大神们开发出了各种骚操作,比如用它来远程操控家电、自动浇花,甚至还有人实现了通过QQ聊天机器人来控制硬件设备。
今天要分享的就是如何配置OpenClaw项目,让它能够通过QQ接收指令并执行相应动作。这个方案特别适合想玩智能家居但预算有限的朋友,整套系统搭建下来成本不到200元,却可以实现很多昂贵的智能家居系统才有的功能。
要完成这个项目,你需要准备以下硬件设备:
特别提醒:购买OpenClaw套件时要注意版本兼容性。目前市面上主要有v1.2和v2.0两个主流版本,本教程基于v2.0版本开发,但v1.2版本通过固件升级也能兼容。
首先需要在树莓派上安装基础系统:
bash复制# 下载最新版Raspberry Pi OS
wget https://downloads.raspberrypi.org/raspios_lite_armhf_latest
# 刷写系统到SD卡
sudo dd if=raspios_lite_armhf_latest of=/dev/mmcblk0 bs=4M status=progress
系统启动后,需要安装必要的依赖库:
bash复制sudo apt update
sudo apt install -y python3-pip git libopencv-dev
pip3 install opencv-python numpy RPi.GPIO
注意:如果使用USB摄像头,建议先测试摄像头能否正常工作:
bash复制sudo apt install fswebcam fswebcam test.jpg
从GitHub克隆OpenClaw的官方代码库:
bash复制git clone https://github.com/OpenClaw/OpenClaw.git
cd OpenClaw/examples/python
连接机械臂到树莓派的GPIO口,默认接线方式如下:
| 机械臂接口 | 树莓派GPIO |
|---|---|
| 信号线 | GPIO17 |
| 电源+ | 5V |
| 电源- | GND |
运行测试脚本验证机械臂是否正常工作:
python复制import time
from openclaw import OpenClaw
claw = OpenClaw()
claw.open() # 张开爪子
time.sleep(1)
claw.close() # 闭合爪子
OpenClaw提供了丰富的运动控制API,以下是一些常用功能的封装示例:
python复制class ClawController:
def __init__(self):
self.claw = OpenClaw()
self.current_state = "open"
def toggle(self):
if self.current_state == "open":
self.claw.close()
self.current_state = "closed"
else:
self.claw.open()
self.current_state = "open"
def wave(self, times=3):
for _ in range(times):
self.claw.open()
time.sleep(0.3)
self.claw.close()
time.sleep(0.3)
目前最稳定的方案是使用官方QQ机器人框架NoneBot2。首先安装必要的Python包:
bash复制pip3 install nonebot2 nonebot-adapter-cqhttp
创建项目目录结构:
code复制mkdir qqbot
cd qqbot
touch bot.py config.py
在config.py中配置机器人参数:
python复制from nonebot.default_config import *
HOST = '0.0.0.0'
PORT = 8080
SUPERUSERS = {12345678} # 你的QQ号
COMMAND_START = {'/', '!'}
在bot.py中编写机械臂控制指令:
python复制from nonebot import on_command
from nonebot.rule import to_me
from nonebot.adapters.cqhttp import Bot, Event
from openclaw import OpenClaw
claw = OpenClaw()
claw_control = on_command("claw", rule=to_me(), priority=5)
@claw_control.handle()
async def handle_claw(bot: Bot, event: Event):
args = str(event.get_message()).strip()
if args == "open":
claw.open()
await claw_control.finish("爪子已张开")
elif args == "close":
claw.close()
await claw_control.finish("爪子已闭合")
else:
await claw_control.finish("用法: /claw [open|close]")
为了让控制更有趣,可以添加拍照反馈功能:
python复制import cv2
camera = on_command("photo", rule=to_me(), priority=5)
@camera.handle()
async def take_photo(bot: Bot, event: Event):
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
if ret:
cv2.imwrite('temp.jpg', frame)
await bot.send(event, {
"type": "image",
"data": {
"file": "file:///home/pi/qqbot/temp.jpg"
}
})
cap.release()
创建systemd服务文件/etc/systemd/system/openclawbot.service:
ini复制[Unit]
Description=OpenClaw QQ Bot
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/qqbot/bot.py
WorkingDirectory=/home/pi/qqbot
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
启用服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable openclawbot
sudo systemctl start openclawbot
pigpio库替代RPi.GPIO可以获得更精确的PWM控制picamera库替代OpenCV掌握了基础控制后,可以尝试这些有趣的扩展:
我在实际使用中发现,机械臂的响应延迟主要来自网络通信环节。通过将NoneBot2部署在内网穿透服务器上,可以显著降低指令延迟。另外,给机械臂末端加上磁铁或吸盘,可以大大扩展它的应用场景。