当前位置: 首页 > 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) 即可解决问题。


成功提示
[图片]

http://www.lqws.cn/news/165943.html

相关文章:

  • 本地部署大模型实战:使用AIStarter一键安装Ollama+OpenWeb教程(含最新版本更新指南)
  • 【python深度学习】Day 45 Tensorboard使用介绍
  • 主流消息队列对比
  • 基于protobuf + iceoryx实现共享内存上的零拷贝
  • vue和uniapp聊天页面右侧滚动条自动到底部
  • python执行测试用例,allure报乱码且未成功生成报告
  • 学习路之PHP--webman安装及使用、webman/admin安装
  • Mobile App UI自动化locator
  • Jenkins | Jenkins构建成功服务进程关闭问题
  • Redis数据持久化机制深度解析
  • 从零开始的嵌入式学习day33
  • 【Fifty Project - D33】
  • select、poll、epoll 与 Reactor 模式
  • UI学习—cell的复用和自定义cell
  • linux 串口调试命令 stty
  • SELinux是什么以及如何编写SELinux策略
  • Git操作记录
  • 知识蒸馏:从模型输出到深层理解
  • JAVA开发工具——IntelliJ IDEA
  • 在不同型号的手机或平板上后台运行Aidlux
  • 上门预约行业技术方案全解析:小程序、App还是H5?如何选择?
  • Nature Methods | OmiCLIP:整合组织病理学与空间转录组学的AI模型
  • 【JavaWeb】Linux项目部署
  • 复变函数中的对数函数及其MATLAB演示
  • 如何利用Haption力反馈遥操作机器人解决远程操作难题
  • 2021 RoboCom 世界机器人开发者大赛-高职组(初赛)解题报告 | 珂学家
  • Linux Core 文件查看和调试
  • 第七十四篇 高并发场景下的Java并发容器:用生活案例讲透技术原理
  • 用 NGINX 构建高效 SMTP 代理`ngx_mail_smtp_module`
  • 深度学习N2周:构建词典