3. 编写并运行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环境中。