在前面文章小车实现语音识别的基础之上,对小车实现语音控制运动

修改CMakeLists.txt文件


在末尾加上以下代码:

add_executable(sub_word src/sub_word.cpp)
target_link_libraries(sub_word ${catkin_LIBRARIES} )

修改发布文件

打开xfei_asr/src目录下的int_publish_speak.cpp文件,然后将下面的代码覆盖进去,请将appid填写为你在讯飞那申请的appid 。修改后的发布文件,将是全程自动唤醒不再是每次唤醒都需要手动输入代码。

#include <stdlib.h>#include <stdio.h>#include <string.h>#include <unistd.h>#include "qisr.h"#include "msp_cmn.h"#include "msp_errors.h"#include "speech_recognizer.h"#include <iconv.h>#include "ros/ros.h"#include "std_msgs/String.h"#define FRAME_LEN   640#define BUFFER_SIZE 4096int wakeupFlag   = 1 ;int resultFlag   = 0 ;static void show_result(char *string, char is_over){resultFlag=1;   printf("\rResult: [ %s ]", string);if(is_over)putchar('\n');}static char *g_result = NULL;static unsigned int g_buffersize = BUFFER_SIZE;void on_result(const char *result, char is_last){if (result) {size_t left = g_buffersize - 1 - strlen(g_result);size_t size = strlen(result);if (left < size) {g_result = (char*)realloc(g_result, g_buffersize + BUFFER_SIZE);if (g_result)g_buffersize += BUFFER_SIZE;else {printf("mem alloc failed\n");return;}}strncat(g_result, result, size);show_result(g_result, is_last);}}void on_speech_begin(){if (g_result){free(g_result);}g_result = (char*)malloc(BUFFER_SIZE);g_buffersize = BUFFER_SIZE;memset(g_result, 0, g_buffersize);printf("Start Listening...\n");}void on_speech_end(int reason){if (reason == END_REASON_VAD_DETECT)printf("\nSpeaking done \n");elseprintf("\nRecognizer error %d\n", reason);}/* demo recognize the audio from microphone */static void demo_mic(const char* session_begin_params){int errcode;int i = 0;struct speech_rec iat;struct speech_rec_notifier recnotifier = {on_result,on_speech_begin,on_speech_end};errcode = sr_init(&iat, session_begin_params, SR_MIC, &recnotifier);if (errcode) {printf("speech recognizer init failed\n");return;}errcode = sr_start_listening(&iat);if (errcode) {printf("start listen failed %d\n", errcode);}/* demo 10 seconds recording */while(i++ < 3)sleep(1);errcode = sr_stop_listening(&iat);if (errcode) {printf("stop listening failed %d\n", errcode);}sr_uninit(&iat);}/* main thread: start/stop record ; query the result of recgonization.* record thread: record callback(data write)* helper thread: ui(keystroke detection)*/void WakeUp(const std_msgs::String::ConstPtr& msg){printf("waking up\r\n");sleep(10000);wakeupFlag=1;}int main(int argc, char* argv[]){// 初始化ROSros::init(argc, argv, "voiceRecognition");ros::NodeHandle n;ros::Rate loop_rate(10);// 声明Publisher和Subscriber// 订阅唤醒语音识别的信号ros::Subscriber wakeUpSub = n.subscribe("voiceWakeup", 1000, WakeUp);   // 订阅唤醒语音识别的信号    ros::Publisher voiceWordsPub = n.advertise<std_msgs::String>("voiceWords", 1000);  ROS_INFO("Sleeping...");int count=0;while(ros::ok()){// 语音识别唤醒if (wakeupFlag){ROS_INFO("Wakeup...");int ret = MSP_SUCCESS;const char* login_params = "appid =, work_dir = .";const char* session_begin_params ="sub = iat, domain = iat, language = zh_cn, ""accent = mandarin, sample_rate = 16000, ""result_type = plain, result_encoding = utf8";ret = MSPLogin(NULL, NULL, login_params);if(MSP_SUCCESS != ret){MSPLogout();printf("MSPLogin failed , Error code %d.\n",ret);}printf("Demo recognizing the speech from microphone\n");printf("Speak in 10 seconds\n");demo_mic(session_begin_params);printf("10 sec passed\n");wakeupFlag=1;MSPLogout();}// 语音识别完成if(resultFlag){resultFlag=0;std_msgs::String msg;msg.data = g_result;voiceWordsPub.publish(msg);}ros::spinOnce();loop_rate.sleep();count++;}exit:MSPLogout(); // Logout...return 0;}

添加指令文件

创建新的文件命名为sub_word.cpp 粘贴以下代码。具体识别控制指令执行请按需修改

#include<ros/ros.h>
#include<geometry_msgs/Twist.h>
#include<std_msgs/String.h>
#include<pthread.h>
#include<iostream>
#include<stdio.h>using namespace std;
ros::Publisher pub;
geometry_msgs::Twist vel_cmd;
pthread_t pth_[5];void* vel_ctr(void* arg)
{while(true){pub.publish(vel_cmd);ros::spinOnce();sleep(1);}return 0;
}void callback(const std_msgs::String::ConstPtr& msg)
{cout<<"接收到指令:"<<msg->data.c_str()<<endl;string str1 = msg->data.c_str();string str2 = "前进。";string str2_1 = "up.";string str3 = "后退。";string str3_1 = "back.";string str4 = "左转。";string str4_1 = "left.";string str5 = "右转。";string str5_1 = "right.";string str6 = "停。";string str6_1 = "stop.";if(str1 == str2 || str1==str2_1){vel_cmd.linear.x = 1;vel_cmd.angular.z = 0;pthread_create(&pth_[0],NULL,vel_ctr,NULL);}if(str1 == str3 || str1 == str3_1){vel_cmd.linear.x = -1;vel_cmd.angular.z = 0;pthread_create(&pth_[1],NULL,vel_ctr,NULL);}if(str1 == str4 || str1 == str4_1){vel_cmd.linear.x = 0;vel_cmd.angular.z = 1;pthread_create(&pth_[2],NULL,vel_ctr,NULL);}if(str1 == str5 || str1 == str5_1){vel_cmd.linear.x = 0;vel_cmd.angular.z = -1;pthread_create(&pth_[3],NULL,vel_ctr,NULL);}if(str1 == str6 || str1 == str6_1){vel_cmd.linear.x = 0;vel_cmd.angular.z = 0;pthread_create(&pth_[0],NULL,vel_ctr,NULL);}
}int main(int argc, char** argv)
{ros::init(argc, argv, "sub_word");ros::NodeHandle n;pub = n.advertise<geometry_msgs::Twist>("/ria_base_controller/cmd_vel",10);ros::Subscriber sub = n.subscribe("voiceWords",10,callback);
cout<<"语音控制程序已开启"<<endl;
cout<<"中文关键字控制字:前进 后退 左转 右转 停"<<endl;
cout<<"英文关键字控制字:UP BACK LEFT RIGHT STOP"<<endl;
cout<<"程序将识别标准的普通话和英语单词"<<endl;ros::spin();
}

测试

测试前记得编译啊

依次在终端执行以下命令,然后对麦克风说控制命令。建议打开翻译等软件说标准的普通话或英文,识别度更高

roslaunch e100_sim gazebo.launch
rosrun xfei_asr iat_publish_speak
rosrun xfei_asr sub_word

成功控制小车运动。

语音控制机器人小车运动科大讯飞SDK相关推荐

  1. Rviz中控制机器人模型运动(arbotix)

    前言: 通过 URDF 结合 rviz 可以创建并显示机器人模型,不过,当前实现的只是静态模型,如何控制模型的运动呢?在此,可以调用 Arbotix 实现此功能. 简介: Arbotix:Arboti ...

  2. OpenHarmony轻量系统开发【14】使用语音控制鸿蒙小车

    摘要:本文简单介绍如何使用语音控制鸿蒙小车 适合群体:适用于润和Hi3861开发板 文中所有代码仓库:https://gitee.com/qidiyun/hihope-3861-smart-home- ...

  3. 6.5 Rviz中控制机器人模型运动

    ROS入门 6.5 Rviz中控制机器人模型运动 <ROS入门-理论与实践>视频教程镇楼 通过 URDF 结合 rviz 可以创建并显示机器人模型,不过,当前实现的只是静态模型,如何控制模 ...

  4. 【ROS】—— 机器人系统仿真 —Rviz中控制机器人模型运动与URDF集成Gazebo(十五)

    文章目录 前言 1. Arbotix使用流程 1.1 安装 Arbotix 1.2 创建新功能包,准备机器人 urdf.xacro 文件 1.3 添加 Arbotix 配置文件 1.4 编写 laun ...

  5. 基于MAX7800羽毛板语音控制ESP8266小车

    1. 项目介绍 基于MAX7800羽毛板语音控制ESP8266小车 采用现成的KWS20关键词,['up', 'down', 'left', 'right', 'stop', 'go', 'yes', ...

  6. 基于ROS的语音控制机器人(一):基本功能的实现

    文章目录 目录 文章目录 前言 一.ubuntu16.04和树莓派安装ROS-kinetic 二.树莓派和PC机之间的ros通信 1.修改环境变量 2.数据通信 三.科大讯飞sdk下载 四.树莓派和S ...

  7. ESP32解析ble蓝牙手柄信号,直接通讯,用于控制机器人小车机械臂等

    (一)SET.h库文件 (用于整合各种用到的类和实例化对象) #pragma once // 加入该指令的文件只会被编译一次 #include <NimBLEDevice.h>NimBLE ...

  8. 开发者说 | AI操控机器人系列第三期——语音控制(另附直播预约通道)

    预约通道: 课程正文: 摘要: 在AI操控机器人系列第二期的人体跟随教程中,身为地平线资深程序员的奶爸朱靠,使用地平线发布的机器人开发平台TogetherROS软件栈,搭建了人体跟随机器人. 同为开发 ...

  9. 机器人操作系统ROS(8)arbotix控制器控制小车运动

    本文内容:在 Ubuntu 18.04 虚拟机中,基于安装配置好 ROS Ketinc上,进行 URDF 机器人建模的详细步,同时配置摄像. 说明:本文是之前的延伸,该节需要参考上节机器人操作系统RO ...

最新文章

  1. MSN 无法登录 错误代码 8007007e
  2. log4j.properties配置详解与实例
  3. 牛顿法求解方程(python和C++)
  4. 大学使用python 编辑器_[雪峰磁针石博客]2018 最佳python编辑器和IDE
  5. javafor循环打印图案_C程序使用循环打印盒子图案
  6. java串口编程程序_想成为程序员,学编程,Python、Go、Java、C++,你选什么?
  7. c开头英文语言,C开头的考研英语词汇
  8. 示例演示公告通知标题无缝向上滚动,文字段落无缝向上滚动,简单的wangeditor富文本编辑器,简单的音乐播放demo...
  9. python教程博客园_python学习(一)—简明python教程
  10. MAC查看系统版本的命令
  11. pythonjam教程_colorama(pythonjam官网)
  12. MySQL 报错:Parameter ‘@XXX‘ must be defined.
  13. axure中继器求和_Axure学习笔记-中继器
  14. 事件委托的灵活运用真不会求指教
  15. 计算机硬件技术的应用毕业论文,计算机应用毕业论文.计算机分类和硬件技术发展状况.doc...
  16. 【spider01】Urllib
  17. npm ERR! nested aliases not supported 报错原因
  18. uniapp离线打包SDK
  19. [渝粤教育] 保定学院 艺术教育 参考 资料
  20. 【图形学】计算机图形学-练习题5

热门文章

  1. 如何在python中制作超级玛丽_超级玛丽的 python 实现
  2. excel透视表分组中展示为0的组
  3. java包不正确_java中包容易出现的错误及权限问题
  4. 万能文件加密授权工具可以加密iso吗_超时代视频加密软件下载_超时代视频加密软件免费下载...
  5. python处理图像文件
  6. Zabbix服务器端运行中 显示为 否 No 的解决方案
  7. 一 什么是mysql cursor_mysql中的cursor是什么意思?
  8. JpcapHandler——Jpcap抓包处理
  9. 怎样将图片合并成一个PDF文档
  10. 【微信小程序控制硬件15 】 重认识无线物联网的配网协议,了解腾讯物联蓝牙协议LLSync SDK,腾讯连连小程序也可以蓝牙配网了。