ros2话题通讯实践-系统检测可视化工具

流程

消息接口定义

在topic_practice_ws的src文件夹下创建 包

ros2 pkg create status_interfaces --build-type ament_cmake --dependencies rosidl_default_generators builtin_interfaces --license Apache-2.0 //builtin_interfaces 是ros2中已有的一个消息接口功能包 //可以使用时间接口Time表示记录消息的时间 //rosidl_default_generators用于将自定义的消息文件 //转化成cpp py 源码的模块

在功能包的msg目录下存放消息定义文件 其必须以大写字母开头 并且只能由大小写字母组成

这里创建SystemStatus.msg

builtin_interfaces/Time stamp //记录时间戳 string host_name //系统名称 float32 cpu_percent //cpu使用率 float32 memory_percent //内存使用率 float32 memory_total //内存总量 float32 memory_available //剩余有效内存 float64 net_sent //网络发送数据总量 float64 net_recv //网络接受数据总量
//ros2 消息接口支持的9种数据类型 //bool byte char float32 float64 //int8 uint8 int16 uint16 //int32 uint32 int64 uint64 //string

定义好数据接口文件后需要在CmakeLists.txt中进行注册,申明其是消息接口文件 并添加builtin_interfaces依赖

... rosidl_generate_interfaces(${PROJECT_NAME} "msg/SystemStatus.msg" DEPENDENCIES builtin_interfaces ) ament_package()

之后最好在package.xml中添加申明

<license>Apache-2.0</license> <member_of_group>rosidl_interface_packages</member_of_group> <buildtool_depend>ament_cmake</buildtool_depend>

再次之后可以构建项目 然后通过下列代码 来查看对消息接口的构建是否完成

source install/setup.bash ros2 interfaces show status_interfaces/msg/SystemStatus

也可以看install/status_interfaces/include/目录下是否生成了cpp头文件以及install/status_interfaces/local/lib/python3.10/dist-packages目录下是否生成了status_interfaces的py库来查看

话题发布节点

进入工作空间src目录下创建包

ros2 pkg create status_publisher --build-type ament_python --dependencies rclpy status_interfaces --license Apache-2.0

在同名目录下编辑sys_status_pub.py

import rclpy from rclpy.node import Node from status_interfaces.msg import SystemStatus #获取系统cpu 内存 网络信息 import psutil #获取主机名称 import platform class SysStatusPub(Node): def __init__(self,node_name): super().__init__(node_name) self.status_publisher_=self.create_publisher( SystemStatus,'sys_status',10) self.timer=self.create_timer(1,self.timer_callback) def timer_callback(self): cpu_percent = psutil.cpu_percent() memory_info=psutil.virtual_memory() net_io_counters=psutil.net_io_counters() msg=SystemStatus() #从Node继承而来 获取节点时钟时间 通过 to_msg()转换成 uiltin_interfaces.msg.Time消息 msg.stamp=self.get_clock().now().to_msg() #获取主机名 msg.host_name=platform.node() msg.cpu_percent=cpu_percent msg.memory_percent=memory_info.percent #默认是B 除以两次1024 换成 MB msg.memory_total=memory_info.total /1024 /1024 msg.memory_available=memory_info.available /1024 /1024 msg.net_sent =net_io_counters.bytes_sent /1024 /1024 msg.net_recv=net_io_counters.bytes_recv /1024/1024 self.get_logger().info(f'publish:{str(msg)}') self.status_publisher_.publish(msg) def main(): rclpy.init() node=SysStatusPub('sys_status_pub') rclpy.spin(node) rclpy.shutdown()

在此之后 编译 运行节点就可以看到发布的信息了。 节点运行时也可以 ros2 topic echo sys_status来查看。

消息展示节点

在工作空间src下创建 包

ros2 pkg create status_display --build-type ament_cmake --dependencies rclcpp status_interfaces --license Apache-2.0

在包下的src中编写hello_qt.cpp

#include<QApplication> //提供qt应用类 #include<QLabel> //qt显示文本的组件 #include<QString> //qt中的字符串类 int main(int argc,char **argv){ QApplication app(argc,argv); QLabel* label=new QLabel(); QString message=QString::fromStdString("Hello Qt"); label->setText(message); label->show(); //和ros2 的 spin类似 都会阻塞程序 app.exec(); return 0; }

在cmakelists中添加依赖和注册

... find_package(Qt5 REQUIRED COMPONENTS Widgets) add_executable(hello_qt src/hello_qt.cpp) #qt与ros2无关所以 #用这个而不是ament_target_dependcies target_link_libraries(hello_qt Qt5::Widgets) install(TARGETS hello_qt DESTINATION lib/${PROJECT_NAME} ) ...

之后运行 可以看到一个小窗口 说明配置顺利

在display包下src中编写 sys_status_display.cpp

#include <QApplication> #include <QLabel> #include <QString> #include "rclcpp/rclcpp.hpp" #include "status_interfaces/msg/system_status.hpp" using SystemStatus = status_interfaces::msg::SystemStatus; class SysStatusDisplay:public rclcpp::Node{ private: rclcpp::Subscription<SystemStatus>::SharedPtr subscription_; QLabel* label_; public: SysStatusDisplay():Node("sys_status_display"){ //匿名函数中[&]表示其可以通过引用的方式直接捕获外界变量 从而可以直接使用label_ subscription_=this->create_subscription<SystemStatus>("sys_status",10, [&](const SystemStatus::SharedPtr msg)->void{ label_->setText(get_qstr_from_msg(msg)); }); label_=new QLabel(get_qstr_from_msg(std::make_shared<SystemStatus>())); label_->show(); } QString get_qstr_from_msg(const SystemStatus::SharedPtr msg){ std::stringstream show_str; show_str <<"====================\n" <<"time:\t"<<msg->stamp.sec<<"\ts\n" <<"user:\t"<<msg->host_name<<"\t\n" <<"cpu:\t"<<msg->cpu_percent<<"\t%\n" <<"memory-total:\t"<<msg->memory_total<<"\tMB\n" <<"memory-available:\t"<<msg->memory_available<<"\tMB\n" <<"net-sent:\t"<<msg->net_sent<<"\tMB\n" <<"net-recv\t"<<msg->net_recv<<"\tMB\n" <<"===================="; return QString::fromStdString(show_str.str()); } }; int main(int argc,char** argv){ rclcpp::init(argc,argv); QApplication app(argc,argv); auto node=std::make_shared<SysStatusDisplay>(); //spin 和 exec都会阻塞程序 所以用多线程 std::thread spin_thread([&]()->void{rclcpp::spin(node);}); spin_thread.detach(); app.exec(); rclcpp::shutdown(); return 0; }

在cmakelists中添加依赖和注册

... add_executable(sys_status_display src/sys_status_display.cpp) target_link_libraries(sys_status_display Qt5::Widgets) ament_target_dependencies(sys_status_display rclcpp status_interfaces) install(TARGETS hello_qt sys_status_display DESTINATION lib/${PROJECT_NAME} ) ...

编译 然后同时运行 发布者和订阅者就可以看到 检测窗口了

杂项

出现了python版本的问题将接口信息转化成py模块的版本与运行版本不符 下列代码解决问题

rm -rf build/status_interfaces/ install/status_interfaces/ colcon build --packages-select status_interfaces --symlink-install --cmake-args -DPYTHON_EXECUTABLE=/usr/bin/python3.10 //或在cmakelists中 //在 project(status_interfaces) 之后添加 set(PYTHON_EXECUTABLE "/usr/bin/python3.10")

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

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

相关文章

拿捏 React 组件通讯:从父子到跨组件的「传功秘籍」

前言你有没有过这种崩溃时刻&#xff1f;写 React 组件时&#xff0c;想让父子组件互通数据&#xff0c;结果代码越写越乱&#xff1b;兄弟组件想传个值&#xff0c;绕了八层父组件还没搞定…… 为啥别人的 React 组件传值丝滑&#xff1f;别慌&#xff01;秘密都在这&#xff…

如何快速为OBS直播添加专业级VST音频效果:终极完整指南

如何快速为OBS直播添加专业级VST音频效果&#xff1a;终极完整指南 【免费下载链接】obs-vst Use VST plugins in OBS 项目地址: https://gitcode.com/gh_mirrors/ob/obs-vst 你是否经常为直播中的音频问题而烦恼&#xff1f;背景噪音干扰、人声不够清晰、音质平平无奇……

tensorflow 零基础吃透:tf.sparse.SparseTensor 与核心 TensorFlow API 的协同使用

零基础吃透&#xff1a;tf.sparse.SparseTensor与核心TensorFlow API的协同使用 稀疏张量&#xff08;tf.sparse.SparseTensor&#xff09;可与TensorFlow绝大多数核心API透明兼容&#xff08;无需额外转换&#xff09;&#xff0c;包括tf.keras、tf.data、tf.function、tf.tra…

入职宇树Web前端开发,30K双休有点爽

投稿&#xff1a; 第一轮技术面&#xff08;JavaScript 核心 浏览器原理 前端框架底层&#xff09; 本环节重点考察 JavaScript 语言特性、浏览器渲染机制、框架原理等深度知识&#xff0c;是社招筛选的核心门槛1.JavaScript 闭包的形成原理、应用场景与内存泄漏防范 2. Ev…

ORACLE学习笔记总结(数据库归档模式的配置)

Oracle数据库归档模式配置详解归档模式&#xff08;ARCHIVELOG&#xff09;是Oracle数据库的核心配置&#xff0c;开启后才能进行热备份和完全恢复&#xff0c;是生产环境的强制要求。简单点说归档和非归档模式是LGWR进程给写入时Online redo log files数据覆盖还是备份。归档模…

Applite:告别命令行,用图形界面轻松管理macOS软件包

还在为复杂的Homebrew命令而头疼吗&#xff1f;Applite为你带来了革命性的解决方案——这款专为macOS设计的开源图形界面工具&#xff0c;让软件包管理变得像点击鼠标一样简单。 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: …

3步搞定老旧Mac升级:OpenCore Legacy Patcher USB启动盘制作全攻略

3步搞定老旧Mac升级&#xff1a;OpenCore Legacy Patcher USB启动盘制作全攻略 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为苹果官方放弃的老旧Mac设备无法体验最…

ORACLE学习笔记总结(数据库常见错误及应对措施)

一、语句失败&#xff08;Statement Failure&#xff09;定义SQL语句因语法错误、权限不足或资源限制而无法正常执行&#xff0c;是最轻微的故障类型。常见场景语法错误&#xff1a;SELEC * FROM emp;&#xff08;拼写错误&#xff09;权限不足&#xff1a;普通用户执行DROP TA…

小白进阶 “挖洞大神”:SRC 漏洞挖掘完整攻略(附工具包 + 系统学习路径)

从小白到“挖洞达人”&#xff1a;SRC漏洞挖掘全流程实战指南&#xff08;附学习路线和工具&#xff09; 为什么说SRC挖洞是安全新手的最佳起点&#xff1f; 凌晨两点&#xff0c;大学生张三盯着电脑屏幕突然跳出的「高危漏洞奖励到账」提示&#xff0c;手抖得差点打翻泡面—…

tensorflow 零基础吃透:TensorFlow 张量切片与数据插入(附目标检测 / NLP 实战场景)

零基础吃透&#xff1a;TensorFlow张量切片与数据插入&#xff08;附目标检测/NLP实战场景&#xff09; 张量切片&#xff08;提取子部分&#xff09;和数据插入是TensorFlow处理结构化数据的核心操作&#xff0c;广泛用于目标检测&#xff08;特征路由、选框特征提取&#xff…

WebPlotDigitizer:科研图表数据提取的终极完整指南

WebPlotDigitizer&#xff1a;科研图表数据提取的终极完整指南 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/web/WebPlotDigitizer 还在为论文图表中的数据…

ThinkPad双风扇终极静音指南:TPFanCtrl2完整配置与优化

ThinkPad双风扇终极静音指南&#xff1a;TPFanCtrl2完整配置与优化 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 还在为ThinkPad笔记本的持续风扇噪音而烦恼吗&#…

微信网页版终极解决方案:wechat-need-web插件一键突破访问限制

微信网页版终极解决方案&#xff1a;wechat-need-web插件一键突破访问限制 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为微信网页版频繁出现的…

C++ HTTP/2架构深度解析:从连接瓶颈到性能翻倍

你是否曾困惑&#xff0c;为什么现代Web应用在高并发场景下依然面临性能瓶颈&#xff1f;当传统HTTP/1.1的队头阻塞问题限制了系统吞吐量&#xff0c;C开发者该如何突破这一技术困境&#xff1f;本文将带你深入探索HTTP/2在C中的实现原理与性能优化策略。 【免费下载链接】cpp-…

[特殊字符]️ 羽毛球检测数据集介绍-1686张图片 运动赛事分析 智能健身设备 自动裁判系统 体育视频内容分析 机器人运动训练

&#x1f4e6;点击查看-已发布目标检测数据集合集&#xff08;持续更新&#xff09; 数据集名称图像数量应用方向博客链接&#x1f50c; 电网巡检检测数据集1600 张电力设备目标检测点击查看&#x1f525; 火焰 / 烟雾 / 人检测数据集10000张安防监控&#xff0c;多目标检测点…

Qwen3-32B实测:单卡A100跑出180+吞吐

Qwen3-32B实测&#xff1a;单卡A100跑出180吞吐 你有没有被这样的AI部署难题困扰过&#xff1f;想上大模型&#xff0c;70B的“巨兽”一启动就要四五张A100组集群&#xff0c;电费比工资还高 &#x1f4b8;&#xff1b;而小模型呢&#xff0c;写代码总漏半句&#xff0c;推理像…

BetterNCM终极个性化定制:从零打造专属网易云音乐深度改造方案

BetterNCM终极个性化定制&#xff1a;从零打造专属网易云音乐深度改造方案 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 想要彻底告别千篇一律的音乐播放器界面吗&#xff1f;Better…

车辆轮胎寿命预测检测数据集介绍-410张图片 车辆安全检测 车队管理和维护 智能汽车与ADAS系统 轮胎生产质量控制 道路交通监管 二手车评估与交易

&#x1f4e6;点击查看-已发布目标检测数据集合集&#xff08;持续更新&#xff09; 数据集名称图像数量应用方向博客链接&#x1f50c; 电网巡检检测数据集1600 张电力设备目标检测点击查看&#x1f525; 火焰 / 烟雾 / 人检测数据集10000张安防监控&#xff0c;多目标检测点…

Wallpaper_Engine终极指南:快速免费获取创意工坊壁纸的完整方案

Wallpaper_Engine终极指南&#xff1a;快速免费获取创意工坊壁纸的完整方案 【免费下载链接】Wallpaper_Engine 一个便捷的创意工坊下载器 项目地址: https://gitcode.com/gh_mirrors/wa/Wallpaper_Engine 还在为找不到精美动态壁纸而烦恼吗&#xff1f;Wallpaper_Engin…

显卡驱动彻底清理终极指南:高效解决驱动冲突问题

显卡驱动彻底清理终极指南&#xff1a;高效解决驱动冲突问题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller …