ROS2 话题通讯

发布时间 2023-11-20 15:27:28作者: 瑞睿王
1.发布者模板
//1.包含头文件
#include <memory> #include "rclcpp/rclcpp.hpp" #include "project_msg_data/msg/stu.hpp" using namespace std::chrono_literals; /* 需求:以某个固定频率发送文本“hello world!”,文本后缀编号,每发送一条消息,编号递增1。 步骤: 1.包含头文件; 2.初始化 ROS2 客户端; 3.定义节点类; 3-1.创建发布方; 3-2.创建定时器; 3-3.组织消息并发布。 4.调用spin函数,并传入节点对象指针; 5.释放资源。 */ // 3.定义节点类; class Publisher_Node:public rclcpp::Node { public: Publisher_Node():Node("publisher_node"),count_(0) { // 3-1.创建发布方; publisher_ = this->create_publisher<Data>("chatter", 10); // 3-2.创建定时器; timer_ = this->create_wall_timer(500ms, std::bind(&Publisher_Node::timer_callback, this)); } private: void timer_callback() { // 3-3.组织消息并发布。 auto message = Data();
    //例子 message.name = "wangrui"; message.age = count_++; message.height = 178.5;
    // RCLCPP_INFO(this->get_logger(), "'%s %d %f'", message.name.c_str(),message.age,message.height); publisher_->publish(message); } rclcpp::TimerBase::SharedPtr timer_; rclcpp::Publisher<Data>::SharedPtr publisher_; size_t count_; }; int main(int argc, char * argv[]) { //2.初始化 ROS2 客户端; rclcpp::init(argc, argv); // 4.调用spin函数,并传入节点对象指针; rclcpp::spin(std::make_shared<Publisher_Node>()); // 5.释放资源。 rclcpp::shutdown(); return 0; }

2.订阅者模板

#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "Data"
/*  
    需求:订阅发布方发布的消息,并输出到终端。
    步骤:
        1.包含头文件;
        2.初始化 ROS2 客户端;
        3.定义节点类;
            3-1.创建订阅方;
            3-2.处理订阅到的消息。
        4.调用spin函数,并传入节点对象指针;
        5.释放资源。
*/
// 3.定义节点类;
class Listener_Node : public rclcpp::Node
{
public:
    Listener_Node() : Node("listener_node")
    {
        // 3-1.创建订阅方;
        subscription_ = this->create_subscription<Data>("chatter", 10, std::bind(&Listener_Node::topic_callback, this, std::placeholders::_1));
    }

private:
    // 3-2.处理订阅到的消息。
    void topic_callback(const Data::SharedPtr msg) const
    {
      RCLCPP_INFO(this->get_logger(), "the listener`s data is %s %d %f", msg->name.c_str(),msg->age, msg->height);
    }
    rclcpp::Subscription<Data>::SharedPtr subscription_;
};


int main(int argc, char * argv[])
{
    // 2.初始化 ROS2 客户端;
    rclcpp::init(argc, argv);
    // 4.调用spin函数,并传入节点对象指针;
    rclcpp::spin(std::make_shared<Listener_Node>());
    // 5.释放资源。
    rclcpp::shutdown();
    return 0;
}

3.CMakeLists.txt  (正常添加即可)

add_executable(demo src/demo.cpp)
ament_target_dependencies(
  demo
  "rclcpp"
  "std_msgs"
  "Data"
)

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