问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ROS计算图级-节点管理器(Master)?

发布网友 发布时间:2022-04-18 20:26

我来回答

2个回答

懂视网 时间:2022-04-19 00:48

需求

有时候我们需要有几个不同的master, 他们之间要交换topic的内容,这时候就不能使用ros自带的设置同一个master的方法.

我们的处理方法是,构造一个client和一个server,他们运行在不同的master下面, client在master1下订阅topic1,然后通过tcp协议(自己定义一个消息协议格式)发到master2下面的server,进行消息解析,再发布出master2下面的topic1,这样我们不改变ros自带的topic框架,就实现topic1的消息从master1到master2的传播.

下面我们实现的是将一个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##把接受的数据重新打包成ros topic发出去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,监听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)#设置noblock,否则会阻塞在接听,下面while不会一直循环,只有在有数据才进行下一次循环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()

结论

上面的代码在局域网内测试过,发送图像,激光的数据都可以保证不丢数据。

热心网友 时间:2022-04-18 21:56

节点管理器的作用主要有4个方面:为ROS节点提供命名和注册服务;方便ROS节点之间进行相互的查找;有助于ROS节点之间建立相互的通信连接;提供参数服务器,帮助ROS管理全局参数。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 《你是我的荣耀》路透曝光,这部剧是讲述什么故事的? 《你是我的荣耀》已杀青,这部剧主要讲了什么? 京润珍珠微商是传销吗 微商就是传销,金字塔消售模式,层层代理,呼吁广大市民远离微商,干掉微商指日可待 微商用金字塔模式用算传销吗 微商的金字塔型销售属于国家正规法律之内么,不会违背国家法律吗? 有人问我微商是不是金字塔模式 贵阳喀斯特公园的基本介绍 贵州未来家城市会客厅是干什么的? 隆基泰和的城市会客厅有什么功能? 重庆两江四岸指哪里 澳林城市会客厅成功的因素是什么? 眉山有哪几个代表公园? 宜宾一座公园在建中,围绕“一环六景”打造,建设面积多大? 商圈活化项目正式启动,打造城市会客厅。是什么意思? 请问如何通过软路由(ros)配置不同子网互访 曾经人迹罕至的城市疮疤,唐山南湖公园现在发展如何了? 澳林的城市会客厅理念怎么解释? 发廊的刮毛刀传播艾滋病吗?问题是理发师不小心刮破了皮肤 小区城市会客厅是干什么的 自我封闭出来后怎么发朋友圈? 盛大传奇3挂机脚本 王者传奇脚本挂机怎么搞 ROS两个网段如何互访 ROS不通的子网掩码怎么互通? ROS转弯时总是转过头 请问美国饶舌说唱RAP比赛是不是歌词都是对骂内容 欧阳靖在美国说唱届什么地位?美国说唱总统山能有谁 爱柯迪股份的铝合金铸造技术优势 求达人给我讲讲美国说唱的历史,什么南岸,什么西岸,什么硬核,什么匪帮? 【铝合金铸造企业】全国有几家铝合金铸造企业呢? 国内铝合金锻造知名企业有哪些 惊声尖笑3里面,为什么说唱比赛上那些黑人会鄙视那白人戴的尖帽子? 产量最大的铝合金压铸件企业是哪些 ? 我国产量最大的前十家铝合金压铸件企业是哪些? 一个美国的说唱高手! 怎样找到铝合金铸造企业 盐城高材铝合金铸造有限公司怎么样? 美国说唱的灵魂2pac的死 铝合金压铸企业哪家好?