当前位置: 首页 > news >正文

ROS2:话题通信CPP语法速记

目录

  • 发布方实现流程
    • 重点代码
  • 订阅方实现流程
    • 重点代码
  • 参考代码示例
    • 发布方代码
    • 订阅方代码

发布方实现流程

  1. 包含头文件(rclcpp.hpp与[interfaces_pkg].hpp)
  2. 初始化ROS2客户端(rclcpp::init)
  3. 自定义节点类(创建发布实例,伺机发布数据)
  4. 调用spin函数,循环运行节点实例
  5. 释放资源(rclcpp::shutdown())

重点代码

//1.创建发布方
rclcpp::Publisher<[MSG-T]>::SharedPtr publisher_;
publisher_ = this->create_publisher<[MSG-T]>("topic_name",10);//2.发布消息(定义->装填->发送)
[MSG-T] message;
/*
装填数据
*/
publisher_->publish(message);//3.创建定时器
using namespace std::chrono_literals;
rclcpp::TimerBase::SharedPtr timer_;
timer_ = this->create_wall_timer([duration_S], std::bind(&[Node_Class_Name]::[timer_callback_fun], this));

发布方创建后可以随时发布话题消息,一般可以选择创建定时器来实现周期性发发送。

订阅方实现流程

  1. 包含头文件(rclcpp.hpp与[interfaces_pkg].hpp)
  2. 初始化ROS2客户端(rclcpp::init)
  3. 自定义节点类,(绑定回调函数,回调时处理数据)
  4. 调用spin函数,循环运行节点实例
  5. 释放资源(rclcpp::shutdown())

重点代码

//1.创建订阅方
rclcpp::Subscription<[MSG-T]>::SharedPtr subscription_;
subscription_= this->create_subscription<[MSG-T]>("topic_name",10,std::bind(&[Node_Class_Name]::[sub_callback_fun], this,std::placeholders::_1));//2.实现订阅回调函数
void sub_callback_fun(const [MSG-T] &messgae){
/*
处理数据
*/
}

订阅方创建时需要绑定回调函数接收到话题消息时,调用一次回调函数。回调函数输入参数为const [MSG-T] &,即消息类型的引用

参考代码示例

发布方代码

/*  需求:以某个固定频率发送文本“hello world!”,文本后缀编号,每发送一条消息,编号递增1。步骤:1.包含头文件;2.初始化 ROS2 客户端;3.定义节点类;3-1.创建发布方;3-2.创建定时器;3-3.组织消息并发布。4.调用spin函数,并传入节点对象指针;5.释放资源。
*/// 1.包含头文件;
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"using namespace std::chrono_literals;// 3.定义节点类;
class MinimalPublisher : public rclcpp::Node
{public:MinimalPublisher(): Node("minimal_publisher"), count_(0){// 3-1.创建发布方;publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);// 3-2.创建定时器;timer_ = this->create_wall_timer(500ms, std::bind(&MinimalPublisher::timer_callback, this));}private:void timer_callback(){// 3-3.组织消息并发布。auto message = std_msgs::msg::String();message.data = "Hello, world! " + std::to_string(count_++);RCLCPP_INFO(this->get_logger(), "发布的消息:'%s'", message.data.c_str());publisher_->publish(message);}rclcpp::TimerBase::SharedPtr timer_;rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;size_t count_;
};int main(int argc, char * argv[])
{// 2.初始化 ROS2 客户端;rclcpp::init(argc, argv);// 4.调用spin函数,并传入节点对象指针。rclcpp::spin(std::make_shared<MinimalPublisher>());// 5.释放资源;rclcpp::shutdown();return 0;
}

订阅方代码

/*  需求:订阅发布方发布的消息,并输出到终端。步骤:1.包含头文件;2.初始化 ROS2 客户端;3.定义节点类;3-1.创建订阅方;3-2.处理订阅到的消息。4.调用spin函数,并传入节点对象指针;5.释放资源。
*/// 1.包含头文件;
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using std::placeholders::_1;// 3.定义节点类;
class MinimalSubscriber : public rclcpp::Node
{public:MinimalSubscriber(): Node("minimal_subscriber"){// 3-1.创建订阅方;subscription_ = this->create_subscription<std_msgs::msg::String>("topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1));}private:// 3-2.处理订阅到的消息;void topic_callback(const std_msgs::msg::String & msg) const{RCLCPP_INFO(this->get_logger(), "订阅的消息: '%s'", msg.data.c_str());}rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};int main(int argc, char * argv[])
{// 2.初始化 ROS2 客户端;rclcpp::init(argc, argv);// 4.调用spin函数,并传入节点对象指针。rclcpp::spin(std::make_shared<MinimalSubscriber>());// 5.释放资源;rclcpp::shutdown();return 0;
}

相关文章:

  • 基于SpringBoot + Vue 的作业管理系统
  • SSCLMD模型代码实现详解
  • ubantu安装CUDA
  • 园区网的发展
  • tinyrenderer笔记(法线映射)
  • 龙虎榜——20250506
  • AI教你学VUE——Deepseek版
  • Matlab/Simulink的一些功能用法笔记(4)
  • 区块链交易所开发:开启数字交易新时代
  • 【JEECG】BasicTable内嵌Table表格错位
  • MySQL 触发器(Trigger)讲解
  • LeetCode 790 多米诺和托米诺平铺 题解
  • Latex排版问题:图片单独占据一页
  • 【网络原理】IP协议
  • vmware虚拟机克隆
  • 聊天助手提示词调优案例
  • 代码随想录算法训练营第九天 |【字符串】151.翻转字符串里的单词、卡码网55.右旋转字符串、28.实现strStr、459.重复的子字符串
  • 星纪魅族新品发布会定档5月13日,Note 16系列战神归来
  • 第七章,VLAN技术
  • 驱动开发系列57 - Linux Graphics QXL显卡驱动代码分析(四)显示区域更新
  • 湖北十堰市委副秘书长管聪履新丹江口市代市长
  • 一季度全国30强城市出炉:谁能更进一步?谁掉队了?
  • 印巴军事对峙加剧,小规模冲突收场还是走向大战?
  • 科普|治疗腰椎间盘突出症,筋骨平衡理论如何提供新视角?
  • 国内外数十支搜救犬队伍齐聚三明,进行废墟搜救等实战
  • 贵州省委省政府迅速组织开展黔西市游船倾覆事故救援工作