主控和语音控制模块之间预计使用websocket进行通信,其中主控作为服务端,所以需要在语音控制模块部分编写一个websocket客户端与主控进行连接,记录一下探索过程。
rosbridge最初的探索焦点集中于ros系统上,目标是寻找合适的ros功能包能够直接与websocket相连接,参考此教程发现rosbridge功能包是一个专门为ros与web交互所创建的功能包。不过在探索中发现,rosbridge提供的功能只有websocket服务端,不能直接写客户端,和我们的需求有所不同。不过也还是有使用的价值,所以也在此记录一下,方便日后查阅。
python编写客户端后来寻找编写客户端的方法,此工程和我们的需求很像。不过,考虑到我们要传输的数据并不复杂而且交互性不强,所以我没有采用使用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。