四、ROS2通信机制(话题)

1 话题

话题即ROS2中Topic通信方式,Topic通信模型是一种发布订阅模型

1.1 话题的发布订阅模型

A节点创建一个发布者Publisher来发布一个话题,B节点创建一个订阅者Subscriber来订阅A节点发布的话题。显然这是一个一对一的模型,除此以外,ROS2中话题通信还可以是1对n,n对1,n对n的。

1.2 话题通信需要注意的规则

1、话题名字是关键,发布订阅接口类型要相同。举个例子、发布的是字符串,接受也要字符串
2、同一个节点可以订阅多个话题,也可以发布多个话题
3、同一个话题可以有多个发布者

1.3 ROS2话题相关命令行界面(CLI)工具

查看指令 ros2 topic -h
返回系统中当前活动的所有主题列表 ros2 topic list
返回系统中当前活动的所有主题列表及其消息类型ros2 topic list -t
打印实时话题内容 ros2 topic echo /话题名
查看主题信息 ros2 topic info /话题名
查看消息类型 ros2 interface show xxx
手动发布命令 ros2 topic pub arg

1.4 编写一个话题发布者流程

1、导入消息类型

from std_msgs.msg import String

2、声明并创建发布者

#10是队列大小
self.pub_novel = self.create_publisher(Strng, "话题名", 10)

3、编写发布逻辑发布数据

#时间周期
self.timer_period = 5
#定义一个回调
def timer_callback(self):
	msg = String()
	msg.data = "xxxxxx"
	self.pub_novel(msg)
	self.get_logger().info("发布了一个话题消息, 内容是%s" % msg.data)
#创建一个定时器,每一个周期去调用这个函数
self.timer = self.create_timer(self.timer_period, self.timer_callback)
1.5 编写一个话题订阅者流程

1、导入订阅的话题接口类型

from std_msgs.msg import String,UInt32

2、传建订阅回调函数

def recv_callback(self, money):
	self.get_logger().info("收到话题")

3、声明并创建订阅者

self.sub = self.create_subscription(UInt32, "话题名", self.recv_callback, 10):
	pass
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS 2的Foxy版本是ROS(Robot Operating System)的一个稳定版本,其中包含了一些新的特性和改进。在ROS 2 Foxy中,话题通信仍然是一个重要的概念。 在ROS 2中,话题是一种用于传递消息的机制。通过发布者(Publisher)和订阅者(Subscriber)之间的话题通信,节点可以共享信息。话题的消息类型在编译时确定,并且使用ROS 2的接口定义语言(IDL)来描述。 要进行话题通信,首先需要定义消息类型。可以使用ROS 2提供的标准消息类型,也可以自定义消息类型。接下来,在发布者节点中创建一个发布者对象,并指定要发布话题名称和消息类型。然后,在订阅者节点中创建一个订阅者对象,并指定要订阅的话题名称和消息类型。 发布者节点将消息发布话题上,而订阅者节点将从话题上接收到发布者发送的消息。这样,节点之间就可以实现信息的传递和共享。 以下是一个简单的示例代码,演示了如何在ROS 2 Foxy中进行话题通信发布者节点代码: ```python import rclpy from std_msgs.msg import String def main(args=None): rclpy.init(args=args) node = rclpy.create_node('publisher') publisher = node.create_publisher(String, 'topic_name') msg = String() msg.data = 'Hello, ROS 2!' while rclpy.ok(): publisher.publish(msg) rclpy.spin_once(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 订阅者节点代码: ```python import rclpy from std_msgs.msg import String def callback(msg): print('Received message:', msg.data) def main(args=None): rclpy.init(args=args) node = rclpy.create_node('subscriber') subscriber = node.create_subscription(String, 'topic_name', callback) rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 在上面的示例中,发布者节点创建了一个发布者对象,并使用`node.create_publisher`方法指定了要发布话题名称。每次循环中,它都会发布一个包含字符串消息的消息对象。 订阅者节点创建了一个订阅者对象,并使用`node.create_subscription`方法指定了要订阅的话题名称和回调函数。每当收到来自发布者的消息时,回调函数将被调用,并打印出接收到的消息内容。 这只是一个简单的示例,实际中可能会涉及更复杂的消息类型和逻辑。但是,通过这个基本的框架,你可以开始在ROS 2 Foxy中进行话题通信
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值