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

在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) 即可解决问题。


成功提示
[图片]

相关文章:

  • Next.js+prisma开发一
  • HTV 3.3 | 秒播无卡顿 直播源每天维护更新
  • 【STL】函数对象+常用算法
  • 【Modbus 通讯协议从入门到放弃二:实战】
  • Playwright 测试框架 - Java
  • 如何给windos11 扩大C盘容量
  • Python 训练营打卡 Day 44
  • 多进程与多线程:核心差异与实战选择
  • Linux 进程管理学习指南:架构、计划与关键问题全解
  • 2025年- H70-Lc178--17.电话号码的组合(回溯,组合)--Java版
  • 【cmder】--- Windows 下 cmder 经典常用快捷键 显著提高效率
  • el-draw的文件列表和清单内容布局实现
  • 杰理可视化SDK--系统死机异常调试
  • Flask-SQLAlchemy使用小结
  • 力扣LeetBook数组和字符串--二维数组
  • 2025爱分析·银行数字化应用实践报告|爱分析报告
  • 深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
  • 【C】-递归
  • Redis持久化模式RDB与AOF
  • Word文档重新打开后标题自动缩进的解决方法
  • 无锡做企业网站的公司/关键词查询工具
  • wordpress网站没有阅读量/网络销售怎么找客户
  • 标准件做网站推广效果怎么样/为什么sem的工资都不高
  • 怎么做同城购物网站/沈阳网站建设
  • 红酒网站源码/深圳网络营销的公司哪家好
  • mac可以做网站服务器吗/信息如何优化上百度首页公司