动手学ROS2-2节点通信-话题之RCLPY实现

文章详细介绍了如何利用RCLPY在ROS2中创建功能包和节点,分别实现了话题的发布者和订阅者。通过创建publisher和subscriber节点,以及相应的回调函数,实现了消息的传递。最后,提到了使用RQT工具进行可视化观察。
摘要由CSDN通过智能技术生成

目录

三、话题之RCLPY实现

1.创建功能包和节点

2.运行测试

三、话题之RCLPY实现

ROS2的API一致性保持的很好,使得实现不同版本的发布订阅比较简单。

1.创建功能包和节点

依托RCLCPP实现中创建的工作空间,创建新的功能包

cd chapt3_ws/src/

ros2 pkg create example_topic_rclpy --build-type ament_python --dependencies rclpy

创建节点文件

cd example_topic_rclpy/example_topic_rclpy

touch topic_subscribe_02.py

touch topic_publisher_02.py

编写代码源文件topic_publisher_02.py,创建节点,编写发布者

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node

class NodePublisher02(Node):
    def __init__(self,name):
        super().__init__(name)
        self.get_logger().info("大家好,我是%s!" % name)
        self.command_publisher_ = self.create_publisher(String,"command", 10) 
        self.timer = self.create_timer(0.5, self.timer_callback)

    def timer_callback(self):
        """
        定时器回调函数
        """
        msg = String()
        msg.data = 'backup'
        self.command_publisher_.publish(msg) 
        self.get_logger().info(f'发布了指令:{msg.data}')    #打印一下发布的数据

def main(args=None):
    rclpy.init(args=args) # 初始化rclpy
    node = NodePublisher02("topic_publisher_02")  # 新建一个节点
    rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
    rclpy.shutdown() # 关闭rclpy

编写代码源文件topic_subscribe_02.py,创建节点,编写订阅者

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node

class NodeSubscribe02(Node):
    def __init__(self,name):
        super().__init__(name)
        self.get_logger().info("大家好,我是%s!" % name)
        # 创建订阅者
        self.command_subscribe_ =                 
          self.create_subscription(String,"command",self.command_callback,10)

    def command_callback(self,msg):
        speed = 0.0
        if msg.data=="backup":
            speed = -0.2
        self.get_logger().info(f'收到[{msg.data}]命令,发送速度{speed}')


def main(args=None):
    rclpy.init(args=args) # 初始化rclpy
    node = NodeSubscribe02("topic_subscribe_02")  # 新建一个节点
    rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
    rclpy.shutdown() # 关闭rclpy

修改setup.py,这段配置是声明一个ROS2的节点,声明后使用colcon build才能检测到,然后将其添加到install目录下

    entry_points={
        'console_scripts': [
            "topic_publisher_02 = example_topic_rclpy.topic_publisher_02:main",
            "topic_subscribe_02 = example_topic_rclpy.topic_subscribe_02:main"
        ],
    },

2.运行测试

在工作空间目录下,编译,运行发布节点

colcon build --packages-select example_topic_rclpy

source install/setup.bash

ros2 run example_topic_rclpy topic_publisher_02

在工作空间目录下,运行订阅节点

source install/setup.bash

ros2 run example_topic_rclpy topic_subscribe_02

RQT可视化工具观察

ROS2中,节点之间的通信可以通过发布者(Publisher)和订阅者(Subscriber)来实现。具体的实现步骤如下: 1. 创建节点 首先,需要创建节点并且初始化ROS2系统,代码如下: ```python import rclpy rclpy.init() node = rclpy.create_node('my_node') ``` 2. 创建发布者 接下来,需要创建一个发布者对象并且指定发布的主题名称、消息类型等信息,代码如下: ```python from std_msgs.msg import String publisher = node.create_publisher(String, 'my_topic', 10) ``` 其中,String是消息类型,'my_topic'是发布的主题名称,10是队列的大小。 3. 发布消息 发布消息时,需要构造一个消息对象并且调用发布者对象的publish()方法,代码如下: ```python msg = String() msg.data = 'Hello, World!' publisher.publish(msg) ``` 这里构造了一个String类型的消息,将其data属性设置为'Hello, World!',然后调用publish()方法将消息发布出去。 4. 创建订阅者 创建订阅者的代码与创建发布者类似,需要指定订阅的主题名称、消息类型等信息,代码如下: ```python subscriber = node.create_subscription(String, 'my_topic', callback, 10) ``` 其中,callback是当订阅到消息时要执行的回调函数,10是队列的大小。 5. 定义回调函数 回调函数的作用是处理订阅到的消息,代码如下: ```python def callback(msg): print('I heard: [%s]' % msg.data) ``` 这里的回调函数将订阅到的消息打印出来。 6. 运行节点 最后,需要调用rclpy.spin()方法来运行节点,代码如下: ```python rclpy.spin(node) ``` 完整的代码如下: ```python import rclpy from std_msgs.msg import String def callback(msg): print('I heard: [%s]' % msg.data) def main(args=None): rclpy.init(args=args) node = rclpy.create_node('my_node') publisher = node.create_publisher(String, 'my_topic', 10) subscriber = node.create_subscription(String, 'my_topic', callback, 10) msg = String() msg.data = 'Hello, World!' publisher.publish(msg) rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 这个例子中创建了一个节点,同时创建了一个发布者和一个订阅者,发布了一条消息,然后运行节点并且等待订阅到消息。当订阅到消息时,会执行回调函数并且打印消息内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值