- 智能硬件
- 机器人
- 嵌入式
- 硬件开发
【免费下载链接】ElectronBot
AutoHotkey(AHK)是一种可以用记事本编辑、保存即运行的脚本语言,本仓库的3.Software/_Tools/AHK-ExpansionPack目录提供了一整套基于稚晖君 ElectronBot SDK 的玩法扩展示例,覆盖微信控制、智能家居、人脸/手势同步、网页远程控制、语音交互、热拔插推送表情与热键调试等八大场景。读完本文,你将掌握如何使用 AutoHotkey 直接通过DllCall调用 ElectronBot 的底层 SDK 接口,理解六自由度关节参数的含义与取值范围,并能直接复现、组合这些示例,把 ElectronBot 变成可被脚本任意调度的桌面机器人。
一、为什么用 AutoHotkey 驱动 ElectronBot
ElectronBot 官方上位机(SDK Player)负责姿势调整、表情推送,但每次都要打开上位机、手动拖参数、再同步。而 AutoHotkey 天生就是为"监听系统事件、模拟键盘、按条件触发动作"而生的脚本语言,把它和 ElectronBotSDK 结合,就能实现:
- 把任何系统事件(时间、进程、热键、微信消息、语音、网络请求)转成机器人的姿势或表情;
- 免编译、免界面,
记事本编辑.ahk文件后直接运行; - 复用 AHK 自身对电脑状态的判断与调用能力,例如"判断时间设置电脑音量""ElectronBot 做姿势时同时播报自定义语音""判断进程状态决定开关某程序"等。
所有示例都采用同一套 DllCall 调用模式:脚本通过DllCall加载目录下的ElectronBotSDK-LowLevel.dll/ElectronBotSDK-Player.dll,并调用导出的AHK_*系列 C 接口,将参数同步上传到 ElectronBot,因此无需任何前端界面。
二、环境准备:安装与编辑
- 到 AutoHotkey 官网下载安装包(体积约 3MB),建议使用默认选项安装。虽然 AHK 可以将解释器与脚本设为同名实现免安装运行,但安装后更方便用右键菜单
Edit Script直接编辑、调试脚本。 - 安装完成后,对任意
.ahk文件右键选择Edit Script即可用记事本打开编辑,保存后双击即可运行(SetBatchLines -1等脚本头可保证执行效率)。 - 每个示例目录内都附带了详细截图与代码注释;示例运行前先退出其它上位机,确保只有当前脚本独占连接 ElectronBot。
三、核心前置:SDK 的 AHK 接口与姿势参数约定
3.1 LowLevel SDK 导出的 C 接口
目录3.Software/_Tools/AHK-ExpansionPack/ElectronBotSDK/ElectronBotSDK源码/ElectronBotSDK-LowLevel/src/electron_low_level.h定义了供 AHK 调用的extern "C"导出函数:
| 接口 | 作用 |
|---|---|
AHK_New() | 创建 SDK 对象并返回指针 |
AHK_Connect(void*)/AHK_Disconnect(void*) | 连接 / 断开 USB 设备 |
AHK_SetJointAngles(void*, j1..j6, enable) | 设置六自由度关节角度 |
AHK_SetImageSrc_Path(void*, path) | 设置屏幕图像(文件路径) |
AHK_SetImageSrc_MatData(void*, data) | 设置屏幕图像(内存像素数据) |
AHK_Sync(void*) | 将以上设置一次性同步上传 |
AHK_GetJointAngles(void*, float*) | 回读当前关节角度 |
AHK_SetExtraData/AHK_GetExtraData | 读写额外数据通道(示例中未实际测试) |
Player SDK 额外导出AHK_Play(播放表情/视频)、AHK_Stop、AHK_SetPlaySpeed、AHK_GetPose,见 electron_player.h。
3.2 六自由度姿势参数表
示例脚本统一封装了LowLevelSDK类,其同步姿势()方法的参数顺序与含义(与官方上位机一致)如下:
| 参数 | 含义 | 合法范围 |
|---|---|---|
| 参1(j1) | 头部 | -15 ~ 15 |
| 参2(j6) | 身体转向 | -90 ~ 90 |
| 参3(j2) | 左臂展开 | -30 ~ 30 |
| 参4(j3) | 左臂抬起 | -180 ~ 180 |
| 参5(j4) | 右臂展开 | -30 ~ 30 |
| 参6(j5) | 右臂抬起 | -180 ~ 180 |
| 参7(可选) | 表情/图片文件路径 | 本地文件路径 |
调用时先DllCall("...\AHK_SetJointAngles", ...)设置角度,若指定了图片路径则再AHK_SetImageSrc_Path设置图像,最后AHK_Sync一次上传。注意封装层的参数顺序(头部、身体转向、左臂展开、左臂抬起、右臂展开、右臂抬起)与原 C++ SDK 的SetJointAngles顺序并不一一对应,脚本注释中已标明"原SDK对应:j1=头部、j2=左臂展开、j3=右臂抬起、j4=右臂展开、j5=左臂抬起、j6=身体转向"。
3.3 底层图像帧规格
官方底层 SDK 中frameBufferTx[2][240*240*3]定义了 240×240 的 RGB 屏幕帧缓冲(见 electron_low_level.h),这解释了为何后续人脸、视频抽帧示例都要把图像resize到 240×240;SDK 默认的 USB VID 为0x1001、PID 为0x8023。
四、示例 1:通过微信控制 ElectronBot
脚本 Acc取微信消息来控制ElectronBot.ahk 演示了如何用 Windows 无障碍(Accessible,Acc)接口读取微信 PC 版的消息内容,把"收到的指定格式消息"当作控制信号。
- 使用方法:退出其它上位机 → 打开微信 PC 版与脚本 → 向自己(建议置顶方便收发)发送形如
姿势∶15,0,0,0,30,150的命令 → 脚本每隔 1 秒读取一次最新消息并同步到 ElectronBot。 - 兼容性:适配 2022.8.3 当天微信 PC 版最新版本 3.7.5.23,作者自测 3.4.5.27 ~ 3.7.5.23 可用,且将微信窗口最小化可后台接收。
- 调试:按
F3模拟读取微信消息并同步,按F4直接同步一组固定姿势,用于验证 SDK 链路是否正常。
核心逻辑:
F1循环: WinGet, IDHwnd, ID , 微信 ahk_class WeChatMainWndForPC if WinExist("ahk_id " IDHwnd) { oAcc := AccGet(IDHwnd, "4.1.2.2.2.1.1.1.1.1.1.2.1.1.1") ; 微信用户名 oAcc2 := AccGet(IDHwnd, "4.1.2.2.2.1.1.1.1.1.1.2.2.1") ; 第一个用户的最后一条信息 微信用户名 := oAcc.accName(oAcc.accChildCount) 最后一条信息 := oAcc2.accName(oAcc2.accChildCount) if (InStr(最后一条信息, "姿势")!=0) { ; 用"姿势"二字作为自定义命令识别 分割成数组 := StrSplit(最后一条信息, ",") 姿势.同步姿势(RegExReplace(分割成数组[1], "\D"), 分割成数组[2], 分割成数组[3], 分割成数组[4], 分割成数组[5], 分割成数组[6]) } } Return要点:AccGet通过DllCall加载oleacc.dll并调用AccessibleObjectFromWindow,再按"4.1.2.2..."这种路径逐级索引子树节点;RegExReplace(分割成数组[1], "\D")会把"姿势∶15"中的非数字字符剥离,从而得到第 1 个关节角度。若右下角没有收到微信信息,说明 Acc 无法获取微信内容(微信版本升级可能导致树路径失效);若收到了信息但机器人无反应,请退出其它上位机并重新插拔 ElectronBot。
五、示例 2:用继电器硬改实现对智能家居的控制
串口通信_长按示例.ahk 采用"硬改"思路:以小米无线开关为例,用 CH340 驱动的继电器模拟按键的单击、双击、长按,从而让电脑(经由 AHK 的 RS232 串口通信)直接控制智能家居。其串口参数如下:
RS232_Port := "COM1" ; 改成继电器对应的COM号 RS232_Baud := 9600 RS232_Parity := "N" RS232_Data := 8 RS232_Stop := 1 RS232_Settings := RS232_Port ":baud=" RS232_Baud " parity=" RS232_Parity " data=" RS232_Data " stop=" RS232_Stop " dtr=Off"长按 1.3 秒的实现(按下 → 延时 → 抬起):
RS232_Write(RS232_FileHandle, "0xA0,0x01,0x03,0xA4") ; 按下 Sleep 1300 ; 延时1.3秒=长按效果 RS232_Write(RS232_FileHandle, "0xA0,0x01,0x02,0xA3") ; 抬起双击则是在两次"按下/抬起"之间插入约 100ms 间隔。底层RS232_Initialize用BuildCommDCB构造 DCB、CreateFile打开串口、SetCommState/SetCommTimeouts完成配置;RS232_Write把逗号分隔的十六进制字节解析写入缓冲区后调用WriteFile发送。脚本还处理了COM 口大于 9 时必须加\\.\前缀的经典坑位,并用\\.\方式支持 USB-Serial 转接设备。作者也提示,除继电器外完全可以用 Arduino + MOS 管实现同样的单击/双击/长按逻辑。
六、示例 3:"量子纠缠"Demo:摄像头人脸同步
量子纠缠Demo.ahk 模仿稚晖君视频中的"量子纠缠"效果:从摄像头截取人脸,实时同步到 ElectronBot 的脸部屏幕,同时做出右手挥手动作。运行前需把脚本与 haarcascade_frontalface_default.xml 放到ElectronBotSDK目录,并确保摄像头画面中有可识别面部。
核心流程:
; 加载OpenCV COM组件 hOpenCV := DllCall("LoadLibrary", "Str", "opencv_world455.dll", "Ptr") hOpenCVCom := DllCall("LoadLibrary", "Str", "autoit_opencv_com455.dll", "Ptr") cv := ComObjCreate("OpenCV.cv") Cap := ComObjCreate("OpenCV.CV.VideoCapture") Cap.open(0) ; 摄像头编号从0开始 faceCascade := ComObjCreate("Opencv.cv.CascadeClassifier") faceCascade.load("haarcascade_frontalface_default.xml") Loop { Ret := Cap.read(Frame) frame := cv.rotate(frame, 2) ; 适配ElectronBot的屏幕方向 faces := faceCascade.detectMultiScale(Frame, 1.1+0, 10+0) if (faces.MaxIndex()>-1) { frame := Crop(frame, faces[0]) ; 裁剪人像 frame := cv.resize(frame, ComArrayMake([240, 240])) ; 缩放到240x240 frame := cv.cvtColor(frame, 3) ; CV_BGRA2RGB := 3 姿势.设置姿势(15, 0, ( (_Waving:=!_Waving) ? 0 : 30), 130, 0, 0) ; 挥动左手 姿势.设置图像Data(frame.data()) 姿势.同步() } else { 姿势.同步姿势(0, 0, 0, 0, 0, 0) ; 检测不到面部就回正 } }实现细节:Crop函数通过对Img.Row/Img.Col的vconcat/hconcat实现矩形裁剪;像素数据经AHK_SetImageSrc_MatData直接以内存指针上传,与 3.3 节的 240×240 帧缓冲规格对应。若画面无图像,先尝试删除cv.rotate或改用注释中的"纯人脸识别完整显示"(CV.imshow)排查摄像头取流。
七、示例 4:网页控制与网络互动
目录 4.ElectronBot网页控制与网络互动 演示了两件事:
- 网页控制:网页控制ElectronBot.ahk 用 AHK 内置的
HttpServer类在本地起一个 HTTP 服务(默认端口 8866),把网页路径映射到控制函数:
paths := {"/" : Func("主界面") , "/DianTou" : Func("点头") , "/ZuoShou" : Func("左手驱动") , "/YouShou" : Func("右手驱动") , "/BiaoQing" : Func("表情测试")} Server := New HttpServer() Server.LoadMimes("mime.types") Server.SetPaths(paths) HTTP服务端口 := 8866 Server.Serve(HTTP服务端口) Run "http://127.0.0.1:%HTTP服务端口%/" ; 启动后自动打开控制台网页页面上的"点头""左手驱动""右手驱动""表情测试"按钮通过window.location.href跳转到对应路由,服务端 handler 再调用姿势.同步姿势(...)或表情.播放表情("video.mp4"),并返回一段history.go(-1)的脚本让浏览器退回主界面。mime.types为静态文件提供 Content-Type 映射。因为监听的是本机端口,手机或电脑只要访问同一网络内的该地址即可远程操控 ElectronBot。
- TCP 互动:Tcp通信测试【主机端】.ahk 与
Tcp通信测试【接收端】.ahk用SocketTCP类(基于 Winsock 的socket/bind/listen/accept/send/recv+WSAAsyncSelect事件模型)验证两台电脑之间的通信:主机端监听0.0.0.0:33345,按F1发送姿势∶15,0,0,0,30,150、按F2发送回正指令,接收端解析后驱动各自的 ElectronBot——由此可在局域网甚至公网 IP 下远程同步两台机器人的互动反应。
八、示例 5:摄像头手势识别与动作同步
此示例需要配合另一个 AHK 手势识别项目VisualGestureRecognition使用:将本目录的MyAHKScript、Lib、ElectronBotSDK三个文件夹放到手势识别项目主脚本同目录并覆盖替换后,重新启动并开启手势识别即可。手势参数建议参考 推荐手势设置.jpg 中标注的刷新间隔、画面旋转角度与相同命令识别间隔进行配置。
预设的手势与机器人动作对应关系:
| 识别到的手势 | ElectronBot 反应 |
|---|---|
| 双手放下 | 回正 |
| 单手举起握拳 | 同步举手 |
| 单手举起做剪刀手 | 同步剪刀手 |
| 双手举起握拳 | 执行一套预设长动作 |
目录 MyAHKScript 下的1-1-9-9.ahk等文件即"双手举起握拳"的长动作编排:通过大量Sleep与同步姿势序列组合出招手、侧身拍打、高举晃动、拜拜等连贯动作,结束后调用表情.播放表情("video.mp4")收尾。文件中还示范了Global LLSDKFilePath := "test.jpg"这种全局变量指定表情的技巧,让该脚本内所有同步姿势自动附带同一张图片。
注意:使用说明.txt明确指出,此示例是用"不断识别后以新进程方式连接并驱动 ElectronBot"实现的,仅适合演示;若要稳定使用,应把整个流程写进同一个脚本进程内。
九、示例 6:语音控制 ElectronBot
6.语音控制ElectronBot.ahk 调用 Windows 自带 API(SAPI)实现语音识别与播报,让 ElectronBot 变成"语音助手":
- 唤醒流程:说出唤醒词"电子电子",识别器回调里播放同步语音"在呢"(用
ComObjCreate("SAPI.SpVoice").Speak(...)的同步播报顺带充当延时),并打开命令执行开关(SetTimer 无应答重置, -5000实现唤醒后 5 秒无命令自动失效)。 - 命令表:
"你好"(招手 2 次)、"左手"(抬左臂)、"右手"(抬右臂)、"点头"(点头 2 下)、"开心"(播放 video.mp4),执行后异步播报"你说了:..."。
Class 唤醒词类 extends SpeechRecognizer { OnRecognize(Text) { if (Text = "电子电子") { ToolTip % "唤醒词:" Text, A_ScreenWidth//1.13, A_ScreenHeight//1.13 ComObjCreate("SAPI.SpVoice").Speak("在呢") 执行命令开关 := 1 SetTimer 无应答重置, -5000 } } }SpeechRecognizer类(Uberi 封装的 SAPI 封装)通过SAPI.SpInprocRecognizer获取音频输入,CreateGrammar后用AddWordTransition注册短语规则,识别结果经SpeechRecognizer_Recognition回调分发到OnRecognize;TTS类则基于SAPI.SpVoice提供Speak/SpeakWait/SetRate/SetVolume/SetPitch等能力。系统要求:语音识别依赖系统自带的语音 API,精简版系统可能被删减,若脚本运行时报错则说明缺少 TTS 组件;用原版镜像安装的系统基本可用。作者已提供 SDK 调用方法,具体语音方案可自行替换。
十、示例 7:连接 ElectronBot 时自动推送表情
ElectronBot 每次接入 USB 都会先显示默认花屏,7.连接ElectronBot时自动推送表情.ahk 通过注册 USB 设备监控事件,让插入瞬间自动同步指定表情与姿势:
OnMessage(0x219, "WM_DEVICECHANGE") ; 注册USB设备监控事件 拔出时数组 := JEE_DeviceList() ; 记录拔出前的设备列表 WM_DEVICECHANGE(wParam, lParam, msg, hwnd) { Global if (wParam=0x8000) { ; DBT_DEVICEARRIVAL 插入时 插入时数组 := JEE_DeviceList() Loop % 插入时数组.Length() { if (插入时数组[A_Index]!=拔出时数组[A_Index]) { ElectronBot初始化(新进程代码) Break } } } else if (wParam=0x8004) { ; DBT_DEVICEREMOVECOMPLETE 拔出时 拔出时数组 := JEE_DeviceList() } }JEE_DeviceList通过setupapi.dll枚举 USB 设备并读取DEVPKEY_Device_FriendlyName,筛选含(COM...)的设备名。检测到新设备插入后,脚本把一段"新进程代码"(AHK_New → AHK_Connect → AHK_SetJointAngles → AHK_SetImageSrc_Path → AHK_Sync → AHK_Disconnect的最小化流程)通过WScript.Shell.Exec以临时进程方式执行,从而在不阻塞主脚本的前提下完成表情推送。脚本注释中还提供了按 COM 端口过滤(如InStr(设备名, "(COM8")!=0)的写法,以及播放 Player 表情的模板代码。此脚本可与示例 8 合并,实现"热拔插同步表情 + 热键连接调试"一体化。
十一、示例 8:热键快速调试 ElectronBot
日常调试需要打开上位机调整参数再同步,而 8.热键快速调试ElectronBot.ahk 把常用调试动作绑定到键盘热键,运行即测:
| 热键 | 动作 |
|---|---|
| F1 / F2 | 头部上 / 头部下 |
| F3 | 弹出文件选择框选择表情文件并播放 |
| Up / Down | 左手抬起 / 放下 |
| Left / Right | 右手抬起 / 放下 |
F1::姿势.同步姿势(15, 0, 0, 0, 0, 0) ; 头部上 F3:: FileSelectFile, 返回路径, , ,选择ElectronBot的表情, 文件(*.jpg; *.png; *.bmp; *.mp4; *.mov) 表情.播放表情(返回路径) Return脚本启动时会先执行一组"点头"动作(同步姿势(15,...)后Sleep 100再同步姿势(0,...),并附带test.jpg)以确认连接成功。PlayerSDK.播放表情内部会先AHK_Stop再重建对象重新AHK_Connect,因此连续播放两个表情之间必须保证至少 150ms 延时,避免线程抢占卡死。
十二、进阶:组合与扩展思路
除 8 个现成示例外,一套演示动作示例.ahk 提供了更完整的动作编排参考,并给出了两个可直接复用的函数:
异步抽帧上传表情(video):用 OpenCV 的VideoCapture读取视频,按fps/10的间隔抽帧(10 帧/秒),每帧resize到 240×240、cvtColor(..., 3)转 RGB 后通过AHK_SetImageSrc_MatData上传——这是"让表情动起来"的关键;因为 10 帧/秒的单帧间隔为 166ms,故动作间的Sleep建议不小于 180ms。脚本还处理了中文路径(复制到A_AppDataCommon下再打开)的问题。异步播放音频(file):基于winmm.dll的mciSendString实现异步播放,可让机器人动作配上音效。
在此基础上,可以自然衍生更多玩法:判断时间自动调音量、姿势触发语音播报、监听进程状态开关程序、把示例 7 与示例 8 合并等。几处容易踩坑的约定值得牢记:
- ElectronBot 需要64 位 AHK 解释器(示例 7 对此有显式检查提示);
- 运行任何控制脚本前先退出其它上位机,独占 USB 连接;
同步姿势的参数有合法范围(见 3.2 表格),超范围无效;- Player 播放表情前后保留至少 150ms 延时。
十三、仓库资源索引
- 玩法总览与使用说明:3.Software/_Tools/AHK-ExpansionPack/README.md
- 各示例脚本与截图:
3.Software/_Tools/AHK-ExpansionPack/下1.~8.目录及根目录脚本 - AHK 版 SDK 源码:
3.Software/_Tools/AHK-ExpansionPack/ElectronBotSDK/ElectronBotSDK源码/(LowLevel 与 Player 的AHK_*导出实现) - 官方 C++ 底层 SDK:electron_low_level.h、electron_low_level.cpp
- Player 上层封装:electron_player.h、sample.cpp
- 完整 SDK 依赖(DLL、OpenCV、表情视频):
3.Software/_Tools/AHK-ExpansionPack/ElectronBotSDK/
借助这份扩展包,ElectronBot 不再局限于上位机的手动操作,而是可以被微信、语音、网页、手势、热键乃至任何 AHK 可感知的系统事件所驱动——把它当作一个可编程的桌面实体交互终端来使用。
- 智能硬件
- 机器人
- 嵌入式
- 硬件开发
【免费下载链接】ElectronBot
相关推荐
3种方案玩转虚拟显示驱动:Windows多屏扩展完全指南
3种方案玩转虚拟显示驱动:Windows多屏扩展完全指南 虚拟显示驱动是什么? 虚拟显示驱动通过软件模拟额外显示器,让Windows系统识别不存在的物理屏幕,实
驱动开发React Redux 9.x 终极指南:Redux 官方 React 绑定为何是状态管理的最优解
React Redux 9.x 终极指南:Redux 官方 React 绑定为何是状态管理的最优解 React Redux 是 Redux 官方的 React
前端AutoHotkey扩展库与功能模块详解
AutoHotkey扩展库与功能模块详解 本文详细解析了AutoHotkey的四大核心功能模块:文件系统操作库、正则表达式引擎、进程管理与系统交互模块、数学计算
RPAGUI 自动化桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考