|
|
教程 |
本项目需要实现用语音通过互联网AI大模型控制一个探索者小车(使用典型的探索者零部件)运动,即:人给出语音指令,如“让小车前进”、“减速”、“左转”、“停车”等;大模型接收到指令后用语音回复,并控制小车实现相应动作。以下为具体实现步骤。
一、配置树莓派及Ubuntu环境
硬件器材:树莓派4B(2G)*1、Windows电脑*1、读卡器*1、MICROSD卡*1(至少16G,推荐32G)、树莓派配套显示器(含HDMI线等)*1、树莓派配套键盘鼠标*1、手机充电器(Type头)。
软件:Win32Disklmager、SDFormatter
操作步骤:
1. 下载ubuntu镜像并解压(1)从ubuntu网站页面 https://cn.ubuntu.com/download/raspberry-pi 下载适配树莓派Ubuntu桌面LST的版本,如下图所示
(2)使用7z解压软件对下载到的
ubuntu-24.04.3-preinstalled-desktop-arm64+raspi.img.xz
文件解压,可得到ubuntu-24.04.3-preinstalled-desktop-arm64+raspi.img镜像文件。
(1)把MicroSD卡插入读卡器中,并连上电脑。
(2)打开SDFormatter.exe,选择内存卡对应的盘符(注意:一定要选择内存卡对应的盘符,千万别选成了电脑硬盘,如下图所示为D:盘)
(3)点击“格式化”,再点击“确定”。
(4)再点击“确定”。
(5)点击“确定”以及“完成”。
(1)打开Win32DiskImager.exe,载入映像文件,选择正确的盘符。
(2)点击“写入”,再点击“Yes”。等待写入完成即可。
(3)将写好镜像的MicroSD卡插入树莓派卡槽。
(4)给树莓派接上显示器、键盘鼠标,使用手机充电器为其供电。开机后需要设置用户名、选择语言、连接WiFi等,完成后进入Ubuntu24.04.3系统桌面。
点击左上角 「树莓图标」→ Accessories → Terminal 打开终端。在终端中输入以下指令,安装必要的软件或更新。
在终端中逐行复制粘贴以下命令(每输一行按回车,等它执行完再输下一行):
# 更新 & 安装系统依赖 sudo apt update sudo apt install -y python3-pip portaudio19-dev python3-pyaudio # 添加当前用户到 dialout 组(访问串口),需要重启或重新登录使 dialout 生效 sudo usermod -aG dialout $USER # 安装 Python 核心库(注意 --break-system-packages) pip3 install dashscope pyaudio pyserial --break-system-packages |
我们使用的机构为一个安装了Basra2.0和Bigfish2.2的探索者双轮差速小车。
下面是小车主控板里面的烧录的程序代码(下位机程序)。
car_sketch_oct16b_new.ino
// ============================================================================= // Basra2.0+Bigfish2.2,双轮差速小车控制固件(下位机) // 功能:接收上位机(树莓派)通过串口发送的文本指令,控制双轮差速小车运动 // 通信协议:115200 波特率,每条命令以 '\n' 或 '\r' 结尾(兼容 Windows/Linux/Mac 换行) // 支持指令:forward, backward, left, right, stop // 作者:wjw // 最后更新:2025年10月 // ============================================================================= // --- 硬件引脚定义 --- // 使用 L298N 或类似 H 桥电机驱动模块 // 左侧电机控制: #define IN1 5 // 连接 H 桥左电机正转输入(IN1) #define IN2 6 // 连接 H 桥左电机反转输入(IN2) // 右侧电机控制: #define IN3 9 // 连接 H 桥右电机正转输入(IN3) #define IN4 10 // 连接 H 桥右电机反转输入(IN4) // 注意:引脚 5、6、9、10 均支持 PWM,未来可扩展速度控制 // --- 初始化函数 --- void setup() { // 启动串口通信,波特率 115200(与上位机 Python 脚本保持一致) Serial.begin(115200);
// 设置电机控制引脚为输出模式 pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
// 安全启动:确保上电时电机处于停止状态,防止意外启动 stopMotors();
// 发送就绪信号,便于上位机确认连接成功 Serial.println("Basra Motor Ready"); } // --- 电机动作函数(基于差速转向原理)--- // 小车前进:左右轮同向正转 void moveForward() { digitalWrite(IN1, HIGH); // 左轮正转 digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); // 右轮正转 digitalWrite(IN4, LOW); } // 小车后退:左右轮同向反转 void moveBackward() { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); // 左轮反转 digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); // 右轮反转 } // 原地左转:左轮后退 + 右轮前进(形成逆时针旋转力矩) void turnLeft() { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); // 左轮反转(后退) digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); // 右轮正转(前进) } // 原地右转:左轮前进 + 右轮后退(形成顺时针旋转力矩) void turnRight() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // 左轮正转(前进) digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); // 右轮反转(后退) } // 电机完全停止:所有控制引脚置低,H 桥无输出 void stopMotors() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } // --- 主循环:处理串口指令 --- void loop() { // 使用 static 变量保存跨 loop() 调用的命令字符串 static String cmd = ""; // 持续检查串口是否有数据到达 while (Serial.available()) { char c = Serial.read(); // 逐字节读取串口数据(非阻塞) // 判断是否为命令结束符(支持 \n、\r 或 \r\n 组合) if (c == '\n' || c == '\r') { cmd.trim(); // 移除首尾空白字符(如空格、制表符),提高容错性 // 仅当命令非空时才处理 if (cmd.length() > 0) { // === 指令匹配与执行 === if (cmd == "forward") { moveForward(); Serial.println("OK: forward"); // 返回确认信息,便于调试 } else if (cmd == "backward") { moveBackward(); Serial.println("OK: backward"); } else if (cmd == "left") { turnLeft(); Serial.println("OK: left"); } else if (cmd == "right") { turnRight(); Serial.println("OK: right"); } else if (cmd == "stop") { stopMotors(); Serial.println("OK: stop"); } else { // 未知命令:返回错误信息,包含原始输入,便于排查 Serial.print("ERROR: unknown command '"); Serial.print(cmd); Serial.println("'"); } } // 重置命令缓冲区,准备接收下一条指令 cmd = ""; } else { // 累积非结束符字符到命令字符串 cmd += c; } } // 注意:此设计为“事件驱动”,无延时,响应迅速 // 若需添加超时自动停止等功能,可在此处加入 millis() 计时逻辑 } |
登录阿里云百炼网站 通义大模型_AI大模型_一站式大模型推理和部署服务-阿里云 ,注册阿里云百炼账号。进入主页后点击“免费体验”。
进入免费体验页面后,先点击左下角的“密钥管理”,进入密钥管理页面,再点击右上角的“创建API-KEY”,即可创建密钥。该密钥请妥善保管,调用会消耗tokens。
注意:API-KEY一旦泄露可能会造成经济损失!!!
首次注册阿里云百炼会赠送一些免费的tokens,但是调用大模型会很快消耗掉,消耗完如果还有继续用,则需要充值购买更多tokens。
注意:为了防止经济损失,一般需要关闭“自动充值”!!!
操作方法为:
(1)点击顶部“费用”菜单。
(2)进入页面后,点击“自动充值设置”。
(3)选择“关闭自动充值”。再输入手机号、验证码,点击“确定”即可。
(1)回到之前的页面,点击“模型服务”,即可进入“模型广场”。
(2)本项目要实现用语音通过互联网AI大模型控制一个小车运动。实际上需要调用3种大模型:
① 语音识别大模型(ASR),它的作用是实现将人说的话(通过麦克风捕捉)转化成文本;
② 大语言模型(LLM),它的作用是收到文本后反馈一段话,这也是我们日常用的最多的一种AI服务;
③ 语音合成模型(TTS),它可以将AI回复的话转化成语音说出来(通过音箱播放)。
每种模型都有很多厂家的多款产品可选,我们可以在模型广场中选出合适的模型,选择标准要综合考虑各个模型的先进程度、响应速度、价格等。
(3)选择好模型(如qwen-flash)后, 可以点击进入该模型的详情页面,查看把该模型的code,和代码示例,把模型code写进上位机代码里即可(具体请阅读上位机程序的代码)。
(4)本项目经过对比,使用了以下三个模型。
| 语音识别asr_model | 腾讯云-asr |
| 大语言模型llm_model | 阿里云百炼qwen-flash |
| 语音合成tts_model | 讯飞云smart-tts |
上文只介绍了通过阿里云百炼接入qwen-flash的方法,腾讯云和讯飞云模型的注册、密钥获取和接入方法请大家自行研究。大家也可以随意更换各种模型,注意修改上位机程序相应位置的代码即可。
上位机程序为一组运行在树莓派Ubuntu系统里的python文件。本项目共包含8个python程序文件。
| 序号 | 文件名 | 作用 |
| 1 | main.py | 主程序入口 |
| 2 | device_ai_assistant.py | AI助手核心逻辑 |
| 3 | car_controller.py | 小车控制器 |
| 4 | asr.py | 语音识别模块 |
| 5 | llm.py | 大语言模型模块 |
| 6 | tts.py | 语音合成模块 |
| 7 | auidio_recorder.py | 音频录制模块 |
| 8 | device_controller.py | 设备控制基类 |
程序源代码请在下载程序包后自行阅读。并根据程序包中的README.md文档中的说明完成API密钥的替换,以及完成串口的配置。
| pip install -r requirements.txt |
| # Core dependencies pyaudio>=0.2.13 pyserial>=3.5 # Cloud service SDKs dashscope>=1.14.0 # HTTP requests requests>=2.31.0 # WebSocket support (for TTS) websocket-client>=1.6.0 |
在Ubuntu终端命令行输入python main.py并回车,即可运行程序。
4. 从PC端访问树莓派如果感觉使用外接屏幕和蓝牙键鼠不太方便,也可以用自己的笔记本电脑(以Windows系统为例)远程访问树莓派。比较简单的方式是使用SSH 远程命令行访问,具体操作如下:
(1)确保树莓派和 PC 在同一局域网下(连同一个 Wi-Fi 或用网线连接路由器)。
(2)在树莓派上启用 SSH 服务(Ubuntu 默认通常已安装 openssh-server):
sudo apt update sudo apt install openssh-server sudo systemctl enable ssh sudo systemctl start ssh |
(3)获取树莓派 IP 地址(可在树莓派终端执行):
ip a # 或 hostname -I |
(4)在 PC 上使用 SSH 客户端连接。Windows可用 PowerShell 或 CMD 输入:
ssh username@树莓派IP # 例如:ssh ubuntu@192.168.1.100 |
然后即可撤掉显示器和键鼠,使用PC远程操作树莓派。
然后可以将音响安装在机器人小车上,同时改用移动电源(如充电宝等),从而实现机器人的自由移动,但注意不要超出WiFi信号范围。
5. 与AI对话支持的语音指令示例:"前进"、"后退"、"向左转"、"向右转"、"停止"、"退出"。
系统会通过LLM理解自然语言,因此也支持类似"往前走"、"向左边移动"等更自然的表达方式。
1. 从上位机到下位机的通信延时约0.1秒左右;
2. 小车动作响应时间约2秒左右;
3. 语音回复响应时间约3秒左右;
这个版本没有加唤醒词,有兴趣的同学可以试试增加。