ROS语音识别控制机器人(二)
创建Ros package
上节实现了语音转文字,本节内容是要把语音转换来的文字转换为指令,用来控制ROS中著名的小turtle
catkin_create_pkg baidu_asr roscpp rospy std_msgs
控制逻辑
图中共有是那个节点,要在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"
输入指令后小乌龟开始持续在原地转圈,成功。
下一步就是如何将语音进行识别,并转换为std_msgs/String的格式并发送出去。
语音转文字
昨天的语音转文字就可以用上了,后来发现其实百度的语音识别更简单。
增加一个Ros node并且发布信息就可以了。