/*
本程序用于演示如何在ROS2中创建一个简单的发布者节点，发布字符串消息到一个主题上。
*/

#include <chrono> // 包含时间相关的头文件

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp" // 包含字符串消息类型的头文件

using StringMsg = std_msgs::msg::String; // 定义一个别名，方便后续使用


// 简单的话题发布者节点类，继承自rclcpp::Node
// 作用: 创建一个发布者节点，定期发布字符串消息到指定主题上。
class MinimalPublisher : public rclcpp::Node
{
public:
    MinimalPublisher():Node("minimal_publisher"),count_(0) // 构造函数，初始化节点名称和消息计数器
    {
        // 创建一个发布者对象，发布到"chatter"主题，使用默认QoS设置
        publisher_ = this->create_publisher<StringMsg>("chatter", 10);
        // 创建一个定时器对象,每隔5s钟调用一次发送一次消息的函数
        timer_ = this->create_wall_timer(std::chrono::seconds(5),std::bind(&MinimalPublisher::timer_callback, this));
    }

    // 定时器回调函数，每次被调用时发布一条消息
    void timer_callback()
    {
        StringMsg msg;
        msg.data = "Hello ROS2! -- " + std::to_string(count_++); // 设置消息内容，包含计数器值
        RCLCPP_INFO(this->get_logger(),"Publishing: '%s'", msg.data.c_str()); // 打印日志，显示发布的消息内容
        publisher_->publish(msg); // 发布消息
    }

private:
    rclcpp::Publisher<StringMsg>::SharedPtr publisher_; // 发布者对象
    rclcpp::TimerBase::SharedPtr timer_; // 定时器对象
    size_t count_; // 消息计数器
};

int main(int argc,char *argv[])
{
    rclcpp::init(argc,argv); // 初始化ROS2客户端库

    auto node = std::make_shared<MinimalPublisher>(); // 创建发布者节点对象

    rclcpp::spin(node); // 进入循环，等待回调函数被调用
    rclcpp::shutdown(); // 关闭ROS2客户端库
    return 0;
}