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

在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.xdnf.cn/news/12224.html

相关文章:

  • MySQL中关于事务和锁的常见执行命令整理包括版本区别
  • Git Patch 使用详解:生成、应用与多提交合并导出
  • 炉石传说 第八次CCF-CSP计算机软件能力认证
  • 【大模型推理加速】MOE加速比与batchsize 关系
  • 某药监局药品详情sign值逆向
  • 第12期_网站搭建_几时网络验证1.3二改源码包2024 软件卡密系统 虚拟主机搭建笔记
  • linux下覆盖率测试总结
  • SQL Server相关的sql语句
  • React Hooks 指南:何时使用 useEffect ?
  • 鸿蒙APP测试实战:从HDC命令到专项测试
  • 【连接器专题】案例:FPC焊接金手指顶层和底层开窗/焊盘为什么要错位?
  • 《计算机是怎么跑起来的》第二章读后感
  • LeetCode 70 爬楼梯(Java)
  • 【深度学习】为什么2个3×3的卷积可以相当于一个5×5的卷积核?为什么3个3×3的卷积相当于一个7×7的卷积核,到底区别在哪里?我们该如何使用?
  • ESP32C3中BLE开发问题汇总
  • 数字图像处理第二次实验
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(32):そうやすいにくいすぎ(過ぎ)
  • 链表相关知识
  • 一键切换不同状态,3D数字孪生场景搭建更便捷!
  • 【iOS】cache_t分析
  • Qt 按钮类控件(Push Button 与 Radio Button)(1)
  • COMSOL学习笔记-静电场仿真
  • 可视化图解算法48:有效括号序列
  • DFORMER: RETHINKING RGBD REPRESENTATION LEARNING FOR SEMANTIC SEGMENTATION 论文浅析
  • 电厂数字孪生:智能优化助力碳中和
  • 【定昌linux开发板】设置用户密码过期时间
  • eNSP实现WDS手拉手业务
  • 如何做好一份技术文档?(上篇)
  • Spring AI(11)——SSE传输的MCP服务端
  • Spring Plugin框架应用实践:医院多租户客户端动态路由方案解析