ROS2智能机器人开发实践-阅读分享3-ros2节点和话题通信
[复制链接]
ROS2智能机器人开发实践-阅读分享3-ros2节点和话题通信
话题是ros2最重要的通信方式,其余的三个通信都是以此为基础的。
继续上一次的分享,我们已经创建了一个python功能包,我建议大家可以在这个功能包里面添加功能文件,一个功能包可以添加很多个功能文件。
在此之前我们需要先配置开发环境,使用不方便的ubuntu自带的编辑器是很麻烦且不友好(其实书籍并没有提及这一点,因为此书主要是介绍ros2的),我在这里使用的是主机的vscode使用ssh连接虚拟机,实际上因为我比较懒不想再一次下载vscode了。如何连接大家可以自己搜索了解。
连接之后我们可以在我的指示的位置创建一个python文件,名字为node_helloworld_class.py
然后我们可以进行编写,代码如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@作者: 古月居(www.guyuehome.com)
@说明: ROS2节点示例-发布“Hello World”日志信息, 使用面向对象的实现方式
"""
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
import time
"""
创建一个HelloWorld节点, 初始化时输出“hello world”日志
"""
class HelloWorldNode(Node):
def __init__(self, name):
super().__init__(name) # ROS2节点父类初始化
while rclpy.ok(): # ROS2系统是否正常运行
self.get_logger().info("Hello World") # ROS2日志输出
time.sleep(0.5) # 休眠控制循环时间
def main(args=None): # ROS2节点主入口main函数
rclpy.init(args=args) # ROS2 Python接口初始化
node = HelloWorldNode("node_helloworld_class") # 创建ROS2节点对象并进行初始化
node.destroy_node() # 销毁节点对象
rclpy.shutdown() # 关闭ROS2 Python接口
这里的代码中我们创建一个类helloworld,它继承了Node类,在这个节点中我们不停的发布日志,最后我们实例化这个类。
随后我们需要对编译文件进行简单描述.在setup.py文件中修改文件如下:
'console_scripts': [
'node_helloworld_class = learning_pkg_python_zy.node_helloworld_class:main',
],
然后我们就可以编译运行了,这里的colcon build后面添加 --packages-select可以添加我们需要编译的功能包,我们这里只修改了一个功能包所以不要编译其他的。
cd ~/dev_ws
colcon build --packages-select learning_pkg_python_zy
source install/setup.bash
ros2 run learning_pkg_python_zy node_helloworld_class
在上面我们基本已经学会了使用节点,下面我们来添加一点其余东西-话题通信。
话题通信
我们要要了解话题是一个什么东西???我的理解是话题是一种数据形式,在代码中我们常用的有int,float等格式,但是对于ros2来说这些单独一个int数据几乎不能表达含义,比如一张rgb类型的image,我们需要数组来表示,除了图片外,我们通常还需要图片的拍摄时间,图片名字等,我们把他们组合在一起就是一个话题。
除了话题,我们还要了解通信机制特点,话题本身需要一个消息接口也就是数据的类型,如下图所示 sensor_msgs/msg/Image就是一种数据类型,这个数据的格式如下展现。
除了数据类型,话题通信的一大特点就是独立于节点,一个话题可以接收多个节点的数据,也可以给多个节点提供数据,话题和节点之间并没有耦合关系。
另外就是:异步。话题的发送和订阅是不同步的,发布节点和订阅节点并不知道这个话题啥时候订阅的也不知道啥时候发布的,所以叫做异步。
那么我们来写一个话题发布者和接收者吧!!!
我们在上节课node_helloworld_class.py的地方在此创建文件topic_helloworld_pub.py文件。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@作者: 古月居(www.guyuehome.com)
@说明: ROS2话题示例-发布“Hello World”话题
"""
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
from std_msgs.msg import String # 字符串消息类型
"""
创建一个发布者节点
"""
class PublisherNode(Node):
def __init__(self, name):
super().__init__(name) # ROS2节点父类初始化
self.pub = self.create_publisher(String, "chatter", 10) # 创建发布者对象(消息类型、话题名、队列长度)
self.timer = self.create_timer(0.5, self.timer_callback) # 创建一个定时器(单位为秒的周期,定时执行的回调函数)
def timer_callback(self): # 创建定时器周期执行的回调函数
msg = String() # 创建一个String类型的消息对象
msg.data = 'Hello World' # 填充消息对象中的消息数据
self.pub.publish(msg) # 发布话题消息
self.get_logger().info('Publishing: "%s"' % msg.data) # 输出日志信息,提示已经完成话题发布
def main(args=None): # ROS2节点主入口main函数
rclpy.init(args=args) # ROS2 Python接口初始化
node = PublisherNode("topic_helloworld_pub") # 创建ROS2节点对象并进行初始化
rclpy.spin(node) # 循环等待ROS2退出
node.destroy_node() # 销毁节点对象
rclpy.shutdown() # 关闭ROS2 Python接口
然后我们创建订阅者,新建文件topic_helloworld_sub.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@作者: 古月居(www.guyuehome.com)
@说明: ROS2话题示例-订阅“Hello World”话题消息
"""
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
from std_msgs.msg import String # ROS2标准定义的String消息
"""
创建一个订阅者节点
"""
class SubscriberNode(Node):
def __init__(self, name):
super().__init__(name) # ROS2节点父类初始化
self.sub = self.create_subscription(\
String, "chatter", self.listener_callback, 10) # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)
def listener_callback(self, msg): # 创建回调函数,执行收到话题消息后对数据的处理
self.get_logger().info('I heard: "%s"' % msg.data) # 输出日志信息,提示订阅收到的话题消息
def main(args=None): # ROS2节点主入口main函数
rclpy.init(args=args) # ROS2 Python接口初始化
node = SubscriberNode("topic_helloworld_sub") # 创建ROS2节点对象并进行初始化
rclpy.spin(node) # 循环等待ROS2退出
node.destroy_node() # 销毁节点对象
rclpy.shutdown() # 关闭ROS2 Python接口
前往setup.py
entry_points={
'console_scripts': [
'node_helloworld_class = learning_pkg_python_zy.node_helloworld_class:main',
'topic_helloworld_sub = learning_pkg_python_zy.topic_helloworld_sub:main',
'topic_helloworld_pub = learning_pkg_python_zy.topic_helloworld_pub:main',
],
},
随后编译执行:
colcon build
source install/setup.bash
ros2 run learning_pkg_python_zy topic_helloworld_pub
# 这里运行后要打开第二个终端,然后进入dev_ws路径下
source install/setup.bash
ros2 run learning_pkg_python_zy topic_helloworld_sub
效果如下:
以上就是关于本书的第三次分享,分享内容多为书本内容,本人在此由于篇幅有限只是介绍核心内容,本文我介绍了我们该如何创建一个节点和如何使用话题通信,在下次分享我将尽力分享服务,动作和参数通信!!!如果大家有任何疑問可以發我郵箱或者直接評論(不一定準時),郵箱3499248831@qq.com.
|