Skip to main content

reCamera Gimbal 的声源定位

介绍

我们决定来点有趣的实验,把音频和视觉边缘 AI 结合起来玩一玩!🤖

在这个演示中,我们将 Seeed Studio reSpeaker USB Mic Array 连接到了基于 RISC-V 的 reCamera Gimbal 上。通过利用声源定位(DOA),系统可以驱动云台的无刷电机自动旋转,并实时朝向说话者的方向。这是一次非常有趣的探索,展示了我们的多模态边缘设备如何实现无缝交互!

下面是完成本 Demo 后的使用效果。

硬件准备

一台 reCamera Gimbal
一个 reSpeaker XVF3800
一台电脑

reCamera GimbalreSpeaker XVF3800

1. 打开 SenseCraft 部署应用

1.1 设置 reCamera Gimbal

首先,不要连接 reCamera Gimbal 的电源,直接用 Type-C 连接电脑,访问 192.168.42.1,进入后点击左下角的 "Login to SenseCraft",登录后给它连接 WiFi,确保连接的 WiFi 与你的电脑相同,然后查看 reCamera Gimbal 的 IP 地址,复制该 IP 地址并访问,确认可以正常访问。接着拔掉 Type-C 线,插上 12V 电源,待 reCamera Gimbal 自动校准完成后,在浏览器中重新访问刚才的 IP 地址,进入 reCamera Gimbal 的界面,确保 Node-RED 已经正常启动运行。

1.2 部署应用

进入 SenseCraft,点击 "Applications" 找到名为 "Sound source localization Camera" 的应用,进入后点击 "Deploy this Application",然后选择 "Option 1: Deploy via USB"。

部署完成后,你看到的工作流应如下所示:

2. 获取源码并配置 Python 工作环境

访问 GitHub 项目,下载压缩包并解压。

为了通过 USB 与 reSpeaker 通信,在你的电脑上安装依赖:

# 从提供的 requirements 文件安装所需的 Python 包

pip install -r Sound-Tracking/requirements.txt

# 通过 Conda 安装 libusb(后端驱动支持所必需)

conda install -c conda-forge libusb

请将 reSpeaker.py 代码中的 "192.168.31.198" 替换为你的 reCamera Gimbal 连接 WiFi 后的真实 IP 地址!

3. 测试

在电脑上运行 Python 脚本,执行以下操作:

python Sound-Tracking/reSpeaker.py

对着麦克风说话——你应该能看到 Python 终端持续打印 SPEECH_DETECTED:1,同时 reCamera 会快速转向你声音所在的角度。

拓展更多玩法!

这个 Demo 只是一个开始。我们非常鼓励大家在此基础上进行二次开发,拓展更多硬核玩法!例如:

-** 触发联动 **:你可以修改 Node-RED 或 Python 脚本,让 reCamera Gimbal 在转到声源位置后立即开始录像 ** 或 拍照 *。

-智能安防:结合 Home Assistant,在房间出现异常噪音时自动跟踪并记录。

-视听双重确认:将 YOLO11n 目标检测与听觉跟踪结合(例如:听到声音 -> 转头查看 -> 视觉识别确认是否为“人”)。

期待看到你的创意!🎉

操作说明与注意事项

  1. 确认部署:在 Node-RED 导入前述节点后,点击右上角的 Deploy 使其生效。

  2. 测试机制:先启动 Node-RED,确保其在后台运行,然后在 PC 上执行以下命令运行 Python 脚本:

请将 reSpeaker.py 代码中的 "192.168.31.198" 替换为 reCamera Gimbal 连接 WiFi 后的实际 IP 地址!

python Sound-Tracking/reSpeaker.py

对着麦克风说话,你应该能看到 Python 终端不断打印:

SPEECH_DETECTED: 1

同时,reCamera 会快速转向声音的物理角度。

  1. 物理朝向校准:reSpeaker 麦克风阵列的“0 度”朝向可能与 reCamera 默认正前方的“0 度”并不完全一致。如果你发现云台每次转动后总是固定偏离一个角度(例如总是偏差 90 度),可以直接在 Node-RED 中双击新建的 Calculate & Throttle function 节点,取消注释相关代码并修改偏移计算:targetYaw = (targetYaw +90)% 360;

      • 防抖设计 **:由于 Python 代码每 0.1 秒就会刷新并发送一次数据,如果将这些高频信号全部推送给电机控制器(CAN 总线),很容易导致设备总线过载卡顿。因此,我在 Node-RED 的 function 节点中写入了防抖逻辑(只有当角度变化“>5 °”或时间间隔“>1 second”时才会触发下发)。

技术支持与产品讨论

感谢你选择我们的产品!我们为你提供多种支持方式,以确保你在使用产品的过程中尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...