• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

    ROS多個(gè)master消息互通

    來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 14:28:04
    文檔

    ROS多個(gè)master消息互通

    ROS多個(gè)master消息互通:需求有時(shí)候我們需要有幾個(gè)不同的master, 他們之間要交換topic的內(nèi)容,這時(shí)候就不能使用ros自帶的設(shè)置同一個(gè)master的方法.我們的處理方法是,構(gòu)造一個(gè)client和一個(gè)server,他們運(yùn)行在不同的master下面, client在master1下訂閱topic1,然后通過t
    推薦度:
    導(dǎo)讀ROS多個(gè)master消息互通:需求有時(shí)候我們需要有幾個(gè)不同的master, 他們之間要交換topic的內(nèi)容,這時(shí)候就不能使用ros自帶的設(shè)置同一個(gè)master的方法.我們的處理方法是,構(gòu)造一個(gè)client和一個(gè)server,他們運(yùn)行在不同的master下面, client在master1下訂閱topic1,然后通過t

    需求

    有時(shí)候我們需要有幾個(gè)不同的master, 他們之間要交換topic的內(nèi)容,這時(shí)候就不能使用ros自帶的設(shè)置同一個(gè)master的方法.

    我們的處理方法是,構(gòu)造一個(gè)client和一個(gè)server,他們運(yùn)行在不同的master下面, client在master1下訂閱topic1,然后通過tcp協(xié)議(自己定義一個(gè)消息協(xié)議格式)發(fā)到master2下面的server,進(jìn)行消息解析,再發(fā)布出master2下面的topic1,這樣我們不改變r(jià)os自帶的topic框架,就實(shí)現(xiàn)topic1的消息從master1到master2的傳播.

    下面我們實(shí)現(xiàn)的是將一個(gè)amcl_pose的topic,消息類型是PoseWithCovarianceStamped從master1傳到master2,其他的topic代碼類似

    client 的代碼

    #! /usr/bin/env python# -*- coding=utf-8 -*-import socketimport structimport rospyimport timefrom geometry_msgs.msg import PoseWithCovarianceStamped,PoseStamped#message proto# id | length | datadef send_msg(sock, msg ,id):
     # Prefix each message with a 4-byte id and length (network byte order)
     msg = struct.pack('>I',int(id)) + struct.pack('>I', len(msg)) + msg
     sock.sendall(msg)def odomCallback(msg):
     global odom_socket
    
     data = ""
    
     id = msg.header.seq print "send id: ",id
     x = msg.pose.pose.position.x
     y = msg.pose.pose.position.y #orientation
     orien_z = msg.pose.pose.orientation.z
     orien_w = msg.pose.pose.orientation.w
    
     data += str(x) + "," + str(y)+ "," + str(orien_z)+ "," + str(orien_w)
    
     send_msg(odom_socket,data,id)
    
    
    odom_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    odom_socket.connect(('127.0.0.1',8000))
    
    rospy.init_node('server_node')
    
    rospy.Subscriber('/amcl_pose',PoseWithCovarianceStamped,odomCallback)
    
    rospy.spin()

    server 的代碼

    #! /usr/bin/env python# -*- coding=utf-8 -*-import socketimport time,os,fcntlimport structimport rospyfrom geometry_msgs.msg import PoseWithCovarianceStamped,PoseStamped#message proto# id | length | datadef recv_msg(sock):
     try: # Read message length and unpack it into an integer
     raw_id = recvall(sock, 4) if not raw_id: return None
     id = struct.unpack('>I', raw_id)[0] print "receive id: ",id
     raw_msglen = recvall(sock, 4) if not raw_msglen: return None
     msglen = struct.unpack('>I', raw_msglen)[0] # Read the message data
     return recvall(sock, msglen) except Exception ,e: return Nonedef recvall(sock, n):
     # Helper function to recv n bytes or return None if EOF is hit
     data = ''
     while len(data) < n:
     packet = sock.recv(n - len(data)) if not packet: return None
     data += packet return data##把接受的數(shù)據(jù)重新打包成ros topic發(fā)出去def msg_construct(data):
    
     list = data.split(',')
    
     pose = PoseWithCovarianceStamped()
     pose.header.stamp = rospy.Time.now()
     pose.header.frame_id = "/map"
     pose.pose.pose.position.x = float(list[0])
     pose.pose.pose.position.y = float(list[1])
     pose.pose.pose.position.z = 0
     pose.pose.pose.orientation.x = 0
     pose.pose.pose.orientation.y = 0
     pose.pose.pose.orientation.z = float(list[2])
     pose.pose.pose.orientation.w = float(list[3])
     pose.pose.covariance = [0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06853891945200942] return pose#初始化socket,監(jiān)聽8000端口odom_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    odom_socket.bind(('',8000))
    odom_socket.listen(10)
    
    (client,address) = odom_socket.accept()
    
    rospy.init_node("client_node")
    odom_pub = rospy.Publisher("/amcl_pose",PoseWithCovarianceStamped,queue_size=30)
    r = rospy.Rate(1000)#設(shè)置noblock,否則會(huì)阻塞在接聽,下面while不會(huì)一直循環(huán),只有在有數(shù)據(jù)才進(jìn)行下一次循環(huán)fcntl.fcntl(client, fcntl.F_SETFL, os.O_NONBLOCK)while not rospy.is_shutdown():
     data = recv_msg(client) if data:
     odom_pub.publish(msg_construct(data))
     r.sleep()

    結(jié)論

    上面的代碼在局域網(wǎng)內(nèi)測試過,發(fā)送圖像,激光的數(shù)據(jù)都可以保證不丟數(shù)據(jù)。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    ROS多個(gè)master消息互通

    ROS多個(gè)master消息互通:需求有時(shí)候我們需要有幾個(gè)不同的master, 他們之間要交換topic的內(nèi)容,這時(shí)候就不能使用ros自帶的設(shè)置同一個(gè)master的方法.我們的處理方法是,構(gòu)造一個(gè)client和一個(gè)server,他們運(yùn)行在不同的master下面, client在master1下訂閱topic1,然后通過t
    推薦度:
    標(biāo)簽: 信息 互通 多個(gè)
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 无码久久精品国产亚洲Av影片| 国产精品无码AV一区二区三区| 中文字幕精品一区二区三区视频| 精品成人免费自拍视频| 中文字幕乱码中文乱码51精品 | 欧美韩国精品另类综合| 无码人妻精品一区二区三区99仓本| 精品国产污污免费网站入口在线| 久久97精品久久久久久久不卡| 热re99久久6国产精品免费| 亚洲AV永久无码精品一区二区国产| 国产亚洲精品拍拍拍拍拍| 亚洲精品天天影视综合网| 国产精品久久国产精品99盘 | 国产精品人人做人人爽| 老司机91精品网站在线观看| 国产欧美精品一区二区三区 | 99久久这里只有精品| 精品一区二区三区波多野结衣| 亚洲精品无码久久一线| 一区二区日韩国产精品| 亚洲第一永久AV网站久久精品男人的天堂AV | 国产99视频精品免视看7| 日韩精品无码一本二本三本| 亚洲精品国产综合久久一线| 日本五区在线不卡精品| 日本精品一区二区久久久| 精品人妻少妇一区二区三区| 国内精品久久久久久麻豆| 国产一区二区三区欧美精品| 精品国产亚洲男女在线线电影 | 久久亚洲av无码精品浪潮| 国产午夜精品理论片久久| 国产精品亚洲专区无码WEB| 国产精品白丝AV嫩草影院| 国产精品毛片一区二区| 国产精品免费久久久久久久久| 国产精品亚洲mnbav网站| 精品国产AⅤ一区二区三区4区| 久久人人爽人人精品视频| 中文无码精品一区二区三区|