当前位置:   article > 正文

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

ros websocket python

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

rosbridge

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

python编写客户端

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

  1. 安装websocket-client模块
    首先给python环境安装websocket-client模块。
pip install websocket-client
  • 1
  1. 简易python websocket client
  2. 编写自己的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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

运行效果

成功进行连接,当语音识别到716之后会发送给主控,主控将目标设置为716,之后客户端会收到发回的指令200,其余情况下,客户端收到指令400。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/107775
推荐阅读
相关标签
  

闽ICP备14008679号