topic 之RCLCPP实现

创建节点

本节我们将创建一个控制节点和一个被控节点。

控制节点创建一个话题发布者publisher,发布控制命令(command)话题,接口类型为字符串(string),控制接点通过发布者发布控制命令(前进、后退、左转、右转、停止)。

被控节点创建一个订阅者subscribe,订阅控制命令,收到控制命令后根据命令内容打印对应速度出来。

创建publisher

依次输入下面的命令,创建chapt3_ws工作空间、example_topic_rclcpp功能包和topic_publisher_01.cpp。

cd d2lros2/
mkdir -p chapt3/chapt3_ws/src
cd chapt3/chapt3_ws/src
ros2 pkg create example_topic_rclcpp --build-type ament_cmake --dependencies rclcpp
touch example_topic_rclcpp/src/topic_publisher_01.cpp

接着采用面向对象方式写一个最简单的节点。

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"class TopicPublisher01 : public rclcpp::Node
{
public:// 构造函数,有一个参数为节点名称TopicPublisher01(std::string name) : Node(name){RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());// 创建发布者command_publisher_ = this->create_publisher<std_msgs::msg::String>("command", 10);}private:// 声明话题发布者rclcpp::Publisher<std_msgs::msg::String>::SharedPtr command_publisher_;
};int main(int argc, char **argv)
{rclcpp::init(argc, argv);/*创建对应节点的共享指针对象*/auto node = std::make_shared<TopicPublisher01>("topic_publisher_01");/* 运行节点,并检测退出信号*/rclcpp::spin(node);rclcpp::shutdown();return 0;
}

修改CMakeLists.txt

add_executable(topic_publisher_01 src/topic_publisher_01.cpp)
ament_target_dependencies(topic_publisher_01 rclcpp)install(TARGETStopic_publisher_01DESTINATION lib/${PROJECT_NAME}
)

编写发布者

学习使用API文档

想要创建发布者,只需要调用node的成员函数create_publisher并传入对应的参数即可。
rclcpp: rclcpp: ROS Client Library for C++ (www.ros2.org)

导入消息接口

依次做完这三步

CMakeLists.txt 新增

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)add_executable(topic_publisher_01 src/topic_publisher_01.cpp)
ament_target_dependencies(topic_publisher_01 rclcpp **std_msgs**)

packages.xml 新增

  <buildtool_depend>ament_cmake</buildtool_depend><depend>rclcpp</depend><depend>std_msgs</depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend>

代码文件topic_publisher_01.cpp 新增

#include "std_msgs/msg/string.hpp"class TopicPublisher01 : public rclcpp::Node

编译

cd chapt3/chapt3_ws/
colcon build --packages-select example_topic_rclcpp
source install/setup.bash
ros2 run example_topic_rclcpp topic_publisher_01

使用定时器定时发布数据

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"class TopicPublisher01 : public rclcpp::Node
{
public:// 构造函数,有一个参数为节点名称TopicPublisher01(std::string name) : Node(name){RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());// 创建发布者command_publisher_ = this->create_publisher<std_msgs::msg::String>("command", 10);// 创建定时器,500ms为周期,定时发布timer_ = this->create_wall_timer(std::chrono::milliseconds(500), std::bind(&TopicPublisher01::timer_callback, this));}private:void timer_callback(){// 创建消息std_msgs::msg::String message;message.data = "forward";// 日志打印RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());// 发布消息command_publisher_->publish(message);}// 声名定时器指针rclcpp::TimerBase::SharedPtr timer_;// 声明话题发布者指针rclcpp::Publisher<std_msgs::msg::String>::SharedPtr command_publisher_;
};int main(int argc, char **argv)
{rclcpp::init(argc, argv);/*创建对应节点的共享指针对象*/auto node = std::make_shared<TopicPublisher01>("topic_publisher_01");/* 运行节点,并检测退出信号*/rclcpp::spin(node);rclcpp::shutdown();return 0;
}
定时器

定时器是ROS2中的另外一个常用功能,通过定时器可以实现按照一定周期调用某个函数以实现定时发布等逻辑。
定时器对应的类是 rclcpp::TimerBase,调用create_wall_timer将返回其共享指针。
创建定时器时传入了两个参数,这两个参数都利用了C++11的新特性。
std::chrono::milliseconds(500),代表500ms,chrono是c++ 11中的时间库,提供计时,时钟等功能。
std::bind(&TopicPublisher01::timer_callback, this),bind() 函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。

编写订阅者

topic_subscribe_01.cpp

cd chapt3_ws/src/example_topic_rclcpp
touch src/topic_subscribe_01.cpp

topic_subscribe_01.cpp

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"class TopicSubscribe01 : public rclcpp::Node
{
public:TopicSubscribe01(std::string name) : Node(name){RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());// 创建一个订阅者订阅话题command_subscribe_ = this->create_subscription<std_msgs::msg::String>("command", 10, std::bind(&TopicSubscribe01::command_callback, this, std::placeholders::_1));}private:// 声明一个订阅者rclcpp::Subscription<std_msgs::msg::String>::SharedPtr command_subscribe_;// 收到话题数据的回调函数void command_callback(const std_msgs::msg::String::SharedPtr msg){double speed = 0.0f;if(msg->data == "forward"){speed = 0.2f;}RCLCPP_INFO(this->get_logger(), "收到[%s]指令,发送速度 %f", msg->data.c_str(),speed);}
};int main(int argc, char **argv)
{rclcpp::init(argc, argv);/*创建对应节点的共享指针对象*/auto node = std::make_shared<TopicSubscribe01>("topic_subscribe_01");/* 运行节点,并检测退出信号*/rclcpp::spin(node);rclcpp::shutdown();return 0;
}

CMakeLists.txt

add_executable(topic_subscribe_01 src/topic_subscribe_01.cpp)
ament_target_dependencies(topic_subscribe_01 rclcpp std_msgs)install(TARGETS
topic_subscribe_01DESTINATION lib/${PROJECT_NAME}
)

packages.xml

不改动,同一个功能包,已经添加了。

编译

cd chapt3/chapt3_ws/
colcon build --packages-select example_topic_rclcpp
source install/setup.bash
ros2 run example_topic_rclcpp topic_subscribe_01

手动运行测试

ros2 topic pub /command std_msgs/msg/String "{data: forward}"

运行测试

第一个终端

source install/setup.bash
ros2 run example_topic_rclcpp topic_subscribe_01

第二个终端

source install/setup.bash
ros2 run example_topic_rclcpp topic_publisher_01

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】升级FastJSON版本-jar

摘要 在长期运行的应用服务器上&#xff0c;近期的安全漏洞扫描揭示了fastjson组件存在潜在的安全隐患&#xff08;FastJSON是一个Java 语言实现的 JSON 解析器和生成器。FastJSON存在远程代码执行漏洞&#xff0c;恶意攻击者可以通过此漏洞远程执行恶意代码来入侵服务器&…

怎么解析二级域名,一个一级域名可以解析多少二级域名?

在构建网站或应用时&#xff0c;域名是连接用户与服务器的重要桥梁。注册了一级域名后&#xff0c;如何解析二级域名&#xff0c;以及一个一级域名可以解析多少个二级域名&#xff0c;是很多网站管理人员都非常关心的问题。本文国科云将简单探讨下这两个问题&#xff0c;并给出…

数学,LeetCode 3102. 最小化曼哈顿距离

一、题目 1、题目描述 给你一个下标从 0 开始的数组 points &#xff0c;它表示二维平面上一些点的整数坐标&#xff0c;其中 points[i] [xi, yi] 。 两点之间的距离定义为它们的 曼哈顿距离 。 请你恰好移除一个点&#xff0c;返回移除后任意两点之间的 最大 距离可能的 最小…

Dynadot 2024年第一季度回顾

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

java进程把服务器CPU打满问题排查

1、top命令定位问题进程 2、查看进程的所有线程信息&#xff0c;记下占用最高的进程 top -Hp 38080553、将第2步得到的线程号转化为十六进制 printf %x\n 38080594、结果里搜索 jstack 3808055|grep -A 10 3a1b3b5、定位问题 根据上步搜索到的结果&#xff0c;可以看到是GC…

【PyQt5】

PyQT5线程基础&#xff08;1&#xff09; 分离UI主线程和耗时子线程QThread自定义信号 分离UI主线程和耗时子线程 在应用程序中&#xff0c;主线程负责处理用户的输入事件、更新UI元素和响应系统的回调&#xff0c;而耗时的任务&#xff08;例如网络请求、数据库访问、图像处理…

关闭这八个电脑设置,保护个人隐私

你知道吗&#xff1f;电脑可能一直在偷窥你的小秘密。朋友们&#xff0c;一定要记得关闭这8个电脑设置哦&#xff0c;这样可以有效地保护我们的个人隐私。 按住键盘Windows键加i键&#xff0c;快速打开Windows设置。然后点击隐私选项。 我们来看基本的常规设置。里面有四个设置…

在表格中选中el-radio后, 怎么获取选中的这一行的所有数据?

演示: 图中, 选中这行数据后, 怎么获取到当前的数据? 代码: <tr v-for"item in gridData"><td><input type"radio" v-model"checkout" change"getDateFn" :data-type"item.articleType" :data-channelNam…

GEE代码实例教程详解:年度和月度土地覆盖变化分析

简介 在本篇博客中&#xff0c;我们将使用Google Earth Engine (GEE) 对土地覆盖变化进行年度和月度的分析。通过Google的Dynamic World数据集&#xff0c;我们可以识别2023年至2024年间土地覆盖的类型和变化。 背景知识 Google Dynamic World数据集 Google/DYNAMICWORLD/V…

百川工作手机实现销售管理微信监控系统

在瞬息万变的商业战场中&#xff0c;每一分效率的提升都是企业制胜的关键。传统销售管理模式已难以满足现代企业对精准、高效、合规的迫切需求。今天&#xff0c;让我们一同探索如何利用工作手机这一创新工具&#xff0c;为您的销售团队装上智能翅膀&#xff0c;开启销售管理的…

基于springboot+vue实现的厨艺交流平台(文末源码+Lw)093

93基于SpringBootVue的实现的厨艺交流平台&#xff08;源码数据库万字Lun文流程图ER图结构图演示视频软件包&#xff09; 系统功能&#xff1a; 这次开发的厨艺交流平台功能有个人中心&#xff0c;食材分类管理&#xff0c;用户管理&#xff0c;菜品分类管理&#xff0c;菜谱信…

解锁敦煌网成功秘籍:批量注册买家号测评的高效策略

敦煌网&#xff08;DHgate&#xff09;作为一个跨境电商平台&#xff0c;搭建境外本土网络环境并实现批量注册买家号下单&#xff0c;需要遵循一系列严谨的步骤和考虑多个关键因素。以下是一个概括性的指南&#xff1a; 一、环境要求 国外服务器&#xff1a;首先&#xff0c;…

HumbleBundle7月虚幻捆绑包30件军事题材美术模型沙漠自然环境大逃杀模块化建筑可定制武器包二战现代坦克飞机道具丧尸士兵角色模型20240705

HumbleBundle7月虚幻捆绑包30件军事题材美术模型沙漠自然环境大逃杀模块化建筑可定制武器包二战现代坦克飞机道具丧尸士兵角色模型202407051607 这次HumbleBundle捆绑包是UE虚幻军事题材的&#xff0c;内容非常多。 有军事基地、赛博朋克街区、灌木丛景观环境等 HB捆绑包虚幻…

7-打包安装程序

接下来假设我们想要将我们的项目分发给其他人&#xff0c;以便他们可以使用它。我们希望在各种平台上提供二进制和源代码发行版。这与我们之前在安装和测试中所做的安装略有不同&#xff0c;在安装中我们安装了从源代码构建的二进制文件。在本例中&#xff0c;我们将构建支持二…

C# 构造函数依赖注入 使用out向外传递参数

天真目前解决方法 天真 using System;namespace forCode20191 {class Program {static void Main(string[] args) {bool flag false;Tmp tt new Tmp(out flag);Console.WriteLine(flag); // 将输出 falsett.Doit();Console.WriteLine(flag); // 将输出 trueConsole.ReadKey(…

“DDoS攻击的最新防御策略:从检测到缓解的全方位方案“

DDoS攻击的最新防御策略 DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;是网络安全领域的重大威胁&#xff0c;它通过大量的恶意流量淹没目标服务器或网络&#xff0c;导致服务不可用。为了有效防御DDoS攻击&#xff0c;最新的策略强调从检测到缓解的全方位方案。 多层防…

深度学习的数学PDF

链接: https://pan.baidu.com/s/1_jScZ7dcyAWGqbrad6bbCQ?pwd9gj9 提取码: 9gj9 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦

【苍穹外卖】Day2 手把手敲完细节

目录 1. 新增员工 1.1 需求分析和设计 1.2 代码开发 ①定义DTO类&#xff1a;(在sky-pojo里&#xff09; ②EmployeeController中创建新增员工方法save() ③EmployeeService里声明save方法&#xff08;altenter&#xff09; ④EmployeeServiceImpl中实现save方法 ⑤在E…

顶刊文献阅读及代码复现

前提:每个无人机都有 (i)自己的机载计算机,用于执行控制其自身动作所需的计算 (ii)自己的传感器系统,用于测量相对位置和速度, (iii)自己的通信设备,用于与相邻代理进行数据交换。 模型:短期的排斥力、中间范围的速度一致性和长距离的吸引力

通过PLC地址来切换威纶通触摸屏界面

Step 1 元件-PLC控制 Step 2 新增 选择设备 选择切换基本窗口功能 选择触发地址 Step 3 离线仿真测试 在数值框中输入对应的页面号 可以看到页面可以正常切换 分享创作不易&#xff0c;请多多支持&#xff0c;点赞、收藏、关注&#xff01; Ending~