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

ROS2笔记2:使用Topic自定义Messages实现nodes之间通讯

1. Package规划1.1 自定义消息接口my_interface_pkgDirCommandRequest.msg请求Topic消息由发起node发起的Topic消息builtin_interfaces/Time stamp # 记录时间戳 string directory # 操作的目录 int8 command # 操作指令. 0:list, 1:rename,2:del string extra_param # 操作指令额外参数DirCommandResult.msg响应Topic消息由响应node回复的Topic消息builtin_interfaces/Time command_stamp # 返回command下发的时间戳 string[] file_names # 目录文件列表 uint32[] file_size_list # 目录文件size列表. 必须与file_names列表一样大小接口命名必须遵守驼峰命名,也就是大写开头单词连接在一起Word1Word2.Colcon build生成代码时会自动将驼峰命名变成Linux风格的’_连接的命名:word1_word2.1.2 请求发起方jack_commander_pkgm_publisher this-create_publishermy_interface_pkg::msg::DirCommandRequest(jack_commander/dir_command_request, 10); m_subscription this-create_subscriptionmy_interface_pkg::msg::DirCommandResult(jack_worker/dir_command_result, 10, std::bind(JackCommanderNode::result_callback, this, std::placeholders::_1));发布jack_commander/dir_command_request话题,使用DirCommandRequest.msg自定义消息订阅jack_worker/dir_command_result话题,使用DirCommandResult.msg自定义消息1.3 请求响应方jack_worker_pkgm_subscription this-create_subscriptionmy_interface_pkg::msg::DirCommandRequest( jack_commander/dir_command_request, 10, std::bind(JackWorkerNode::callback, this, std::placeholders::_1)); m_publisher this-create_publishermy_interface_pkg::msg::DirCommandResult(jack_worker/dir_command_result, 10);发布jack_worker/dir_command_result话题,使用DirCommandResult.msg自定义消息订阅jack_commander/dir_command_request话题,使用DirCommandRequest.msg自定义消息2. 项目目录结构创建ros2包:# 创建自定义消息包ros2 pkg create my_interface_pkg --build-type ament_cmake--licenseApache-2.0--dependenciesbuiltin_interfaces rosidl_default_generators# 创建通讯发起Node包ros2 pkg create jack_commander_pkg --build-type ament_cmake--licenseApache-2.0--dependenciesbuiltin_interfaces my_interface_pkg# 创建通讯响应Node包ros2 pkg create jack_worker_pkg --build-type ament_cmake--licenseApache-2.0--dependenciesbuiltin_interfaces my_interface_pkg创建包后目录结构:jackgaoJackGaoSuper:~/communication$ tree.└── src ├── jack_commander_pkg │ ├── CMakeLists.txt │ ├── LICENSE │ ├── include │ │ └── jack_pub_node │ ├── package.xml │ └── src │ └── jack_commander_node.cpp# 见代码实现添加├── jack_worker_pkg │ ├── CMakeLists.txt │ ├── LICENSE │ ├── include │ │ └── jack_sub_node │ ├── package.xml │ └── src │ ├── jack_worker_node.cpp# 见代码实现添加│ ├── walk_dir.cpp# 见代码实现添加│ └── walk_dir.h# 见代码实现添加└── my_interface_pkg ├── CMakeLists.txt ├── LICENSE ├── README.MD ├── msg │ ├── DirCommandRequest.msg# 见1.1 自定义消息接口│ └── DirCommandResult.msg# 见1.1 自定义消息接口└── package.xml3. 代码实现3.1 自定义消息接口在my_interface_pkg修改CMakeLists.txt添加# find dependencies find_package(ament_cmake REQUIRED) find_package(builtin_interfaces REQUIRED) find_package(rosidl_default_generators REQUIRED) # cmake函数来自rosidl_default_generators,用于将msg接口定义文件转换为C/Python代码 rosidl_generate_interfaces(${PROJECT_NAME} msg/DirCommandRequest.msg msg/DirCommandResult.msg DEPENDENCIES builtin_interfaces )3.2 请求发起方jack_commander_node.cpp#include iostream #include functional #include chrono #include thread #include rclcpp/rclcpp.hpp #include builtin_interfaces/msg/time.hpp #include my_interface_pkg/msg/dir_command_request.hpp #include my_interface_pkg/msg/dir_command_result.hpp using namespace std::chrono_literals; class JackCommanderNode : public rclcpp::Node { public: explicit JackCommanderNode(const std::string node_name,int period_ms) :Node(node_name) { m_period_ms period_ms; m_timer nullptr; m_publisher this-create_publishermy_interface_pkg::msg::DirCommandRequest(jack_commander/dir_command_request, 10); m_subscription this-create_subscriptionmy_interface_pkg::msg::DirCommandResult(jack_worker/dir_command_result, 10, std::bind(JackCommanderNode::result_callback, this, std::placeholders::_1)); } void Set_Param(const std::string dir,ushort cmd,const std::string extra_param) { m_directory dir; m_command cmd; m_extra_param extra_param; RCLCPP_INFO(this-get_logger(),Set_Param: %s, %d, %s,m_directory.c_str(),m_command,m_extra_param.c_str()); if(m_timer) { m_timer-cancel(); m_timer nullptr; } m_timer this-create_wall_timer(std::chrono::milliseconds(static_castint(m_period_ms)),std::bind(JackCommanderNode::timer_callback,this)); } private: std::string m_directory /home/jackgao; ushort m_command0; std::string m_extra_param; double m_period_ms; rclcpp::Time m_last_call_time; rclcpp::TimerBase::SharedPtr m_timer; rclcpp::Publishermy_interface_pkg::msg::DirCommandRequest::SharedPtr m_publisher; rclcpp::Subscriptionmy_interface_pkg::msg::DirCommandResult::SharedPtr m_subscription; void timer_callback() { my_interface_pkg::msg::DirCommandRequest msg; m_last_call_time this-get_clock()-now(); msg.stamp m_last_call_time; msg.directory m_directory; msg.command m_command; msg.extra_param m_extra_param; RCLCPP_INFO(this-get_logger(),Sending command...); RCLCPP_INFO(this-get_logger(),msg.directory:%s,msg.directory.c_str()); RCLCPP_INFO(this-get_logger(),msg.command:%d,msg.command); RCLCPP_INFO(this-get_logger(),msg.extra_param:%s,msg.extra_param.c_str()); m_publisher-publish(msg); } void result_callback(const my_interface_pkg::msg::DirCommandResult::SharedPtr msg) { rclcpp::Time time_from_worker msg-command_stamp; // 本地Request匹配Worker的Result if(time_from_worker m_last_call_time) { RCLCPP_INFO(this-get_logger(),result_callback: %ld,msg-file_names.size()); for(unsigned long i 0;imsg-file_names.size();i) { RCLCPP_INFO(this-get_logger(),#%ld: %s, %d,i,msg-file_names[i].c_str(),msg-file_size_list[i]); } if(m_timer) { m_timer-cancel(); m_timer nullptr; } } } }; // 键盘输入线程函数 void keyboard_input_thread(std::shared_ptrJackCommanderNode node) { while(rclcpp::ok()) { std::string dir; std::cout 请输入查看目录: ; std::cin dir; if(dir exit || dir quit) { std::cout Quitting... std::endl; rclcpp::shutdown(); break; } node-Set_Param(dir,0,); } } int main(int argc, char * argv[]) { rclcpp::init(argc, argv); auto node std::make_sharedJackCommanderNode(jack_commander_node,100); // 创建键盘输入线程 std::thread input_thread(keyboard_input_thread,node); // 在主线程中运行ROS2节点 RCLCPP_INFO(node-get_logger(),Commander: %s is running...,node-get_name()); rclcpp::spin(node); // 等待输入线程结束 if (input_thread.joinable()) { input_thread.join(); } rclcpp::shutdown(); return 0; }头文件中include按如下规律映射:Message接口builtin_interfaces/msg/Time映射为builtin_interfaces/msg/time.hpp.最后的类型必须是驼峰命名(首字母大写单词连接)变成.hpp时驼峰命名全部变成小写单词之间使用_连接。所以my_interface_pkg/msg/DirCommandRequest映射为my_interface_pkg/msg/dir_command_request.hpp;my_interface_pkg/msg/DirCommandResult映射为my_interface_pkg/msg/dir_command_result.hpp.修改CMakeLists.txt添加# find dependencies find_package(rclcpp REQUIRED) find_package(builtin_interfaces REQUIRED) find_package(my_interface_pkg REQUIRED) # 添加可执行文件 add_executable(jack_commander_node src/jack_commander_node.cpp) ament_target_dependencies(jack_commander_node rclcpp builtin_interfaces my_interface_pkg) # 安装可执行文件 install(TARGETS jack_commander_node DESTINATION lib/${PROJECT_NAME})3.3 请求响应方jack_worker_node.cpp#include iostream #include functional #include chrono #include rclcpp/rclcpp.hpp #include builtin_interfaces/msg/time.hpp #include my_interface_pkg/msg/dir_command_request.hpp #include my_interface_pkg/msg/dir_command_result.hpp #include walk_dir.h using namespace std::chrono_literals; class JackWorkerNode : public rclcpp::Node { public: explicit JackWorkerNode(const std::string node_name) : Node(node_name) { m_subscription this-create_subscriptionmy_interface_pkg::msg::DirCommandRequest( jack_commander/dir_command_request, 10, std::bind(JackWorkerNode::callback, this, std::placeholders::_1)); m_publisher this-create_publishermy_interface_pkg::msg::DirCommandResult(jack_worker/dir_command_result, 10); } private: rclcpp::Subscriptionmy_interface_pkg::msg::DirCommandRequest::SharedPtr m_subscription; rclcpp::Publishermy_interface_pkg::msg::DirCommandResult::SharedPtr m_publisher; void callback(const my_interface_pkg::msg::DirCommandRequest::SharedPtr msg) { RCLCPP_INFO(this-get_logger(),Received request: stamp %d.%09d,msg-stamp.sec,msg-stamp.nanosec); RCLCPP_INFO(this-get_logger(),Received request: command %d,msg-command); RCLCPP_INFO(this-get_logger(),Received request: extra_param %s,msg-extra_param.c_str()); RCLCPP_INFO(this-get_logger(),Received request: directory %s,msg-directory.c_str()); auto fileList walkDirectory(msg-directory); RCLCPP_INFO(this-get_logger(),--------------result of directory walk--------------); RCLCPP_INFO(this-get_logger(),Total files: %ld, fileList.size()); my_interface_pkg::msg::DirCommandResult result; result.command_stamp msg-stamp; for(auto file : fileList) { RCLCPP_INFO(this-get_logger(),File: %s, Size: %s, file.filename.c_str(), file.getFormattedSize().c_str()); result.file_names.push_back(file.filename); result.file_size_list.push_back(file.file_size); } m_publisher-publish(result); } }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); auto node std::make_sharedJackWorkerNode(jack_worker_node); RCLCPP_INFO(node-get_logger(),Worker %s is running...,node-get_name()); rclcpp::spin(node); rclcpp::shutdown(); return 0; }修改CMakeLists.txt添加find_package(rclcpp REQUIRED) find_package(builtin_interfaces REQUIRED) find_package(my_interface_pkg REQUIRED) # 添加可执行文件 add_executable(jack_worker_node src/jack_worker_node.cpp src/walk_dir.cpp) ament_target_dependencies(jack_worker_node rclcpp builtin_interfaces my_interface_pkg) # 安装可执行文件 install(TARGETS jack_worker_node DESTINATION lib/${PROJECT_NAME})4. 编译执行编译jackgaoJackGaoSuper:~/communication$ colcon build Startingmy_interface_pkg Finishedmy_interface_pkg[0.26s]Startingjack_commander_pkg Startingjack_worker_pkg Finishedjack_commander_pkg[5.37s]Finishedjack_worker_pkg[5.38s]Summary:3packages finished[5.80s]编译成功后目录结构如下jackgaoJackGaoSuper:~/communication$ tree-d-L2.├── build │ ├── jack_commander_pkg │ ├── jack_worker_pkg │ └── my_interface_pkg ├──install│ ├── jack_commander_pkg │ ├── jack_worker_pkg │ └── my_interface_pkg ├── log │ ├── build_2026-04-19_09-41-43 │ ├── latest -latest_build │ └── latest_build -build_2026-04-19_09-41-43 └── src ├── jack_commander_pkg ├── jack_worker_pkg └── my_interface_pkg运行终端1运行worker nodesource./install/setup.sh ros2 run jack_worker_pkg jack_worker_node输出[INFO][1776563477.623617672][jack_worker_node]: Workerjack_worker_nodeis running...表示worker node运行正常终端2运行commander nodesource./install/setup.sh ros2 run jack_commander_pkg jack_commander_node输出[INFO][1776563614.307351198][jack_commander_node]: Commander:jack_commander_nodeis running... 请输入查看目录:表示command node运行正常终端3检查运行情况source./install/setup.sh ros2nodelist ros2 topic list ros2nodeinfo /jack_commander_node ros2nodeinfo /jack_commander_node

相关文章:

ROS2笔记2:使用Topic自定义Messages实现nodes之间通讯

1. Package规划 1.1 自定义消息接口my_interface_pkg DirCommandRequest.msg请求Topic消息 由发起node发起的Topic消息builtin_interfaces/Time stamp # 记录时间戳 string directory # 操作的目录 int8 command # 操作指令. 0:list, 1:re…...

如何3分钟解决百度网盘提取码难题:baidupankey完全指南

如何3分钟解决百度网盘提取码难题:baidupankey完全指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾因找不到百度网盘提取码而错过重要资源?当朋友分享学习资料、同事发送工作文件&#xff…...

2026年最新好用的WMS仓库管理系统盘点!10款国内外热门WMS系统推荐

面对仓储管理的挑战,越来越多的企业开始关注WMS系统。但在选型时,很多企业面临同样的困惑:市场上WMS系统那么多,到底哪款适合自己?本文盘点2026年国内外10款热门WMS系统,从功能特点、适用场景、性价比等维度…...

3分钟搞定百度网盘提取码:baidupankey智能工具终极指南

3分钟搞定百度网盘提取码:baidupankey智能工具终极指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经遇到过这样的情况:好不容易找到了需要的资源,却被百度网盘提取码挡在门外&…...

打卡信奥刷题(3138)用C++实现信奥题 P7617 [COCI 2011/2012 #2] KOMPIĆI

P7617 [COCI 2011/2012 #2] KOMPIĆI 题目描述 给定 NNN 个正整数 A1,A2,...,ANA_1,A_2,...,A_NA1​,A2​,...,AN​&#xff0c;求有多少整数对 (i,j)(i,j)(i,j)&#xff0c;满足以下条件&#xff1a; 1≤i<j≤N1 \le i < j \le N1≤i<j≤NAiA_iAi​ 和 AjA_jAj​ 至…...

如何让全面战争MOD开发从繁琐变得优雅:RPFM的现代化解决方案

如何让全面战争MOD开发从繁琐变得优雅&#xff1a;RPFM的现代化解决方案 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt5 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https…...

我第一次做 OData 后端服务时,真正绊住我的,不是代码,而是 Cloud Foundry 里的这些基础坑

最近我给自己加了一条训练线,除了平时在社区里吸收知识、输出知识,我还逼着自己每周完成一个带明确目标的小任务。第二个任务,我挑了一个很适合拿来练基本功的方向,亲手做一个基于 OData 的后端服务。 原本我以为,真正费劲的部分会落在 OData 协议本身,像 entity、servi…...

CSS如何快速获取网页上的标准色值_借助开发者工具的取色器和色彩格式转换功能

Chrome开发者工具中点击Styles面板颜色旁小色块启用取色器&#xff0c;悬停页面实时显示hex/rgb/hsl值&#xff0c;长按可循环切换格式&#xff1b;rgba透明度和色彩空间差异会导致与设计稿不一致。Chrome开发者工具里怎么直接取网页上某个颜色的十六进制值点开 DevTools&#…...

【Linux】进程(2)状态

目录 一、冯诺依曼 二、操作系统 三、进程状态 &#xff08;1&#xff09;运行状态&#xff1a;进程已获得CPU资源&#xff0c;正在执行指令&#xff0c;是进程生命周期中唯一能直接操作硬件、推进任务的阶段。 &#xff08;2&#xff09;阻塞状态&#xff1a;进程因等待特…...

Canny边缘检测的精度天花板在哪里?深入剖析Devernay亚像素校正的误差与优化

Canny边缘检测的精度天花板在哪里&#xff1f;深入剖析Devernay亚像素校正的误差与优化 在工业检测、遥感成像等对精度要求严苛的领域&#xff0c;传统Canny算法提供的像素级边缘定位往往难以满足需求。当测量芯片电路线宽或分析卫星图像中的道路边界时&#xff0c;即使单个像素…...

2026 最新 Gemini 国内能用吗?无需特殊配置直连教程

在2026年的今天&#xff0c;AI工具已经成为我们日常生活和工作的重要助手。很多用户关心&#xff1a;Gemini这款由Google推出的强大AI模型&#xff0c;在国内能否顺畅使用&#xff1f;答案是肯定的。目前最推荐的访问方式是通过OneAiPlus(u.oneaiplus.cn)平台&#xff0c;它聚合…...

JDK安装与忍者像素绘卷:天界画坊Java SDK开发实战

JDK安装与忍者像素绘卷&#xff1a;天界画坊Java SDK开发实战 1. 前言&#xff1a;为什么需要这个SDK 如果你正在开发一个需要调用AI绘画服务的Java应用&#xff0c;直接处理HTTP请求、参数序列化和结果解析可能会很麻烦。本文将带你从JDK安装开始&#xff0c;一步步构建一个…...

BGE Reranker-v2-m3效果实测:在低资源方言查询(如粤语书面语)中保持83%+匹配准确率

BGE Reranker-v2-m3效果实测&#xff1a;在低资源方言查询&#xff08;如粤语书面语&#xff09;中保持83%匹配准确率 1. 引言&#xff1a;方言查询的匹配挑战 在日常信息检索中&#xff0c;我们经常遇到一个棘手问题&#xff1a;当用户使用方言或地区性语言进行查询时&#…...

2026年,高精度食品卫生级超声波液位计批发,究竟有何独特之处?

在食品行业的生产过程中&#xff0c;液位的精确测量至关重要&#xff0c;它关乎着产品的质量、生产的效率以及成本的控制。高精度食品卫生级超声波液位计作为一种关键的测量工具&#xff0c;在2026年的市场上正发挥着越来越重要的作用。下面我们就来详细探讨一下它的独特之处。…...

yolov8模型训练MOT20数据集 行人多目标跟踪计数数据集的训练及应用 如何根据mot20数据集 来实现行人目标识别,行人追踪,行人的计数

yolov8模型训练MOT20数据集 行人多目标跟踪计数数据集的训练及应用 如何根据mot20数据集 来实现行人目标识别&#xff0c;行人追踪&#xff0c;行人的计数 文章目录1. 数据准备与预处理2. 创建 data.yaml 文件3. 环境搭建4. 模型训练5. 推理与部署6. 性能评估7. 模型导出行人追…...

线性代数与矩阵运算:AI世界的数学基石——从SVD到特征值分解的实战解析

线性代数与矩阵运算&#xff1a;AI世界的数学基石摘要&#xff1a;线性代数是人工智能的数学语言。本文深入解析向量、矩阵、特征值、SVD等核心概念&#xff0c;结合Python代码实战&#xff0c;带你理解这些数学工具如何在降维、推荐系统、图像压缩等AI场景中发挥关键作用。一、…...

Claude Design发布:3个核心能力让设计到代码全程自动化,Adobe和Figma股价应声下跌

大家好&#xff0c;我是苍一&#xff0c;一个干了13年的后端开发&#xff0c;正在探索AI编程&#xff0c;从产品到开发的全生命周期最佳实践&#xff0c;如果您感兴趣&#xff0c;欢迎关注&#x1f447;&#xff0c;看我如何自我革命。Anthropic旗下实验室刚刚推出了一款名为Cl…...

亲测有效:GPT-OSS-20B在M1 Mac上的运行效果与速度实测

亲测有效&#xff1a;GPT-OSS-20B在M1 Mac上的运行效果与速度实测 1. 开篇&#xff1a;打破认知的本地大模型体验 当大多数人还在依赖云端API访问大语言模型时&#xff0c;一个令人惊喜的事实正在发生&#xff1a;搭载M1芯片的MacBook已经能够流畅运行参数量达210亿的GPT-OSS…...

Android TTS开发避坑指南:从Google TTS到华为引擎,如何搞定多语言语音包下载与兼容性?

Android TTS开发实战&#xff1a;多引擎兼容与语言包管理全解析 在全球化应用开发中&#xff0c;文本转语音&#xff08;TTS&#xff09;功能的质量直接影响着用户体验。当你的应用需要支持英语、西班牙语、阿拉伯语等多语言场景时&#xff0c;不同设备厂商的TTS引擎差异就像一…...

DeEAR在客服质检中的落地应用:基于wav2vec2的语音情感多维评估实战案例

DeEAR在客服质检中的落地应用&#xff1a;基于wav2vec2的语音情感多维评估实战案例 1. 引言&#xff1a;客服质检中的情感识别挑战 在客服行业&#xff0c;传统的质检方式主要依赖人工抽查录音&#xff0c;不仅效率低下&#xff0c;而且难以客观评估服务过程中的情感表达。一…...

real-anime-z显存优化部署方案:6GB显存卡运行1024×1024真实系出图

real-anime-z显存优化部署方案&#xff1a;6GB显存卡运行10241024真实系出图 1. 模型简介 real-anime-z是基于Z-Image的Lora版本的真实系动画图片生成模型。该模型经过特殊优化&#xff0c;能够在仅6GB显存的显卡上稳定运行&#xff0c;并生成10241024分辨率的高质量真实系动…...

告别手动写提示词:AI头像生成器帮你快速设计专属头像

告别手动写提示词&#xff1a;AI头像生成器帮你快速设计专属头像 1. 为什么你需要AI头像生成器 在数字社交时代&#xff0c;头像已经成为个人品牌的重要组成部分。无论是社交媒体、工作平台还是游戏社区&#xff0c;一个精心设计的头像能让你在众多用户中脱颖而出。然而&…...

YOLO12手把手教学:从上传图片到获取检测结果完整流程

YOLO12手把手教学&#xff1a;从上传图片到获取检测结果完整流程 1. 引言 目标检测是计算机视觉领域最基础也最重要的任务之一&#xff0c;而YOLO系列模型因其出色的实时性能一直备受关注。2025年最新发布的YOLO12模型在保持实时推理速度的同时&#xff0c;通过创新的注意力机…...

Qwen3.5-9B-GGUF真实案例:软件需求文档→测试用例→接口定义链式生成

Qwen3.5-9B-GGUF真实案例&#xff1a;软件需求文档→测试用例→接口定义链式生成 1. 项目背景与模型介绍 Qwen3.5-9B-GGUF是阿里云开源的Qwen3.5-9B模型经过GGUF格式量化后的版本&#xff0c;特别适合在消费级硬件上部署运行。这个90亿参数的稠密模型采用了创新的Gated Delta…...

注意力机制模块:老树发新芽:SE 注意力结合硬件友好型 Swish 激活函数,在边缘端模型中的极限优化

前言:边缘AI的「不可能三角」与两条救赎路径 2026年的边缘AI领域正在经历一场静默的革命。Google的TPU v7 Ironwood芯片、Qualcomm的77 TOPS物联网处理器、Ambiq基于Arm Ethos-U85的Atomiq SoC——这些硅基巨兽的算力一路飙升,但当我们把目光从云端数据中心转向智能家居、工…...

08-第六篇-超越-Coding-的泛化

第六篇:超越 Coding 的泛化 把组织与治理问题收住之后,接下来就该追问另一件事:这套经验究竟能走多远。代码是这场变化最早长出清晰形状的地方。 这不是因为程序员比别人更懂 agent,而是因为代码天然更容易版本化、测试、差分、回滚。也因此,coding 最早把 harness engi…...

注意力机制模块:引入 DiNA(空洞邻域注意力),扩大模型感受野且不增加自注意力计算复杂度

本文导读:自注意力机制的 O(N) 复杂度始终是制约 Transformer 在高分辨率视觉任务中大规模部署的核心瓶颈。DiNA(Dilated Neighborhood Attention,空洞邻域注意力) 是 2026 年视觉注意力领域的一个重要技术突破——它在 NA(Neighborhood Attention)的基础上引入空洞(dil…...

注意力机制模块:全局注意力机制 GAM 详解:跨维度特征交互,超越传统 CBAM 的2026落地新宠

引言:注意力机制的“维度困境” 在深度学习领域,注意力机制(Attention Mechanism)已经成为提升模型性能的核心武器。从SENet首次将通道注意力引入CNN,到CBAM(Convolutional Block Attention Mechanism)同时使用通道和空间注意力,再到Transformer中的自注意力机制,注意…...

MusePublic圣光艺苑快速部署:免编译环境+Streamlit轻量框架优势分析

MusePublic圣光艺苑快速部署&#xff1a;免编译环境Streamlit轻量框架优势分析 1. 项目概述与核心价值 MusePublic圣光艺苑是一个专为艺术创作设计的AI绘画平台&#xff0c;它基于Stable Diffusion XL架构&#xff0c;通过精心设计的用户界面和优化的工作流程&#xff0c;为创…...

Hypnos-i1-8B应用场景:智能编程助手支持Python/Julia/Matlab多语言

Hypnos-i1-8B应用场景&#xff1a;智能编程助手支持Python/Julia/Matlab多语言 1. 模型概述与核心能力 Hypnos-i1-8B是一款专注于复杂逻辑推理和科学计算的8B参数开源大模型&#xff0c;基于量子噪声注入训练技术开发。这款模型特别适合作为智能编程助手&#xff0c;能够理解…...