#include <chrono>  // 包含C++标准库中的时间相关功能
#include <iostream>  // 包含标准输入输出流功能
#include <memory>  // 包含智能指针等内存管理功能
#include <string>  // 包含标准字符串功能

#include "rclcpp/rclcpp.hpp"  // 包含ROS 2 C++客户端库的核心功能
#include "std_msgs/msg/string.hpp"  // 包含标准消息类型std_msgs::msg::String的定义

using namespace std::chrono_literals;  // 使用chrono命名空间的字面量操作符，如1s表示1秒

// 定义一个发布者节点类，继承自rclcpp::Node
class PublisherNode : public rclcpp::Node {
public:
    // 构造函数
    PublisherNode() : Node("pub_node") {  // 调用父类构造函数，设置节点名称为"pub_node"
        // 创建一个发布者对象，用于发布std_msgs::msg::String类型的消息到"chatter"话题
        publisher_ = this->create_publisher<std_msgs::msg::String>("chatter", 10);  // 10是队列大小
        // 创建一个定时器，每1秒触发一次publish_message函数
        timer_ = this->create_wall_timer(1s, std::bind(&PublisherNode::publish_message, this));
    }

private:
    // 定义发布消息的函数
    void publish_message() {
        // 创建一个std_msgs::msg::String类型的消息
        auto message = std_msgs::msg::String();
        // 设置消息的内容为"Hello, World!"
        message.data = "Hello, World!";
        // 通过发布者对象发布消息
        publisher_->publish(message);
    }

    // 定义发布者对象的智能指针
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
    // 定义定时器对象的智能指针
    rclcpp::TimerBase::SharedPtr timer_;
};

int main(int argc, char *argv[]) {
    // 初始化ROS 2节点，传入命令行参数
    rclcpp::init(argc, argv);
    // 创建PublisherNode节点的共享指针
    auto node = std::make_shared<PublisherNode>();
    // 启动节点的事件循环，处理定时器等事件
    rclcpp::spin(node);
    // 关闭ROS 2节点
    rclcpp::shutdown();
    return 0;  // 程序正常结束返回0
}

