15、构建语音控制机器人

构建语音控制机器人

1. 蓝牙配对与串口启用

在完成相关操作后,输入 exit 。接着,可通过输入 sudo bluetoothctl 来检查设备是否已与 RPi 配对。至此,RPi 的蓝牙与安卓智能手机的蓝牙配对完成。接下来,需要启用 RPi 蓝牙的串口。
- 创建脚本
- 输入命令 sudo nano bt_serial
- 在脚本中输入以下内容:

hciconfig hci0 piscan
sdptool add SP
- 按 `Ctrl + O` 保存,按 `Ctrl + X` 退出脚本。
  • 执行脚本
    • 输入命令 sudo chmod +x bt_serial (执行权限命令)。
    • 输入命令 sudo ./bt_serial (运行命令)。运行脚本后,会看到消息 Serial Port service registered
2. 树莓派蓝牙程序开发

在设计好安卓应用、完成设备配对并启用串口后,就可以对 RPi 进行编程,使其能够接收来自安卓智能手机的文本数据。这里将使用套接字编程中的套接字来实现。

2.1 套接字编程

套接字是网络中双向通信系统的端点,用于发送信息。在设备间建立蓝牙通信时,需要创建套接字,一个在服务器端(RPi),另一个在客户端(安卓智能手机)。在蓝牙编程中,有 RFCOMM 和 L2CAP 两种套接字选项,具体连接步骤如下:
|步骤|功能|描述|
| ---- | ---- | ---- |
|1|Socket creation (client/server)|在客户端和服务器端程序中创建套接字: socket(int domain, int type, int protocol) 。在本案例中, domain AF_BLUETOOTH type SOCK_STREAM protocol 可选择 RFCOMM L2CAP 。|
|2|Connect (client)|客户端尝试与服务器端套接字建立连接: connect(int sock, const struct sockaddr *server_address, socklen_t info) ,其中 server_address 为 RPi 地址。|
|3|Bind (server)|服务器端绑定地址和端口号: bind(int sock, const struct sockaddr *address, socklen_t info) ,将 RPi 的 MAC 地址存储在其中。|
|4|Listen (server)|服务器端套接字等待客户端连接: listen(int sock, int backlog) backlog 通常设为 1。|
|5|Accept (server)|服务器端等待客户端连接请求并创建新套接字: int new_socket = accept(int sock, struct sock_address *clientaddress, socklen_t info) clientaddress 为安卓智能手机地址。|
|6|Send (client/server)|用于在客户端和服务器端之间发送数据。|
|7|Read (client/server)|用于读取客户端和服务器端之间传输的数据。|
|8|Close (client/server)|关闭套接字并释放分配的内存。|

由于已经使用 App Inventor 创建了 VoiceControlBot 安卓应用,因此无需编写客户端程序,只需为 RPi 机器人编写服务器端程序。

3. VoiceBot 服务器程序

在 VoiceBot 服务器程序中,首先使用套接字程序建立设备间的套接字连接,然后接收来自安卓智能手机的传入数据,最后根据接收到的数据移动机器人。VoiceBot.c 程序可从 GitHub 仓库的 Chapter09 文件夹下载。具体步骤如下:
1. 声明必要的头文件

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>               //Socket header file
#include <bluetooth/bluetooth.h>      //Bluetooth header file
#include <bluetooth/rfcomm.h>         //Radio frequency communication header file
#include <wiringPi.h>
  1. main() 函数中声明输出引脚
pinMode(0,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
  1. 声明相关变量和结构体
struct sockaddr_rc server_address = { 0 }, client_address = { 0 };
char data[1024] = { 0 };
int s, clientsocket, bytes;
socklen_t opt = sizeof(client_address);
  1. 创建套接字
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
  1. 绑定 RPi 的蓝牙 MAC 地址并进入监听模式
bind(s, (struct sockaddr *)&server_address, sizeof(server_address));
listen(s, 1);
  1. 接受连接并创建新的客户端套接字
clientsocket = accept(s, (struct sockaddr *)&client_address, &opt);
  1. 显示连接的蓝牙 MAC 地址
ba2str( &client_address.rc_bdaddr, data );
fprintf(stderr, "Connected to %s\n", data);
  1. 读取传入数据并根据数据控制机器人
for(;;){
    bytes = read(clientsocket, data, sizeof(data));
    if( bytes > 0 ) {
        printf("Alphabet: %s\n", data);
        if(*data=='F')
        {
            ----Forward Code----
        }
        else if(*data=='B')
        {
            ----Backward Code----
        }
        else if(*data=='L')
        {
            ----Axial Left Turn Code----
        }
        else if(*data=='R')
        {
            ----Axial Right Turn Code----
        }
        else if(*data=='S')
        {
            ----Stop Code----
        }
    }
}
  1. 关闭套接字
close(clientsocket);
close(s);
  1. 编译代码 :由于代码包含套接字和蓝牙头文件,编译时需要在构建命令中添加 -lbluetooth 命令。因为这是一个 C 程序,还需要添加 -lwiringPi 命令来编译 wiringPi 代码。
4. 代码测试

在编译和构建程序之前,要确保安卓智能手机的蓝牙和 RPi 的蓝牙已配对。若未配对,运行 VoiceControlBot 应用时,RPi 蓝牙名称(raspberrypi)将不会出现在蓝牙列表中。配对步骤可参考相关说明。
- 执行之前创建的 bt_serial 脚本:
- 输入命令 sudo chmod +x bt_serial (执行权限命令)。
- 输入命令 sudo ./bt_serial (运行命令)。无需每次运行程序时都执行该脚本,但在开始新的 RPi 会话并测试 VoiceBot.c 程序时需要执行。
- 编译并构建 VoiceBot.c 程序。
- 打开 VoiceControlBot 安卓应用,按下 CONNECT 列表选择器,会在蓝牙列表中看到 raspberrypi 及其 MAC 地址,选择该选项连接设备。
- 连接成功后,终端窗口会显示 Connected to: 和安卓蓝牙 MAC 地址。若出现 Error 507: Unable to Connect. Is the device turned on? 错误,点击连接按钮并再次选择 raspberrypi 蓝牙。
- 设备连接后,点击语音识别按钮并开始说话。说 forward 时,屏幕会显示该单词,字母 F 会发送到 RPi;说 back left right stop 时,字母 B L R S 会发送到 RPi 的蓝牙,机器人会相应移动。若说其他单词,语音识别器会识别并显示,但不会向 RPi 发送文本数据。

以下是整个流程的 mermaid 流程图:

graph TD;
    A[蓝牙配对] --> B[串口启用];
    B --> C[蓝牙程序开发];
    C --> D[VoiceBot服务器程序编写];
    D --> E[代码测试];

通过以上步骤,就可以实现一个简单的语音控制机器人。在实际应用中,还可以根据需求对代码进行扩展和优化,例如添加更多的语音指令、优化机器人的运动控制等。

构建语音控制机器人

5. 常见问题及解决方法

在构建和测试语音控制机器人的过程中,可能会遇到一些常见问题,以下是这些问题及相应的解决方法:
|问题|解决方法|
| ---- | ---- |
|蓝牙配对失败|确保安卓智能手机和 RPi 的蓝牙功能都已开启,并且 RPi 的蓝牙可见。重新按照配对步骤进行操作,确保输入的配对码正确。如果问题仍然存在,尝试重启设备后再次配对。|
| bt_serial 脚本执行失败|检查脚本文件是否存在,以及文件权限是否正确。可以使用 ls -l 命令查看文件权限,若权限不足,使用 sudo chmod +x bt_serial 命令赋予执行权限。若文件名拼写错误,修改为正确的文件名。|
|VoiceBot.c 程序编译错误|检查代码中是否存在语法错误,特别是头文件的引用和函数的调用。确保编译命令中包含了必要的参数 -lbluetooth -lwiringPi 。若仍然无法编译,检查相关库文件是否已正确安装。|
|连接设备时出现 Error 507: Unable to Connect. Is the device turned on? 错误|检查设备是否开启,蓝牙是否正常工作。点击连接按钮并再次选择 raspberrypi 蓝牙进行连接。若问题依旧,尝试重启设备和重新执行 bt_serial 脚本。|
|语音指令无法控制机器人|检查语音识别功能是否正常,确保 VoiceControlBot 安卓应用能够正确识别语音。检查 RPi 是否接收到了正确的指令字母,可在终端查看输出信息。若未接收到指令,检查蓝牙连接是否稳定。

6. 扩展与优化建议

为了让语音控制机器人更加智能和实用,可以进行以下扩展和优化:
- 添加更多语音指令 :在 VoiceBot.c 程序中添加更多的 if 条件语句,以支持更多的语音指令。例如,可以添加 T 指令用于机器人转弯特定角度, M 指令用于机器人执行特定的动作序列等。示例代码如下:

if(*data=='T')
{
    ----Turn Specific Angle Code----
}
else if(*data=='M')
{
    ----Execute Specific Action Sequence Code----
}
  • 优化机器人运动控制 :可以使用更复杂的算法来控制机器人的运动,例如使用 PID 控制算法来精确控制机器人的速度和转向。同时,可以添加传感器来实现避障、跟随等功能,提高机器人的自主性。
  • 增强语音识别准确性 :可以使用更先进的语音识别技术,如 Google Cloud Speech-to-Text 或百度语音识别 API,来提高语音识别的准确性和稳定性。在安卓应用中集成这些 API,并将识别结果发送到 RPi。
  • 实现远程控制 :可以通过网络连接实现对机器人的远程控制,例如使用 Wi-Fi 或蓝牙网络。在 RPi 上搭建服务器,通过网络接收远程指令并控制机器人的运动。
7. 总结

通过以上步骤,我们成功构建了一个简单的语音控制机器人。从蓝牙配对、串口启用,到蓝牙程序开发和 VoiceBot 服务器程序编写,再到代码测试和问题解决,每个环节都至关重要。在实际应用中,我们可以根据需求对机器人进行扩展和优化,使其具备更多的功能和更高的性能。

以下是扩展与优化的 mermaid 流程图:

graph TD;
    A[添加更多语音指令] --> B[优化机器人运动控制];
    B --> C[增强语音识别准确性];
    C --> D[实现远程控制];

总之,构建语音控制机器人是一个有趣且富有挑战性的项目,它结合了硬件和软件知识,为我们提供了一个实践和创新的平台。希望本文能够帮助你顺利完成语音控制机器人的构建,并激发你更多的创意和想法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值