在MATLAB中使用自定义的ROS2消息

简明结论:

  1. 无论ROS2节点和MATLAB运行在哪,MATLAB本机都必须拥有自定义消息源码并本地用ros2genmsg生成,才能在Simulink里订阅这些消息。
  2. 只要你想让MATLAB或Simulink能识别自定义消息,必须把消息包源码(.msg等)拷到本机指定目录,然后运行ros2genmsg。
  3. MATLAB和Simulink会在之后的所有ROS2通信、仿真、代码生成中支持这些类型。
  4. 包结构和ROS2规范一致就行,多个包可以一起处理。
  5. 只要你的自定义消息包源码在本地,结构正确,就能通过ros2genmsg一键导入MATLAB/Simulink,并且能和内置消息一样创建、发布、订阅和回调。
  6. 支持多包批量导入和自动依赖处理,导入后所有操作与内置消息完全一致。
  7. 如果更新消息定义,只需重新运行一次ros2genmsg即可。

问题:

  1. 要拷贝到安装有MATLAB的Windows本机的包仅仅是包含有.msg格式文件的那个msg文件夹还是包含有这个msg的功能包?(比如pid_interfaces功能包,其中不仅有msg文件夹,还有include文件夹、CMakeLists.txt还有package.xml文件),,还是说需要导入的是经过colcon build后的install文件夹里的某个文件夹? 】
  2. 第一步完成以后,按照教程,需要执行ros2genmsg(folderpath)来注册发这个自定义消息,那么这个代码只需要执行一次,还是每次重新打开MATLAB以后都需要重新执行?
  3. 我想把第一步的拷贝的文件放在F:\simulink_project\custom_msgs路径下,folderpath = “F:\simulink_project\custom_msgs”; 是不是就可以了?
  4. folderpath 并不需要指定到具体的.msg文件是么?

你的问题非常具有代表性,下面分点详细回答:


  1. 到底要拷贝什么内容?是只要 msg 文件夹,还是整个功能包,还是 build/install 文件夹?
    一定要拷贝整个功能包的源码目录,而不是只拷msg文件夹,也不是build/install生成的文件夹!
  • 需要的内容是:
    你的自定义消息功能包目录(例如pid_interfaces),包括:
    • msg 文件夹(放 .msg 文件)
    • 如果有,srv 文件夹(放 .srv 文件)
    • 如果有,action 文件夹(放 .action 文件)
    • CMakeLists.txt
    • package.xml
    • (如有)include 文件夹等其它源码结构
      不需要拷贝colcon build后生成的 build、install 或 log 文件夹!
      不需要单独只拷msg文件夹!
      必须是完整的功能包源码目录结构,MATLAB用源码生成自己的消息解析代码,不依赖已编译好的内容。

  1. ros2genmsg(folderpath) 只需要执行一次还是每次都要执行?
  • 只需要在消息定义发生变化时执行一次。正常情况下:
    • 第一次导入新消息包时,执行一次;
    • 以后只要 .msg(或srv/action)有增删改,再执行一次覆盖旧的;
    • 每次重启MATLAB不用再执行,只要不改动消息定义即可。
  • 只有消息定义变动才需要重新执行,否则导入的类型一直可用。

  1. 路径设置 folderpath = “F:\simulink_project\custom_msgs”; 这样可以吗?
    完全可以!
    只要你把所有功能包源码都放在F:\simulink_project\custom_msgs\下,比如:
    F:\simulink_project\custom_msgs\pid_interfaces
    F:\simulink_project\custom_msgs\other_custom_pkg
    你的folderpath就设置成:
    folderpath = “F:\simulink_project\custom_msgs”;
    ros2genmsg(folderpath)
    即可,无需到具体包名或msg文件夹。

  1. folderpath 不需要指向具体的 .msg 文件对吗?
    对!不需要指定到 .msg 文件本身。
    folderpath 只需指定到包含功能包源码的“父目录”。
    MATLAB 会自动递归扫描这个目录下的所有包、所有msg/srv/action定义。
    比如你的目录结构是:
    F:\simulink_project\custom_msgs
    └─ pid_interfaces
    ├─ msg
    ├─ CMakeLists.txt
    └─ package.xml
    那么 folderpath 就是 F:\simulink_project\custom_msgs,不要指到msg文件夹或单个msg文件!

结论小结:

  • 一定是整个功能包源码目录,不是只要msg文件夹,也不是install/build;
  • ros2genmsg只要消息变动时执行一次即可,非每次启动必需;
  • folderpath指到功能包的“上一级目录”即可,不要指到msg或单个文件。

MATLAB与python的版本对应关系:
https://www.mathworks.com/support/requirements/python-compatibility.html?s_tid=srchtitle_site_search_1_python+compatibility
MATLAB2024b和python3.12是对应的。

但是ROS toolbox和MATLAB自己的python解释器配置是分离的。
ROS toolbox 兼容的python版本也和MATLAB兼容的python版本不太一样。具体信息见下:
https://www.mathworks.com/help/releases/R2024b/ros/gs/ros-system-requirements.html

在使用ros2genmsg(folderpath)之前,需要先配置ROS toolbox的python解释器版本:
[图片]

如果之后执行ros2genmsg(folderpath)报错:

ros2genmsg(folderpath) Identifying message files in folder ‘F:/simulink_project/custom_msgs’…Validating message files in folder ‘F:/simulink_project/custom_msgs’…Done. Done. [0/1] Generating MATLAB interfaces for custom message packages… 0%Error using ros.internal.ROSProjectBuilder (line 517) The directory ‘C:\Users\qwv\source’ already exists, will cause the build in directory ‘F:\simulink_project\custom_msgs\matlab_msg_gen\win64’ to fail. Remove or rename ‘C:\Users\qwv\source’, and retry the command. Error in ros.ros2.internal.ColconBuilder (line 26) h@ros.internal.ROSProjectBuilder(varargin{:}); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error in ros2genmsg (line 278) builder = ros.ros2.internal.ColconBuilder(genDir, pkgInfos{iPkg}, UseNinja=useNinja, SuppressOutput=suppressOutput); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
报错信息解析
你的这个错误信息非常明确:
The directory ‘C:\Users\qwv\source’ already exists, will cause the build in directory ‘F:\simulink_project\custom_msgs\matlab_msg_gen\win64’ to fail. Remove or rename ‘C:\Users\qwv\source’, and retry the command.


【问题解析】

  • MATLAB 的 ros2genmsg 工具在生成消息接口时,会自动建立临时工程和构建目录。
  • 它期望 C:\Users\qwv\source 这个路径是用来临时存放源码和构建产物的。
  • 但发现这个路径已经存在(可能被你或别的软件用过,或有残留文件),为避免覆盖或混乱,MATLAB直接中断执行,要求你先手动处理。

【如何解决】

  1. 彻底删除或重命名该目录
  • 用资源管理器(文件夹窗口)打开 C:\Users\qwv\,找到 source 文件夹。
    • 如果你不需要这里的数据,直接删掉 source 文件夹。
    • 如果里面有重要文件(比如你自己的代码),可以改名如 source_backup。
  1. 确认删除后,重启MATLAB(保险做法)
  2. 再次运行 ros2genmsg(folderpath)

【补充说明】

  • 这个问题和你的 Python、消息内容、路径设置没有直接关系,只与MATLAB的消息生成缓存/临时目录相关。
  • 通常是上次编译异常中断、或者有其它软件占用该目录,MATLAB无法安全覆盖,才会报这个错。
  • 一般清理掉这个目录就能正常生成,不会丢失任何你自己的ROS2数据。

【简要结论】
只要删除或重命名 C:\Users\qwv\source 文件夹,再重试 ros2genmsg(folderpath) 即可解决问题。


成功提示
[图片]

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

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

相关文章

spring重试机制

数据库死锁处理与重试机制实现指南 1. 业务场景 1.1 问题现象 高并发批量数据处理时频繁出现数据库死锁主要发生在"先删除历史数据,再重新计算"的业务流程中原有逐条处理方式:list.forEach(item -> { delete(); calculate(); }) 1.2 死…

QEMU源码全解析 —— 块设备虚拟化(24)

接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(23) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 特此致谢! QEMU写入一个文件的完整过程 前边用了十来篇文章的篇幅,解析了QEMU启动过程中的存储…

java中static学习笔记

较重要知识点 static修饰的变量是共享的在类加载时创建可以不通过实例来访问静态方法只能访问静态的成员和方法;而非静态的可以访问静态的和非静态的。静态方法一般用在通用的方法,这样方便调用,不然一个通用的方法每一次调用都要创建实例&a…

快刀集(1): 一刀斩断视频片头广告

一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…

spring中的@KafkaListener 注解详解

KafkaListener 是 Spring Kafka 提供的一个核心注解,用于标记一个方法作为 Kafka 消息的消费者。下面是对该注解的详细解析: 基本用法 KafkaListener(topics "myTopic", groupId "myGroup") public void listen(String message)…

多区域协同的异地多活AI推理服务架构

🌐多区域协同的异地多活AI推理服务架构 #mermaid-svg-TTnpRKKC7k3twxhE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TTnpRKKC7k3twxhE .error-icon{fill:#552222;}#mermaid-svg-TTnpRKKC7k3twxhE .er…

极客时间:在 Google Colab 上尝试 Prefix Tuning

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Android设备推送traceroute命令进行网络诊断

文章目录 工作原理下载traceroute for android推送到安卓设备执行traceroutetraceroute www.baidu.com Traceroute(追踪路由) 是一个用于网络诊断的工具,主要用于追踪数据包从源主机到目标主机所经过的路由路径,以及每一跳&#x…

【Linux应用】Linux系统日志上报服务,以及thttpd的配置、发送函数

【Linux应用】Linux系统日志上报服务,以及thttpd的配置、发送函数 文章目录 thttpd服务安装thttpd配置thttpd服务thttpd函数日志效果和文件附录:开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADX…

Linux 内核内存管理子系统全面解析与体系构建

一、前言: 为什么内存管理是核心知识 内存管理是 Linux 内核最核心也最复杂的子系统之一,其作用包括: 为软件提供独立的虚拟内存空间,实现安全隔离分配/回收物理内存资源,维持系统稳定支持不同类型的内存分配器,最优…

鼠标的拖动效果

1、变量的设置 let isDragging false; let startX; let startY; let endX; let endY; let box null;isDragging : 表示是否推拽startX、startY:表示起始坐标,相对于元素endX、endY:表示结束坐标,相对于元素box&…

SwaggerFuzzer:一款自动化 OpenAPI/Swagger 接口未授权访问测试工具

SwaggerFuzzer 🌐 一款自动化 OpenAPI/Swagger 接口未授权访问测试工具🚀 工具介绍:SwaggerFuzzer✨ 核心功能亮点🚀 快速使用🧰 支持参数 📌 项目结构📥 获取与下载 🌐 一款自动化 …

文献阅读:Exploring Autoencoder-based Error-bounded Compression for Scientific Data

目录 论文简介动机:为什么作者想要解决这个问题?贡献:作者在这篇论文中完成了什么工作(创新点)?规划:他们如何完成工作?离线训练阶段:在线压缩阶段 理由:通过什么实验验证它们的工作…

【业务框架】3C-相机-Cinemachine

概述 插件,做相机需求,等于相机老师傅多年经验总结的工具 Feature Transform:略Control Camera:控制相机参数Noise:增加随机性Blend:CameraBrain的混合列表指定一个虚拟相机到另一个相机的过渡&#xff…

设计一个算法:删除非空单链表L中结点值为x的第一个结点的前驱结点

目录 单链表的存储结构定义如下 快慢指针法 三指针法版本① 三指针法版本② 单链表的存储结构定义如下 typedef struct{Elemtype data;struct Node* next; }LNode,*LinkList; 快慢指针法 void deleteprex(LinkList L, Elemtype e) {if (L NULL || L->next NULL ||…

【Qt】:设置新建类模板

完整的头文件模板 #ifndef %FILENAME%_H #define %FILENAME%_H/*** brief The %CLASSNAME% class* author %USER%* date %DATE%*/ class %CLASSNAME% { public:%CLASSNAME%();~%CLASSNAME%();// 禁止拷贝构造和赋值%CLASSNAME%(const %CLASSNAME%&) delete;%CLASSNAME%&a…

​**​CID字体​**​ 和 ​**​Simple字体​**​

在PDF中,字体类型主要分为 ​​CID字体​​ 和 ​​Simple字体​​ 两大类,它们的主要区别在于编码方式和适用场景。以下是它们的详细对比: ​​1. CID字体(CID-keyed Fonts)​​ CID(Character Identifie…

计组_导学

2025.05.31:老汤讲408计组学习笔记 导学 第1章计算机系统概述:对计算机系统有全局的认识第2章总线系统:简单且独立,不会依赖其他内容,它是被依赖的第3章主存储器:只有了解主存储器的内部结构,才能理解在主存中是如何存储二进制的第4章数据的表示与运算:各种编码以及计算…

【GPT模型训练】第二课:张量与秩:从数学本质到深度学习的基础概念解析

这里写自定义目录标题 张量(Tensor)的定义关键特点:示例: 张量的秩(Rank)示例:“秩”的拼音常见混淆点 总结 张量(Tensor)的定义 在数学和物理学中,张量是一…

RabbitMQ work模型

Work 模型是 RabbitMQ 最基础的消息处理模式,核心思想是 ​​多个消费者竞争消费同一个队列中的消息​​,适用于任务分发和负载均衡场景。同一个消息只会被一个消费者处理。 当一个消息队列绑定了多个消费者,每个消息消费的个数都是平摊的&a…