机器谱
【U036】探索者如何接入大模型
图文展示3264(1)

图文展示3264(1)

副标题

教程
教程

        本项目需要实现用语音通过互联网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镜像文件。


2. 格式化MicroSD卡

(1)MicroSD卡插入读卡器中,并连上电脑。

2)打开SDFormatter.exe,选择内存卡对应的盘符(注意:一定要选择内存卡对应的盘符,千万别选成了电脑硬盘,如下图所示为D:盘

3)点击“格式化”,再点击“确定”。

4再点击“确定”。

(5)点击“确定”以及“完成”。

3. 安装系统映像并启动树莓派

(1)打开Win32DiskImager.exe,载入映像文件,选择正确的盘符。

(2)点击“写入”,再点击“Yes”。等待写入完成即可。

(3)将写好镜像的MicroSD卡插入树莓派卡槽。

(4)给树莓派接上显示器、键盘鼠标,使用手机充电器为其供电。开机后需要设置用户名、选择语言、连接WiFi等,完成后进入Ubuntu24.04.3系统桌面。

4. 为Ubuntu安装软件

点击左上角 「树莓图标」→ 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() 计时逻辑

}


三、大模型配置

1. 注册阿里云百炼账号

登录阿里云百炼网站 通义大模型_AI大模型_一站式大模型推理和部署服务-阿里云 注册阿里云百炼账号。进入主页后点击“免费体验”。

2. 创建API-KEY

进入免费体验页面后,先点击左下角的“密钥管理”,进入密钥管理页面,再点击右上角的“创建API-KEY”,即可创建密钥。该密钥请妥善保管,调用会消耗tokens。

注意:API-KEY一旦泄露可能会造成经济损失!!!

3. 费用设置

首次注册阿里云百炼会赠送一些免费的tokens,但是调用大模型会很快消耗掉,消耗完如果还有继续用,则需要充值购买更多tokens

注意:为了防止经济损失,一般需要关闭“自动充值”!!!

操作方法为:

1)点击顶部“费用”菜单。

2)进入页面后,点击“自动充值设置”。

3)选择“关闭自动充值”。再输入手机号、验证码,点击“确定”即可。

4. 选择模型服务

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程序文件。

序号文件名作用
1main.py主程序入口
2device_ai_assistant.pyAI助手核心逻辑
3car_controller.py小车控制器
4asr.py语音识别模块
5llm.py大语言模型模块
6tts.py语音合成模块
7auidio_recorder.py音频录制模块
8device_controller.py设备控制基类

程序源代码请在下载程序包后自行阅读。并根据程序包中的README.md文档中的说明完成API密钥的替换,以及完成串口的配置。

五、运行
1. 安装依赖
下载程序包并打开,然后在Ubuntu终端输入以下指令:
pip install -r requirements.txt


即可自动安装requirements.txt指定的几个软件。
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




2. 连接硬件
按下图所示方法连接硬件,并打开电源。
3. 输入指令

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秒左右;

这个版本没有加唤醒词,有兴趣的同学可以试试增加。

© 2024 机器时代(北京)科技有限公司  版权所有
机器谱——机器人共享方案网站
学习  开发  设计  应用