|
@@ -7,7 +7,6 @@
|
|
接下来快和小鱼一起动手学习编写Python的话题发布者和订阅者吧~
|
|
接下来快和小鱼一起动手学习编写Python的话题发布者和订阅者吧~
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
## 1.发布话题(sexy_girl)
|
|
## 1.发布话题(sexy_girl)
|
|
|
|
|
|
### 1.1 如何编写
|
|
### 1.1 如何编写
|
|
@@ -20,7 +19,7 @@ class WriterNode(Node):
|
|
|
|
|
|
这是什么意思呢?如果没有学过面向对象的同学可能很懵逼,其实很简单,这种在自己名字里写一个Node的意思就是让WriterNode继承于Node,这样李四就能拥有Node所具备的属性和能力。
|
|
这是什么意思呢?如果没有学过面向对象的同学可能很懵逼,其实很简单,这种在自己名字里写一个Node的意思就是让WriterNode继承于Node,这样李四就能拥有Node所具备的属性和能力。
|
|
|
|
|
|
-大家可以把Node理解成人类,WriterNode继承于Node,也就是说李四是一个人类,这样李四就拥有了人类所具备的手和脚等器官,且获得说话吃饭刷B站和关注小鱼公众号的能力了。
|
|
|
|
|
|
+> 大家可以把Node理解成人类,作家类(WriterNode)继承于人类(Node),李四是一名作家,也可以说李四是一个人类,人类所具备的手和脚等器官,能说话吃饭刷B站和关注小鱼公众号了,那么李四肯定也具备这些能力。
|
|
|
|
|
|
那代码里的WriterNode继承Node之后,会具备什么能力呢?在本节中用到了以下四个能力:
|
|
那代码里的WriterNode继承Node之后,会具备什么能力呢?在本节中用到了以下四个能力:
|
|
|
|
|
|
@@ -31,7 +30,7 @@ class WriterNode(Node):
|
|
|
|
|
|
接下来我们就依次调用WriterNode所继承的能力来实现订阅发布功能。
|
|
接下来我们就依次调用WriterNode所继承的能力来实现订阅发布功能。
|
|
|
|
|
|
-
|
|
|
|
|
|
+> 详细的能力可以查看API:https://docs.ros2.org/foxy/api/rclpy/index.html
|
|
|
|
|
|
### 1.2 编写程序
|
|
### 1.2 编写程序
|
|
|
|
|
|
@@ -52,32 +51,38 @@ import rclpy
|
|
from rclpy.node import Node
|
|
from rclpy.node import Node
|
|
from std_msgs.msg import String
|
|
from std_msgs.msg import String
|
|
|
|
|
|
|
|
+
|
|
class WriterNode(Node):
|
|
class WriterNode(Node):
|
|
"""
|
|
"""
|
|
- 创建一个李四节点,并在初始化时输出一句话
|
|
|
|
|
|
+ 创建一个李四节点,并在初始化时输出一个话
|
|
"""
|
|
"""
|
|
- def __init__(self):
|
|
|
|
- super().__init__("li4") #给节点一个名字 li4
|
|
|
|
- self.get_logger().info("大家好,我是李四,我是一名作家!") #来个自我介绍
|
|
|
|
- self.write = self.create_publisher(String,"sexy_girl", 10)
|
|
|
|
- timer_period = 1 #李四的手速,每1s写一段话,够不够快
|
|
|
|
- self.timer = self.create_timer(timer_period, self.timer_callback) #启动一个定时装置,每 1 s,调用一次time_callback函数
|
|
|
|
|
|
+ def __init__(self,name):
|
|
|
|
+ super().__init__(name)
|
|
|
|
+ self.get_logger().info("大家好,我是%s,我是一名作家!" % name)
|
|
|
|
+ # 创建并初始化发布者成员属性pubnovel
|
|
|
|
+ self.pubnovel = self.create_publisher(String,"sexy_girl", 10)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ # 创建定时器成员属性timer
|
|
self.i = 0 # i 是个计数器,用来算章节编号的
|
|
self.i = 0 # i 是个计数器,用来算章节编号的
|
|
|
|
+ timer_period = 5 #每5s写一章节话
|
|
|
|
+ self.timer = self.create_timer(timer_period, self.timer_callback) #启动一个定时装置,每 1 s,调用一次time_callback函数
|
|
|
|
+
|
|
|
|
|
|
def timer_callback(self):
|
|
def timer_callback(self):
|
|
"""
|
|
"""
|
|
- 定时器,用于定时发布小说
|
|
|
|
|
|
+ 定时器回调函数
|
|
"""
|
|
"""
|
|
msg = String()
|
|
msg = String()
|
|
msg.data = '第%d回:潋滟湖 %d 次偶遇胡艳娘' % (self.i,self.i)
|
|
msg.data = '第%d回:潋滟湖 %d 次偶遇胡艳娘' % (self.i,self.i)
|
|
- self.write.publish(msg) #将小说内容发布出去
|
|
|
|
|
|
+ self.pubnovel.publish(msg) #将小说内容发布出去
|
|
self.get_logger().info('李四:我发布了艳娘传奇:"%s"' % msg.data) #打印一下发布的数据,供我们看
|
|
self.get_logger().info('李四:我发布了艳娘传奇:"%s"' % msg.data) #打印一下发布的数据,供我们看
|
|
self.i += 1 #章节编号+1
|
|
self.i += 1 #章节编号+1
|
|
```
|
|
```
|
|
|
|
|
|
### 1.3 代码讲解
|
|
### 1.3 代码讲解
|
|
|
|
|
|
-#### 创建发布者
|
|
|
|
|
|
+#### 1.3.1 创建发布者
|
|
|
|
|
|
```
|
|
```
|
|
self.create_publisher(String,"sexy_girl", 10)
|
|
self.create_publisher(String,"sexy_girl", 10)
|
|
@@ -107,7 +112,7 @@ ros2 interface package std_msgs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-#### 定时器
|
|
|
|
|
|
+#### 1.3.2 编写发布逻辑发布数据
|
|
|
|
|
|
这里小鱼使用了一个方法来创建一个定时器
|
|
这里小鱼使用了一个方法来创建一个定时器
|
|
|
|
|
|
@@ -161,7 +166,7 @@ ros2 run village_li li4_node
|
|
### 3.1 代码编写
|
|
### 3.1 代码编写
|
|
|
|
|
|
创建话题订阅者的一般流程:
|
|
创建话题订阅者的一般流程:
|
|
-1. 导入订阅的话题类型
|
|
|
|
|
|
+1. 导入订阅的话题接口类型
|
|
2. 创建订阅回调函数
|
|
2. 创建订阅回调函数
|
|
3. 声明并创建订阅者
|
|
3. 声明并创建订阅者
|
|
4. 编写订阅回调处理逻辑
|
|
4. 编写订阅回调处理逻辑
|
|
@@ -180,38 +185,47 @@ self.create_subscription(UInt32,"sexy_girl_money",self.recv_money_callback,10)
|
|
#!/usr/bin/env python3
|
|
#!/usr/bin/env python3
|
|
import rclpy
|
|
import rclpy
|
|
from rclpy.node import Node
|
|
from rclpy.node import Node
|
|
-from std_msgs.msg import String
|
|
|
|
-from std_msgs.msg import UInt32
|
|
|
|
|
|
+# 导入话题消息类型
|
|
|
|
+from std_msgs.msg import String,UInt32
|
|
|
|
|
|
class WriterNode(Node):
|
|
class WriterNode(Node):
|
|
"""
|
|
"""
|
|
创建一个李四节点,并在初始化时输出一个话
|
|
创建一个李四节点,并在初始化时输出一个话
|
|
"""
|
|
"""
|
|
- def __init__(self):
|
|
|
|
- super().__init__("li4") #给节点一个名字 li4
|
|
|
|
- self.get_logger().info("大家好,我是李四,我是一名作家!") #来个自我介绍
|
|
|
|
|
|
+ def __init__(self,name):
|
|
|
|
+ super().__init__(name)
|
|
|
|
+ self.get_logger().info("大家好,我是%s,我是一名作家!" % name)
|
|
|
|
+ # 创建并初始化发布者成员属性pubnovel
|
|
|
|
+ self.pubnovel = self.create_publisher(String,"sexy_girl", 10)
|
|
|
|
|
|
- self.write = self.create_publisher(String,"sexy_girl", 10)
|
|
|
|
- timer_period = 1 #李四的手速,每1s写一段话,够不够快
|
|
|
|
- self.timer = self.create_timer(timer_period, self.timer_callback) #启动一个定时装置,每 1 s,调用一次time_callback函数
|
|
|
|
|
|
+
|
|
|
|
+ # 创建定时器成员属性timer
|
|
self.i = 0 # i 是个计数器,用来算章节编号的
|
|
self.i = 0 # i 是个计数器,用来算章节编号的
|
|
|
|
+ timer_period = 5 #每5s写一章节话
|
|
|
|
+ self.timer = self.create_timer(timer_period, self.timer_callback) #启动一个定时装置,每 1 s,调用一次time_callback函数
|
|
|
|
+
|
|
|
|
|
|
# 账户钱的数量
|
|
# 账户钱的数量
|
|
- self.account = 0
|
|
|
|
- # 开启收钱箱
|
|
|
|
- self.sub_ = self.create_subscription(UInt32,"sexy_girl_money",self.recv_money_callback,10)
|
|
|
|
|
|
+ self.account = 80
|
|
|
|
+ # 创建并初始化订阅者成员属性submoney
|
|
|
|
+ self.submoney = self.create_subscription(UInt32,"sexy_girl_money",self.recv_money_callback,10)
|
|
|
|
+
|
|
|
|
|
|
def timer_callback(self):
|
|
def timer_callback(self):
|
|
"""
|
|
"""
|
|
- 定时器,用于定时发布小说
|
|
|
|
|
|
+ 定时器回调函数
|
|
"""
|
|
"""
|
|
msg = String()
|
|
msg = String()
|
|
msg.data = '第%d回:潋滟湖 %d 次偶遇胡艳娘' % (self.i,self.i)
|
|
msg.data = '第%d回:潋滟湖 %d 次偶遇胡艳娘' % (self.i,self.i)
|
|
- self.write.publish(msg) #将小说内容发布出去
|
|
|
|
|
|
+ self.pubnovel.publish(msg) #将小说内容发布出去
|
|
self.get_logger().info('李四:我发布了艳娘传奇:"%s"' % msg.data) #打印一下发布的数据,供我们看
|
|
self.get_logger().info('李四:我发布了艳娘传奇:"%s"' % msg.data) #打印一下发布的数据,供我们看
|
|
self.i += 1 #章节编号+1
|
|
self.i += 1 #章节编号+1
|
|
|
|
|
|
|
|
+
|
|
def recv_money_callback(self,money):
|
|
def recv_money_callback(self,money):
|
|
|
|
+ """
|
|
|
|
+ 4. 编写订阅回调处理逻辑
|
|
|
|
+ """
|
|
self.account += money.data
|
|
self.account += money.data
|
|
self.get_logger().info('李四:我已经收到了%d的稿费' % self.account)
|
|
self.get_logger().info('李四:我已经收到了%d的稿费' % self.account)
|
|
|
|
|
|
@@ -221,7 +235,7 @@ def main(args=None):
|
|
ros2运行该节点的入口函数,可配置函数名称
|
|
ros2运行该节点的入口函数,可配置函数名称
|
|
"""
|
|
"""
|
|
rclpy.init(args=args) # 初始化rclpy
|
|
rclpy.init(args=args) # 初始化rclpy
|
|
- node = WriterNode() # 新建一个节点
|
|
|
|
|
|
+ node = WriterNode("li4") # 新建一个节点
|
|
rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
|
|
rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
|
|
rclpy.shutdown() # rcl关闭
|
|
rclpy.shutdown() # rcl关闭
|
|
```
|
|
```
|