簡明結論:
- 無論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) 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直接中斷執行,要求你先手動處理。
【如何解決】
- 徹底刪除或重命名該目錄
- 用資源管理器(文件夾窗口)打開 C:\Users\qwv\,找到 source 文件夾。
- 如果你不需要這里的數據,直接刪掉 source 文件夾。
- 如果里面有重要文件(比如你自己的代碼),可以改名如 source_backup。
- 確認刪除后,重啟MATLAB(保險做法)
- 再次運行 ros2genmsg(folderpath)
【補充說明】
- 這個問題和你的 Python、消息內容、路徑設置沒有直接關系,只與MATLAB的消息生成緩存/臨時目錄相關。
- 通常是上次編譯異常中斷、或者有其它軟件占用該目錄,MATLAB無法安全覆蓋,才會報這個錯。
- 一般清理掉這個目錄就能正常生成,不會丟失任何你自己的ROS2數據。
【簡要結論】
只要刪除或重命名 C:\Users\qwv\source 文件夾,再重試 ros2genmsg(folderpath) 即可解決問題。
成功提示