登录
转载

ROS与Web的交互---编写websocket客户端

发布于 2021-03-11 阅读 5876
  • Python
  • CSDN
转载

主控和语音控制模块之间预计使用websocket进行通信,其中主控作为服务端,所以需要在语音控制模块部分编写一个websocket客户端与主控进行连接,记录一下探索过程。

rosbridge

最初的探索焦点集中于ros系统上,目标是寻找合适的ros功能包能够直接与websocket相连接,参考此教程发现rosbridge功能包是一个专门为ros与web交互所创建的功能包。不过在探索中发现,rosbridge提供的功能只有websocket服务端,不能直接写客户端,和我们的需求有所不同。不过也还是有使用的价值,所以也在此记录一下,方便日后查阅。

python编写客户端

后来寻找编写客户端的方法,此工程和我们的需求很像。不过,考虑到我们要传输的数据并不复杂而且交互性不强,所以我没有采用使用C++编写客户端的方法,而是采用了使用python编写websocket-client的方法。

  • 安装websocket-client模块 首先给python环境安装websocket-client模块。
  • pip install websocket-client
    
    
  • 简易python websocket client
  • 编写自己的websocket client 考虑到树莓派的计算能力,我想采用的方法是在电脑上跑主控程序,在树莓派上跑语音模块ros,使用时需要使两者连接在同一个局域网下,然后websocket-client的连接地址就是电脑的地址及不同端口,可以使用ifconfig进行查询。 在这里插入图片描述 源码:
  • 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。 在这里插入图片描述

    评论区

    励志做一条安静的咸鱼,从此走上人生巅峰。

    0

    0

    0

    举报