3. 编写并运行C++订阅者节点

编写并运行C++订阅者节点 学习卡片

任务目标

创建一个ROS2 C++订阅者节点,订阅字符串话题 /chatter,接收并打印消息,验证发布-订阅通信链路。

环境准备

需要已安装ROS2(Humble或对应版本)并创建好工作空间。本案例假设工作空间为 ~/ros2_ws/src,包名为 cpp_subscriber_pkg。

实现步骤

创建ROS2 C++功能包并编写订阅者节点代码。

cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake cpp_subscriber_pkg
cd cpp_subscriber_pkg/src

创建订阅者源文件 subscriber_node.cpp:

#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp>

class StringSubscriber : public rclcpp::Node
{
public:
  StringSubscriber() : Node("string_subscriber")
  {
    subscription_ = this->create_subscription<std_msgs::msg::String>(
      "chatter", 10,
      [this](const std_msgs::msg::String::SharedPtr msg) {
        RCLCPP_INFO(this->get_logger(), "收到消息: '%s'", msg->data.c_str());
      });
  }

private:
  rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<StringSubscriber>());
  rclcpp::shutdown();
  return 0;
}

编辑 CMakeLists.txt,在 find_package 部分添加依赖并注册可执行文件:

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

add_executable(subscriber_node src/subscriber_node.cpp)
ament_target_dependencies(subscriber_node rclcpp std_msgs)

install(TARGETS
  subscriber_node
  DESTINATION lib/${PROJECT_NAME}
)

编辑 package.xml,在 <depend> 标签中添加:

<depend>rclcpp</depend>
<depend>std_msgs</depend>

编译与运行

cd ~/ros2_ws
colcon build --packages-select cpp_subscriber_pkg
source install/setup.bash

运行订阅者节点:

ros2 run cpp_subscriber_pkg subscriber_node

另开终端,启动发布者(可用ROS2内置的示例节点):

source ~/ros2_ws/install/setup.bash
ros2 run demo_nodes_cpp talker

验证方法

观察订阅者终端是否持续打印类似 [INFO] 收到消息: 'Hello World: N' 的日志。若能看到,说明发布-订阅通信正常,节点实现正确。

也可用命令行工具验证话题通信:

ros2 topic echo /chatter

该命令会直接显示话题上的消息内容,与订阅者收到的消息一致。

常见问题

  • 编译报错找不到头文件:确认 CMakeLists.txt 中已添加 rclcpp 和 std_msgs 依赖。
  • 运行时提示话题不存在:先启动发布者节点,再启动订阅者节点。
  • 收不到消息:检查两个终端是否都执行了 source install/setup.bash,确保处于同一ROS2环境中。