ROS2 C++ Subscriber Publisher 订阅发布例子

本文档展示了如何在ROS2 Foxy环境下创建一个Subscriber节点和一个Publisher节点。Subscriber节点订阅名为'/pub'的主题,并在接收到消息时打印出来;Publisher节点则周期性地发布字符串消息到同一主题。通过CMakeLists.txt文件完成项目的构建,并提供运行指令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ROS2 Subscriber Publisher 例子

运行环境

Ubuntu 20.04
ROS Foxy
  • sub
#include <iostream>
#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp>

void callback(const std_msgs::msg::String::SharedPtr msg) {
    std::cout << "sub " << msg->data.c_str() << std::endl;
}

int main(int argc, char **argv) {
    std::cout << "Hello, ROS2 Sub!" << std::endl;
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("sub_node");
    auto sub = node->create_subscription<std_msgs::msg::String>("/pub", 1, callback);
    rclcpp::spin(node);
    return 0;
}
  • pub
#include <iostream>
#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp>


int main(int argc, char **argv) {
    std::cout << "Hello, ROS2 Sub!" << std::endl;
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("pub_node");
    auto chatter_pub = node->create_publisher<std_msgs::msg::String>("/pub", 1);
    rclcpp::WallRate r(5);
    
    std_msgs::msg::String msg;
    int i = 0;
    while (rclcpp::ok()) {
        msg.data = "data: " + std::to_string(i++);
        std::cout << "pub " << msg.data.c_str() << std::endl;
        chatter_pub->publish(msg);
        rclcpp::spin_some(node);
        r.sleep();
    }
    rclcpp::shutdown();
    return 0;
}
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.5.1)
project(ros2_pubsub_demo)

set(CMAKE_CXX_STANDARD 14)
set(TARGET_NAME ${PROJECT_NAME})

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)

include_directories(
    ${rclcpp_INCLUDE_DIRS}
)

add_executable(pub pub.cc)
add_executable(sub sub.cc)

ament_target_dependencies(pub rclcpp std_msgs)
ament_target_dependencies(sub rclcpp std_msgs)
  • 运行
mkdir build && cd build
cmake ..
make 
./pub
./sub

在这里插入图片描述

### ROS2 C++ 发布订阅 示例教程 #### 创建工作空间并安装依赖项 为了创建一个新的ROS2项目,建议先设置好工作环境。通常情况下,在`~/ros2_ws/`路径下建立新的工作空间文件夹[^1]。 ```bash mkdir -p ~/ros2_ws/src cd ~/ros2_ws/ ``` 接着编译这个空的工作区来确保一切正常: ```bash colcon build source install/setup.bash ``` #### 准备发布者节点 在准备好的`cpp_pubsub`包中的`src`目录里编写简单的发布程序。下面是一个标准的话题发布者的例子,它会周期性地发送消息到指定的主题上。 ```cpp // 文件名: publisher_member_function.cpp #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" using namespace std::chrono_literals; class MinimalPublisher : public rclcpp::Node { public: MinimalPublisher() : Node("minimal_publisher"), count_(0) { publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10); timer_ = this->create_wall_timer( 500ms, std::bind(&MinimalPublisher::timer_callback, this)); } private: void timer_callback() { auto message = std_msgs::msg::String(); message.data = "Hello, world! " + std::to_string(count_++); RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str()); publisher_->publish(message); } rclcpp::TimerBase::SharedPtr timer_; rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_; size_t count_; }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::spin(std::make_shared<MinimalPublisher>()); rclcpp::shutdown(); return 0; } ``` 这段代码定义了一个名为 `MinimalPublisher` 的类,该类继承自 `rclcpp::Node` 并实现了定时器回调函数用于定期向主题 `"topic"` 上发布字符串消息。 #### 编写订阅者节点 同样位于`cpp_pubsub`包内的源码位置,可以找到如下所示的一个基本的订阅者实例,它可以监听来自特定主题的消息并将接收到的内容打印出来。 ```cpp // 文件名: subscriber_member_function.cpp #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" void chatter_callback(const std_msgs::msg::String::SharedPtr msg) { RCLCPP_INFO(rclcpp::get_node_logger.nodeName(), "I heard: [%s]", msg->data.c_str()); } int main(int argc, char ** argv) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; auto node = rclcpp::Node::make_shared("minimal_subscriber", options); auto subscription = node->create_subscription<std_msgs::msg::String>( "topic", 10, chatter_callback); rclcpp::spin(node); rclcpp::shutdown(); return 0; } ``` 此部分展示了如何通过调用 `node->create_subscription()` 方法注册一个回调处理程序以响应新到达的数据流事件。 #### 构建与运行 完成上述两个组件之后就可以利用 Colcon 工具来进行构建操作了。回到顶层工作区间执行命令: ```bash colcon build --packages-select cpp_pubsub source install/setup.bash ``` 最后启动这两个节点查看效果: ```bash ros2 run cpp_pubsub minimal_publisher & ros2 run cpp_pubsub minimal_subscriber ``` 这样就完成了基于C++语言开发的一对简易版ROS2话题发布者和接收者的搭建过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值