ros2-如何实现一个简单的发布者和订阅者

ROS2Python中的发布-订阅通信教程
部署运行你感兴趣的模型镜像

话题通信是ROS 2中非常常见的一种通信方式。它基于发布-订阅模式,这意味着有一个节点负责发布数据,而另一个节点则订阅这些数据。订阅节点只要订阅了某个话题,就能收到发布节点发送的数据。接下来,我会用简单的步骤和代码示例,展示如何使用Python实现节点之间的话题通信。

1. 安装ROS 2

首先,你需要安装ROS 2。如果你还没有安装,可以参考[ROS 2官方安装指南](https://docs.ros.org/en/foxy/Installation.html)。

2. 创建工作空间和包

首先,在你的工作目录中创建一个ROS 2工作空间:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build

然后,在工作空间中创建一个新的ROS 2包:

cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python my_package

3. 编写发布节点

在`my_package`目录下,创建一个新的Python脚本,例如`publisher_node.py`:

# my_package/my_package/publisher_node.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  # 每0.5秒发布一次消息
        self.timer = self.create_timer(timer_period, self.timer_callback)
        self.i = 0

    def timer_callback(self):
        msg = String()
        msg.data = f'Hello, ROS 2: {self.i}'
        self.publisher_.publish(msg)
        self.get_logger().info(f'Publishing: "{msg.data}"')
        self.i += 1

def main(args=None):
    rclpy.init(args=args)
    minimal_publisher = MinimalPublisher()
    rclpy.spin(minimal_publisher)
    minimal_publisher.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

4. 编写订阅节点

在`my_package`目录下,创建另一个Python脚本,例如`subscriber_node.py`:

# my_package/my_package/subscriber_node.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  # 防止未使用变量的警告

    def listener_callback(self, msg):
        self.get_logger().info(f'I heard: "{msg.data}"')

def main(args=None):
    rclpy.init(args=args)
    minimal_subscriber = MinimalSubscriber()
    rclpy.spin(minimal_subscriber)
    minimal_subscriber.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

5. 更新setup.py

编辑`my_package/setup.py`文件,添加入口点以便于启动节点:

from setuptools import setup

package_name = 'my_package'

setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='Your Name',
    maintainer_email='yourname@example.com',
    description='Examples of minimal publisher/subscriber using rclpy',
    license='Apache License 2.0',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            'publisher_node = my_package.publisher_node:main',
            'subscriber_node = my_package.subscriber_node:main',
        ],
    },
)

 6. 更新package.xml

确保`package.xml`中包含以下依赖项:

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

 7. 编译和运行

在工作空间的根目录下编译包:

cd ~/ros2_ws
colcon build

编译完成后,运行发布节点:

source ~/ros2_ws/install/setup.bash
ros2 run my_package publisher_node

在另一个终端中,运行订阅节点:

source ~/ros2_ws/install/setup.bash
ros2 run my_package subscriber_node

通过以上步骤,你成功地使用Python实现了ROS 2中的话题通信。发布节点发布消息,订阅节点接收并打印这些消息。这就是ROS 2中话题通信的基本原理和实现方式。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

ROS 2中使用C++实现发布者订阅者节点是机器人开发中的基础任务。以下是一个完整的示例,展示了如何创建发布者订阅者,并进行话题通信。 ### 发布者节点 发布者节点将定期向指定的话题发布消息。以下是一个C++实现发布者节点示例: ```cpp #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" class MinimalPublisher : public rclcpp::Node { public: MinimalPublisher() : Node("minimal_publisher"), count_(0) { // 创建发布者,话题名为"topic",队列长度为10 publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10); // 设置定时器,每500毫秒发布一次消息 timer_ = this->create_wall_timer( std::chrono::milliseconds(500), [this]() { this->timer_callback(); }); } private: void timer_callback() { // 创建消息并填充数据 auto message = std_msgs::msg::String(); message.data = "Hello, World! " + std::to_string(count_++); // 发布消息 publisher_->publish(message); } rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_; rclcpp::TimerBase::SharedPtr timer_; size_t count_; }; int main(int argc, char *argv[]) { // 初始化ROS 2节点 rclcpp::init(argc, argv); // 启动发布者节点 rclcpp::spin(std::make_shared<MinimalPublisher>()); // 关闭ROS 2节点 rclcpp::shutdown(); return 0; } ``` ### 订阅者节点 订阅者节点会监听指定话题,并在收到消息时打印出来。以下是一个C++实现订阅者节点示例: ```cpp #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" class MinimalSubscriber : public rclcpp::Node { public: MinimalSubscriber() : Node("minimal_subscriber") { // 创建订阅者订阅话题名为"topic" subscription_ = this->create_subscription<std_msgs::msg::String>( "topic", 10, [this](const std_msgs::msg::String::SharedPtr msg) { // 收到消息时打印内容 RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str()); }); } private: rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_; }; int main(int argc, char *argv[]) { // 初始化ROS 2节点 rclcpp::init(argc, argv); // 启动订阅者节点 rclcpp::spin(std::make_shared<MinimalSubscriber>()); // 关闭ROS 2节点 rclcpp::shutdown(); return 0; } ``` ### 编译与运行 1. **创建ROS 2工作空间** 进入`src`目录并创建ROS 2功能包: ```bash cd ~/ros2_ws/src ros2 pkg create --build-type ament_cmake cpp_pubsub ``` 2. **将上述代码保存为文件** 将发布者代码保存为`minimal_publisher.cpp`,订阅者代码保存为`minimal_subscriber.cpp`。 3. **修改`CMakeLists.txt`** 在`CMakeLists.txt`中添加编译目标: ```cmake add_executable(minimal_publisher src/minimal_publisher.cpp) target_link_libraries(minimal_publisher PRIVATE rclcpp) install(TARGETS minimal_publisher DESTINATION bin) add_executable(minimal_subscriber src/minimal_subscriber.cpp) target_link_libraries(minimal_subscriber PRIVATE rclcpp) install(TARGETS minimal_subscriber DESTINATION bin) ``` 4. **编译功能包** 返回工作空间根目录并编译: ```bash cd ~/ros2_ws colcon build --packages-select cpp_pubsub source install/setup.bash ``` 5. **运行节点** 启动发布者订阅者节点: ```bash ros2 run cpp_pubsub minimal_publisher ros2 run cpp_pubsub minimal_subscriber ``` 通过以上步骤,您可以实现一个简单ROS 2发布者订阅者系统。发布者每隔500毫秒发布一条消息,而订阅者会接收到这些消息并打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值