① 背景
节点是通过ROS graph 进行通信的可执行程序。在本教程中,节点将通过主题以字符串消息的形式相互传递信息。这里使用的示例是一个简单的“talker”和“listener”系统。一个节点发布数据,另一个节点订阅该主题,以便它可以接收该数据,基于python

② 前提
创建好工作空间

③ 任务
Ⅰ 创建一个包
创建一个pubsub的包
切换到dev_ws/src路径下

ros2 pkg create --build-type ament_python py_pubsub

Ⅱ 写发布节点切换到dev_ws/src/py_pubsub/py_pubsub 路径下执行命令下载demo

wget https://raw.githubusercontent.com/ros2/examples/master/rclpy/topics/minimal_publisher/examples_rclpy_minimal_publisher/publisher_member_function.py

代码在这:

import rclpy
from rclpy.node import Node

from std_msgs.msg import String


class MinimalPublisher(Node):

    def __init__(self):
        super().__init__('minimal_publisher')
        self.publisher_ = self.create_publisher(String, 'topic', 10)
        timer_period = 0.5  # seconds
        self.timer = self.create_timer(timer_period, self.timer_callback)
        self.i = 0

    def timer_callback(self):
        msg = String()
        msg.data = 'Hello World: %d' % self.i
        self.publisher_.publish(msg)
        self.get_logger().info('Publishing: "%s"' % msg.data)
        self.i += 1


def main(args=None):
    rclpy.init(args=args)

    minimal_publisher = MinimalPublisher()

    rclpy.spin(minimal_publisher)

    # Destroy the node explicitly
    # (optional - otherwise it will be done automatically
    # when the garbage collector destroys the node object)
    minimal_publisher.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()

代码解析

在这里插入图片描述

修改 package.xml修改描述

<description>Examples of minimal publisher/subscriber using rclpy</description>
<maintainer email="you@email.com">Your Name</maintainer>
<license>Apache License 2.0</license>

增加依赖

<exec_depend>rclpy</exec_depend>
<exec_depend>std_msgs</exec_depend>

修改 setup.py这个和xml一样的

maintainer='YourName',
maintainer_email='you@email.com',
description='Examples of minimal publisher/subscriber using rclpy',
license='Apache License 2.0',

在 entry_points 下的 console_scripts 里添加,这是个list可以写无数个

entry_points={
        'console_scripts': [
                'talker = py_pubsub.publisher_member_function:main',
        ],
},

检查 setup.cfg是这样

[develop]
script-dir=$base/lib/py_pubsub
[install]
install-scripts=$base/lib/py_pubsub

这个配置是说明 可执行文件是在 lib下面,ros2 run 的时候会到目录下查找

写订阅节点

dev_ws/src/py_pubsub/py_pubsub 下载demo

wget https://raw.githubusercontent.com/ros2/examples/master/rclpy/topics/minimal_subscriber/examples_rclpy_minimal_subscriber/subscriber_member_function.py

下载失败的话,从我这边粘贴吧代码:

import rclpy
from rclpy.node import Node

from std_msgs.msg import String


class MinimalSubscriber(Node):

    def __init__(self):
        super().__init__('minimal_subscriber')
        self.subscription = self.create_subscription(
            String,
            'topic',
            self.listener_callback,
            10)
        self.subscription  # prevent unused variable warning

    def listener_callback(self, msg):
        self.get_logger().info('I heard: "%s"' % msg.data)


def main(args=None):
    rclpy.init(args=args)

    minimal_subscriber = MinimalSubscriber()

    rclpy.spin(minimal_subscriber)

    # Destroy the node explicitly
    # (optional - otherwise it will be done automatically
    # when the garbage collector destroys the node object)
    minimal_subscriber.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()

代码解析

在这里插入图片描述

修改 package.xml

基于前面的pub没有新增依赖,所以不用修改

修改 setup.py

在刚刚的entry_points 在加一行变成这样

entry_points={
        'console_scripts': [
                'talker = py_pubsub.publisher_member_function:main',
                'listener = py_pubsub.subscriber_member_function:main',
        ],
},

Ⅳ 编译和运行养成好习惯,编译前先解决依赖,切换到dev_ws下

sudo rosdep install -i --from-path src --rosdistro eloquent -y

只编译新增的包

colcon build --packages-select py_pubsub

安装环境

. install/setup.bash

运行两个节点

ros2 run py_pubsub talker
ros2 run py_pubsub listener

在这里插入图片描述

④ 总结

您创建了两个节点来发布和订阅主题上的数据。在编译和运行它们之前,您已将它们的依赖项和可执行文件添加到包配置文件中。
这些例子中使用的代码可以在这里找到。