赞
踩
主控和语音控制模块之间预计使用websocket进行通信,其中主控作为服务端,所以需要在语音控制模块部分编写一个websocket客户端与主控进行连接,记录一下探索过程。
最初的探索焦点集中于ros系统上,目标是寻找合适的ros功能包能够直接与websocket相连接,参考此教程发现rosbridge功能包是一个专门为ros与web交互所创建的功能包。不过在探索中发现,rosbridge提供的功能只有websocket服务端,不能直接写客户端,和我们的需求有所不同。不过也还是有使用的价值,所以也在此记录一下,方便日后查阅。
后来寻找编写客户端的方法,此工程和我们的需求很像。不过,考虑到我们要传输的数据并不复杂而且交互性不强,所以我没有采用使用C++编写客户端的方法,而是采用了使用python编写websocket-client的方法。
pip install websocket-client
from websocket import create_connection import time import rospy from std_msgs.msg import String voice_ws = create_connection("ws://192.168.8.188:8540/sendDestination") #连接主控socket服务端 dest1="715" #设置要识别的指令 dest2="716" flag_715 = 0 flag_716 = 0 class spotmicrovoicewebsocket(): def __init__(self): rospy.loginfo("Setting up the SpotMicro voice websocket client node ...") rospy.init_node('spot_micro_voice_websocket_client') #初始化node节点 rospy.loginfo("Initialization complete") def run(self): global flag_715, flag_716 def callback(data): global flag_715, flag_716 rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data) if (data.data == dest1): flag_715 = 1 if (data.data == dest2): flag_716 = 1 rospy.Subscriber('voiceWords',String, callback) #订阅voiceWords话题,语音识别的结果 while not rospy.is_shutdown(): rospy.loginfo('wait for the command') if (flag_715 ==1): voice_ws.send("715") #发送消息"715" time.sleep(1) result=voice_ws.recv() #接收消息并将结果存在result print(result) flag_715 =0 elif (flag_716 ==1): voice_ws.send("716") time.sleep(1) result=voice_ws.recv() print(result) flag_716=0 else: #其他命令发送"nothing" voice_ws.send("nothing") time.sleep(1) result=voice_ws.recv() print(result) if __name__ =="__main__": smkc = spotmicrovoicewebsocket() smkc.run()
成功进行连接,当语音识别到716之后会发送给主控,主控将目标设置为716,之后客户端会收到发回的指令200,其余情况下,客户端收到指令400。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。