【ROS2】使用C++实现简单的发布订阅方

发布时间:2024年01月14日

1 构建自定义数据类型

1、自定义消息类型Student

1.1 创建base_interfaces_demo包

1.2 创建Student.msg文件

string name
int32 age
float64 height

1.2 在cmakeLists.txt中增加如下语句

#增加自定义消息类型的依赖
find_package(rosidl_default_generators REQUIRED)
# 为接口文件生成源代码
rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Student.msg"

)

2、发布方实现

/*
需求:以固定频率发布文本消息:“hello world!!”,文本后缀编号,每发布一条,编号+1
流程:
  1. 包含头文件
  2. 初始化ROS2客户端;
  3. 自定义节点类;
    1. 创建发布方;
    2. 创建定时器;
    3. 在回调函数中,组织并发布消息,
  4. 调用spin函数,传入自定义类的对象指针;
  释放资源;


*/

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
#include "base_interfaces_demo/msg/student.hpp"

using namespace std::chrono_literals;
using base_interfaces_demo::msg::Student;

class Talker:public rclcpp::Node
{
private:
  /* data */
public:
  Talker():rclcpp::Node("talker_node_cpp_stu"),count(0){
    RCLCPP_INFO(this->get_logger(),"发布节点已创建!");
    // 创建发布者
    publisher_=this->create_publisher<Student>("chatter_stu",10);//10为队列长度
    // 创建定时器
    timer_ = this->create_wall_timer(0.1min,std::bind(&Talker::on_timer,this));

  };
private:
  rclcpp::Publisher<Student>::SharedPtr publisher_;
  rclcpp::TimerBase::SharedPtr timer_;

  size_t count;
  void on_timer(){
    auto message_= Student();
    message_.name="Pang Weijian";
    message_.age=35;
    message_.height=175.7;
    RCLCPP_INFO(this->get_logger(),"发布方发布的消息:姓名:%s,年龄:%d, 身高:%f",message_.name.c_str(),message_.age,message_.height);
    publisher_->publish(message_);
  }
  //~Talker():rclcpp::Node();
};

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

  //

  // 调用回旋函数
  rclcpp::spin(std::make_shared<Talker>());
  // 释放资源
  rclcpp::shutdown();

  //printf("hello world cpp01_topic package\n");
  return 0;
}

3、订阅方实现

/*
需求:订阅发布方发布的消息并在终端输出
流程:
    1.包含头文件;
    2.初始化客户端;
    3.自定义节点类;
        1. 创建订阅方;
        2. 在回调函数中解析并输出数据;
    4.调用回旋函数,并传入节点对象指针;

    5.资源释放




*/

#include "rclcpp/rclcpp.hpp"
//#include "std_msgs/msg/string.hpp"
#include "base_interfaces_demo/msg/student.hpp"

using base_interfaces_demo::msg::Student;

// 自定义节点类
class Listener:public rclcpp::Node
{
private:
    /* data */
    void do_cb(const Student &msg){
        RCLCPP_INFO(this->get_logger(),"订阅到的消息:姓名:%s,年龄:%d,身高:%f",msg.name.c_str(),msg.age,msg.height);

    }
    rclcpp::Subscription<Student>::SharedPtr subscription_;
  
public:
    Listener();
    ~Listener();
};

Listener::Listener():Node("listener_node_cpp")
{
    RCLCPP_INFO(this->get_logger(),"订阅方创建");
    subscription_ = this->create_subscription<Student>("chatter_stu",10,std::bind(&Listener::do_cb,this,std::placeholders::_1));

}

Listener::~Listener()
{
}

int main(int argc, char const *argv[]){
    // 初始化节点
    rclcpp::init(argc,argv);

    // 调用回旋函数
    rclcpp::spin(std::make_shared<Listener>());

    return 0;
}

4. 运行colcon build 编译所选包,运行结果如下:

文章来源:https://blog.csdn.net/pangweijian/article/details/135589094
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。