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

ROS2核心概念之代码示例一

上一篇主要写了些概念,可以参考之前文章。这一篇主要写下代码的demo,主要参考了古月居的代码。

Node代码

class HelloWorldNode : public rclcpp::Node
{public:HelloWorldNode(): Node("node_helloworld_class")                          // ROS2节点父类初始化{while(rclcpp::ok())                                  // ROS2系统是否正常运行{RCLCPP_INFO(this->get_logger(), "Hello World");  // ROS2日志输出sleep(1);                                        // 休眠控制循环时间}}
};int main(int argc, char * argv[])                               
{// ROS2 C++接口初始化rclcpp::init(argc, argv);        // 创建ROS2节点对象并进行初始化                 rclcpp::spin(std::make_shared<HelloWorldNode>()); // 关闭ROS2 C++接口rclcpp::shutdown();                               return 0;
}

上边代码是一个HelloWorldNode的节点,通过ROS2去创建并运行,一直打印该节点的输出。节点其实是rclcpp中的Node节点。

Topic代码

class PublisherNode : public rclcpp::Node
{public:PublisherNode(): Node("topic_helloworld_pub") // ROS2节点父类初始化{// 创建发布者对象(消息类型、话题名、队列长度)publisher_ = this->create_publisher<std_msgs::msg::String>("chatter", 10); // 创建一个定时器,定时执行回调函数timer_ = this->create_wall_timer(500ms, std::bind(&PublisherNode::timer_callback, this));            }private:// 创建定时器周期执行的回调函数void timer_callback()                                                       {// 创建一个String类型的消息对象auto msg = std_msgs::msg::String();   // 填充消息对象中的消息数据                                    msg.data = "Hello World";// 发布话题消息                                                 RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", msg.data.c_str()); // 输出日志信息,提示已经完成话题发布   publisher_->publish(msg);                                                }rclcpp::TimerBase::SharedPtr timer_;                             // 定时器指针rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;  // 发布者指针
};// ROS2节点主入口main函数
int main(int argc, char * argv[])                      
{// ROS2 C++接口初始化rclcpp::init(argc, argv);                // 创建ROS2节点对象并进行初始化          rclcpp::spin(std::make_shared<PublisherNode>());   // 关闭ROS2 C++接口rclcpp::shutdown();                                return 0;
}

这是PublisherNode节点的服务,发布话题;创建一个定时器,10ms执行一次;有发布就有订阅,下面看看订阅者的代码;

class SubscriberNode : public rclcpp::Node
{public:SubscriberNode(): Node("topic_helloworld_sub")        // ROS2节点父类初始化{subscription_ = this->create_subscription<std_msgs::msg::String>(       "chatter", 10, std::bind(&SubscriberNode::topic_callback, this, _1));   // 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)}private:void topic_callback(const std_msgs::msg::String::SharedPtr msg) const                  // 创建回调函数,执行收到话题消息后对数据的处理{RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());       // 输出日志信息,提示订阅收到的话题消息}rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;         // 订阅者指针
};// ROS2节点主入口main函数
int main(int argc, char * argv[])                         
{// ROS2 C++接口初始化rclcpp::init(argc, argv);                 // 创建ROS2节点对象并进行初始化            rclcpp::spin(std::make_shared<SubscriberNode>());     // 关闭ROS2 C++接口rclcpp::shutdown();                                  return 0;
}

SubscriberNode 这个就是订阅者,订阅了发布者的话题,发布者发布消息后,订阅了话题的消费者就能收到该话题。

有一点没有说,有个10,这个参数是QoS的默认值,10为历史深度,可以自定义。

好了,结束了,这一篇先聊到这,主要是梳理了ROS2的Node和Topic相关的代码示例,以后我们在程序里看到类似的代码,就很容易理解了。当然,这是用C++写的,如果C++不是特别好,建议看看这里。

http://www.dtcms.com/a/544519.html

相关文章:

  • 工厂考勤系统选型参考:如何选出最合适的方案
  • 【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
  • Linux错误(7)接口处于Down状态不通告IPv6地址变更事件
  • 开发避坑指南(67):Maven引入iText7-core依赖失败解决方案
  • 北京南站地图建设公司简介怎么写
  • 镇江网站建设平台江苏企业展厅设计公司
  • 用JetBrains Rider开发C#应用程序指南
  • 快速创建Word箱单(2/2)
  • LangChain4j学习11:模型上下文协议 (MCP)
  • mysql线上主从集群设置
  • RK3568 11.0编译报错ld.lld: error: undefined symbol: rtkbt_cts_info
  • 南京大学LLM开发基础(四)MoE, LoRA, 数的精度 + MLP层实验
  • 机器学习-回归分析概述
  • 企业建设网站的主要作用网站seo搜索引擎优化怎么做
  • 微信小程序可以做电影网站吗安网多少钱
  • 计算机专业做网站的开题报告门户建设开源软件
  • js基础:08、构造函数(共享方法)、原型(prototype)、原型对象、(修改原型)toString方法、垃圾回收
  • 如何通过机器学习(如K-means、SVM、决策树)与深度学习(如CNN、LSTM)模型,进行全球气候变化驱动因素的数据分析与趋势预测
  • Docker篇6-项目app.py和flask_app.service配置和映射到docker中
  • 从零开始搭建 flask 博客(1)实验
  • 深入解析 Rust 解构模式:元组、结构体与枚举的精准拆解
  • 从零开始搭建 flask 博客实验(2)
  • 筑牢智算“地基”:华为以RAS理念重塑AIDC建设新模式
  • 跨网段耦合器助汽车零部件线实现PLC与MES跨网段互联
  • C#程序实现将Teradata的存储过程转换为Azure Synapse Dedicated SQL pool的存储过程
  • 小型购物网站模板设计网站页面教案
  • 免费购物网站淘宝建设网站首页
  • 成绩发布工具使用方法,附成绩分析教程
  • sward零基础学习:安装与配置
  • java求职学习day45