|
@@ -12,24 +12,24 @@
|
|
|
|
|
|
### 1.1 如何编写
|
|
|
|
|
|
-如果编写一个话题发布者呢?其实很简单,大家记得我们创建李四这个类的时候让其继承了Node节点,像下面这样:
|
|
|
+如果编写一个话题发布者呢?其实很简单,大家记得我们创建作家这个类的时候让其继承了Node节点,像下面这样:
|
|
|
|
|
|
```
|
|
|
-class Li4Node(Node):
|
|
|
+class WriterNode(Node):
|
|
|
```
|
|
|
|
|
|
-这是什么意思呢?如果没有学过面向对象的同学可能很懵逼,其实很简单,这种在自己名字里写一个Node的意思就是让Li4Node继承于Node,这样李四就能拥有Node所具备的属性和能力。
|
|
|
+这是什么意思呢?如果没有学过面向对象的同学可能很懵逼,其实很简单,这种在自己名字里写一个Node的意思就是让WriterNode继承于Node,这样李四就能拥有Node所具备的属性和能力。
|
|
|
|
|
|
-大家可以把Node理解成人类,Li4Node继承于Node,也就是说李四是一个人类,这样李四就拥有了人类所具备的手和脚等器官,且获得说话吃饭刷B站和关注小鱼公众号的能力了。
|
|
|
+大家可以把Node理解成人类,WriterNode继承于Node,也就是说李四是一个人类,这样李四就拥有了人类所具备的手和脚等器官,且获得说话吃饭刷B站和关注小鱼公众号的能力了。
|
|
|
|
|
|
-那代码里的Li4Node继承Node之后,会具备什么能力呢?在本节中用到了以下四个能力:
|
|
|
+那代码里的WriterNode继承Node之后,会具备什么能力呢?在本节中用到了以下四个能力:
|
|
|
|
|
|
-- 创建一个话题发布者的能力
|
|
|
+- 创建一个话题发布者的能力
|
|
|
- 创建一个定时器的能力
|
|
|
- 创建一个话题订阅者的能力
|
|
|
- 获取日志打印器的能力
|
|
|
|
|
|
-接下来我们就依次调用Li4Node所继承的能力来实现订阅发布功能。
|
|
|
+接下来我们就依次调用WriterNode所继承的能力来实现订阅发布功能。
|
|
|
|
|
|
|
|
|
|
|
@@ -37,7 +37,14 @@ class Li4Node(Node):
|
|
|
|
|
|
用VsCode打开上一章中town_ws工作空间,并打开li4.py。我们在其中添加代码即可。
|
|
|
|
|
|
-添加完成后Li4Node类中代码如下:
|
|
|
+编写一个话题发布者一流程:
|
|
|
+
|
|
|
+1. 导入消息类型
|
|
|
+2. 声明并创建发布者
|
|
|
+3. 编写发布逻辑发布数据
|
|
|
+
|
|
|
+
|
|
|
+添加完成后WriterNode类中代码如下:
|
|
|
|
|
|
```
|
|
|
#!/usr/bin/env python3
|
|
@@ -45,7 +52,7 @@ import rclpy
|
|
|
from rclpy.node import Node
|
|
|
from std_msgs.msg import String
|
|
|
|
|
|
-class Li4Node(Node):
|
|
|
+class WriterNode(Node):
|
|
|
"""
|
|
|
创建一个李四节点,并在初始化时输出一句话
|
|
|
"""
|
|
@@ -153,6 +160,12 @@ ros2 run village_li li4_node
|
|
|
|
|
|
### 3.1 代码编写
|
|
|
|
|
|
+创建话题订阅者的一般流程:
|
|
|
+1. 导入订阅的话题类型
|
|
|
+2. 创建订阅回调函数
|
|
|
+3. 声明并创建订阅者
|
|
|
+4. 编写订阅回调处理逻辑
|
|
|
+
|
|
|
在上一部分代码的基础上添加了创建订阅器的函数:
|
|
|
|
|
|
```
|
|
@@ -170,7 +183,7 @@ from rclpy.node import Node
|
|
|
from std_msgs.msg import String
|
|
|
from std_msgs.msg import UInt32
|
|
|
|
|
|
-class Li4Node(Node):
|
|
|
+class WriterNode(Node):
|
|
|
"""
|
|
|
创建一个李四节点,并在初始化时输出一个话
|
|
|
"""
|
|
@@ -208,7 +221,7 @@ def main(args=None):
|
|
|
ros2运行该节点的入口函数,可配置函数名称
|
|
|
"""
|
|
|
rclpy.init(args=args) # 初始化rclpy
|
|
|
- node = Li4Node() # 新建一个节点
|
|
|
+ node = WriterNode() # 新建一个节点
|
|
|
rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
|
|
|
rclpy.shutdown() # rcl关闭
|
|
|
```
|
|
@@ -230,12 +243,9 @@ ros2 run village_li li4_node
|
|
|
ROS2支持下面两种方式,其中方式2最后是有一个空格的,大家注意
|
|
|
|
|
|
```
|
|
|
-ros2 topic pub /sexy_girl_money std_msgs/msg/UInt32 {data:\ 10}
|
|
|
+ros2 topic pub /sexy_girl_money std_msgs/msg/UInt32 "{data: 10}"
|
|
|
```
|
|
|
|
|
|
-```
|
|
|
-ros2 topic pub /sexy_girl_money std_msgs/msg/UInt32 data:\ 10\
|
|
|
-```
|
|
|
|
|
|
你可以看到,李四已经收到共计50块钱的稿费了。
|
|
|
|