简明结论:
- 无论ROS2节点和MATLAB运行在哪,MATLAB本机都必须拥有自定义消息源码并本地用ros2genmsg生成,才能在Simulink里订阅这些消息。
- 只要你想让MATLAB或Simulink能识别自定义消息,必须把消息包源码(.msg等)拷到本机指定目录,然后运行ros2genmsg。
- MATLAB和Simulink会在之后的所有ROS2通信、仿真、代码生成中支持这些类型。
- 包结构和ROS2规范一致就行,多个包可以一起处理。
- 只要你的自定义消息包源码在本地,结构正确,就能通过ros2genmsg一键导入MATLAB/Simulink,并且能和内置消息一样创建、发布、订阅和回调。
- 支持多包批量导入和自动依赖处理,导入后所有操作与内置消息完全一致。
- 如果更新消息定义,只需重新运行一次ros2genmsg即可。
问题:
- 要拷贝到安装有MATLAB的Windows本机的包仅仅是包含有.msg格式文件的那个msg文件夹还是包含有这个msg的功能包?(比如pid_interfaces功能包,其中不仅有msg文件夹,还有include文件夹、CMakeLists.txt还有package.xml文件),,还是说需要导入的是经过colcon build后的install文件夹里的某个文件夹? 】
- 第一步完成以后,按照教程,需要执行ros2genmsg(folderpath)来注册发这个自定义消息,那么这个代码只需要执行一次,还是每次重新打开MATLAB以后都需要重新执行?
- 我想把第一步的拷贝的文件放在F:\simulink_project\custom_msgs路径下,folderpath = "F:\simulink_project\custom_msgs"; 是不是就可以了?
- folderpath 并不需要指定到具体的.msg文件是么?
你的问题非常具有代表性,下面分点详细回答:
- 到底要拷贝什么内容?是只要 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用源码生成自己的消息解析代码,不依赖已编译好的内容。
- ros2genmsg(folderpath) 只需要执行一次还是每次都要执行?
- 只需要在消息定义发生变化时执行一次。正常情况下:
- 第一次导入新消息包时,执行一次;
- 以后只要 .msg(或srv/action)有增删改,再执行一次覆盖旧的;
- 每次重启MATLAB不用再执行,只要不改动消息定义即可。
- 只有消息定义变动才需要重新执行,否则导入的类型一直可用。
- 路径设置 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文件夹。
- 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) [email protected](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。 2. 确认删除后,重启MATLAB(保险做法) 3. 再次运行 ros2genmsg(folderpath) *** ** * ** *** 【补充说明】 * 这个问题和你的 Python、消息内容、路径设置没有直接关系,只与MATLAB的消息生成缓存/临时目录相关。 * 通常是上次编译异常中断、或者有其它软件占用该目录,MATLAB无法安全覆盖,才会报这个错。 * 一般清理掉这个目录就能正常生成,不会丢失任何你自己的ROS2数据。 *** ** * ** *** 【简要结论】 只要删除或重命名 C:\\Users\\qwv\\source 文件夹,再重试 ros2genmsg(folderpath) 即可解决问题。 *** ** * ** *** 成功提示 ![\[图片\]](https://i-blog.csdnimg.cn/direct/ae652ec4c7994a09b859f42df0ecb0a9.png)