ROS Melodic语音识别学习(二)

ROS语音识别控制机器人(二)

创建Ros package

上节实现了语音转文字,本节内容是要把语音转换来的文字转换为指令,用来控制ROS中著名的小turtle

catkin_create_pkg baidu_asr roscpp rospy std_msgs

控制逻辑

rqt_graph
图中共有是那个节点,要在baidu_asr包中创建两个node来控制小乌龟:
第一个Node是接受百度语音识别的文字,并以/recognizer/output的Topic发布,格式为std_msgs/String
第二个Node是订阅/recognizer/output的消息,并将消息进行解释,比如前进、后退、向左、向右对应什么样的指令,并作为cmd_vel的Topic发布出去,消息格式为Twist()
第三个Node为Turtlesim,订阅cmd_vel的topic并转化为乌龟的动作指令

通过文字指令控制小乌龟

第三个节点是现成的,所以先从第二个节点开始。
代码可以参加 https://github.com/cmusphinx/ros-pocketsphinx

#!/usr/bin/env python
"""
voice_cmd_vel.py is a simple demo of speech recognition.
You can control a mobile base using commands found
in the corpus file.
"""

import rospy

from geometry_msgs.msg import Twist
from std_msgs.msg import String

class voice_cmd_vel:

    def __init__(self):
        rospy.on_shutdown(self.cleanup)
        self.speed = 0.2
        self.msg = Twist()

        # publish to cmd_vel, subscribe to speech output
        self.pub_ = rospy.Publisher('turtle1/cmd_vel', Twist)
        rospy.Subscriber('recognizer/output', String, self.speechCb)

        r = rospy.Rate(10.0)
        while not rospy.is_shutdown():
            self.pub_.publish(self.msg)
            r.sleep()
        
    def speechCb(self, msg):
        rospy.loginfo(msg.data)

        if msg.data.find("full speed") > -1:
            if self.speed == 0.2:
                self.msg.linear.x = self.msg.linear.x*2
                self.msg.angular.z = self.msg.angular.z*2
                self.speed = 0.4
        if msg.data.find("half speed") > -1:
            if self.speed == 0.4:
                self.msg.linear.x = self.msg.linear.x/2
                self.msg.angular.z = self.msg.angular.z/2
                self.speed = 0.2

        if msg.data.find("forward") > -1:    
            self.msg.linear.x = self.speed
            self.msg.angular.z = 0
        elif msg.data.find("left") > -1:
            if self.msg.linear.x != 0:
                if self.msg.angular.z < self.speed:
                    self.msg.angular.z += 0.05
            else:        
                self.msg.angular.z = self.speed*2
        elif msg.data.find("right") > -1:    
            if self.msg.linear.x != 0:
                if self.msg.angular.z > -self.speed:
                    self.msg.angular.z -= 0.05
            else:        
                self.msg.angular.z = -self.speed*2
        elif msg.data.find("back") > -1:
            self.msg.linear.x = -self.speed
            self.msg.angular.z = 0
        elif msg.data.find("stop") > -1 or msg.data.find("halt") > -1:          
            self.msg = Twist()
        
        self.pub_.publish(self.msg)

    def cleanup(self):
        # stop the robot!
        twist = Twist()
        self.pub_.publish(twist)

if __name__=="__main__":
    rospy.init_node('voice_cmd_vel')
    try:
        voice_cmd_vel()
    except:
        pass

第二个节点向turtlesim节点发送消息示例:

rostopic pub -1 recognizer/output std_msgs/String "forward"
rostopic pub -1 recognizer/output std_msgs/String "right"

输入指令后小乌龟开始持续在原地转圈,成功。
turtlesim
下一步就是如何将语音进行识别,并转换为std_msgs/String的格式并发送出去。

语音转文字

昨天的语音转文字就可以用上了,后来发现其实百度的语音识别更简单。
增加一个Ros node并且发布信息就可以了。

发布了2 篇原创文章 · 获赞 0 · 访问量 40

猜你喜欢

转载自blog.csdn.net/weixin_43484439/article/details/104224864
今日推荐