在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.pswp.cn/news/908733.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908733.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908733.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring重試機制

數據庫死鎖處理與重試機制實現指南 1. 業務場景 1.1 問題現象 高并發批量數據處理時頻繁出現數據庫死鎖主要發生在"先刪除歷史數據,再重新計算"的業務流程中原有逐條處理方式:list.forEach(item -> { delete(); calculate(); }) 1.2 死…

QEMU源碼全解析 —— 塊設備虛擬化(24)

接前一篇文章:QEMU源碼全解析 —— 塊設備虛擬化(23) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 特此致謝! QEMU寫入一個文件的完整過程 前邊用了十來篇文章的篇幅,解析了QEMU啟動過程中的存儲…

java中static學習筆記

較重要知識點 static修飾的變量是共享的在類加載時創建可以不通過實例來訪問靜態方法只能訪問靜態的成員和方法;而非靜態的可以訪問靜態的和非靜態的。靜態方法一般用在通用的方法,這樣方便調用,不然一個通用的方法每一次調用都要創建實例&a…

快刀集(1): 一刀斬斷視頻片頭廣告

一刀流:用一個簡單腳本,秒殺視頻片頭廣告,還你清爽觀影體驗。 1. 引子 作為一個愛生活、愛學習、愛收藏高清資源的老碼農,平時寫代碼之余看看電影、補補片,是再正常不過的事。 電影嘛,要沉浸,…

spring中的@KafkaListener 注解詳解

KafkaListener 是 Spring Kafka 提供的一個核心注解,用于標記一個方法作為 Kafka 消息的消費者。下面是對該注解的詳細解析: 基本用法 KafkaListener(topics "myTopic", groupId "myGroup") public void listen(String message)…

多區域協同的異地多活AI推理服務架構

🌐多區域協同的異地多活AI推理服務架構 #mermaid-svg-TTnpRKKC7k3twxhE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TTnpRKKC7k3twxhE .error-icon{fill:#552222;}#mermaid-svg-TTnpRKKC7k3twxhE .er…

極客時間:在 Google Colab 上嘗試 Prefix Tuning

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

Android設備推送traceroute命令進行網絡診斷

文章目錄 工作原理下載traceroute for android推送到安卓設備執行traceroutetraceroute www.baidu.com Traceroute(追蹤路由) 是一個用于網絡診斷的工具,主要用于追蹤數據包從源主機到目標主機所經過的路由路徑,以及每一跳&#x…

【Linux應用】Linux系統日志上報服務,以及thttpd的配置、發送函數

【Linux應用】Linux系統日志上報服務,以及thttpd的配置、發送函數 文章目錄 thttpd服務安裝thttpd配置thttpd服務thttpd函數日志效果和文件附錄:開發板快速上手:鏡像燒錄、串口shell、外設掛載、WiFi配置、SSH連接、文件交互(RADX…

Linux 內核內存管理子系統全面解析與體系構建

一、前言: 為什么內存管理是核心知識 內存管理是 Linux 內核最核心也最復雜的子系統之一,其作用包括: 為軟件提供獨立的虛擬內存空間,實現安全隔離分配/回收物理內存資源,維持系統穩定支持不同類型的內存分配器,最優…

鼠標的拖動效果

1、變量的設置 let isDragging false; let startX; let startY; let endX; let endY; let box null;isDragging : 表示是否推拽startX、startY:表示起始坐標,相對于元素endX、endY:表示結束坐標,相對于元素box&…

SwaggerFuzzer:一款自動化 OpenAPI/Swagger 接口未授權訪問測試工具

SwaggerFuzzer 🌐 一款自動化 OpenAPI/Swagger 接口未授權訪問測試工具🚀 工具介紹:SwaggerFuzzer? 核心功能亮點🚀 快速使用🧰 支持參數 📌 項目結構📥 獲取與下載 🌐 一款自動化 …

文獻閱讀:Exploring Autoencoder-based Error-bounded Compression for Scientific Data

目錄 論文簡介動機:為什么作者想要解決這個問題?貢獻:作者在這篇論文中完成了什么工作(創新點)?規劃:他們如何完成工作?離線訓練階段:在線壓縮階段 理由:通過什么實驗驗證它們的工作…

【業務框架】3C-相機-Cinemachine

概述 插件,做相機需求,等于相機老師傅多年經驗總結的工具 Feature Transform:略Control Camera:控制相機參數Noise:增加隨機性Blend:CameraBrain的混合列表指定一個虛擬相機到另一個相機的過渡&#xff…

設計一個算法:刪除非空單鏈表L中結點值為x的第一個結點的前驅結點

目錄 單鏈表的存儲結構定義如下 快慢指針法 三指針法版本① 三指針法版本② 單鏈表的存儲結構定義如下 typedef struct{Elemtype data;struct Node* next; }LNode,*LinkList; 快慢指針法 void deleteprex(LinkList L, Elemtype e) {if (L NULL || L->next NULL ||…

【Qt】:設置新建類模板

完整的頭文件模板 #ifndef %FILENAME%_H #define %FILENAME%_H/*** brief The %CLASSNAME% class* author %USER%* date %DATE%*/ class %CLASSNAME% { public:%CLASSNAME%();~%CLASSNAME%();// 禁止拷貝構造和賦值%CLASSNAME%(const %CLASSNAME%&) delete;%CLASSNAME%&a…

?**?CID字體?**? 和 ?**?Simple字體?**?

在PDF中,字體類型主要分為 ??CID字體?? 和 ??Simple字體?? 兩大類,它們的主要區別在于編碼方式和適用場景。以下是它們的詳細對比: ??1. CID字體(CID-keyed Fonts)?? CID(Character Identifie…

計組_導學

2025.05.31:老湯講408計組學習筆記 導學 第1章計算機系統概述:對計算機系統有全局的認識第2章總線系統:簡單且獨立,不會依賴其他內容,它是被依賴的第3章主存儲器:只有了解主存儲器的內部結構,才能理解在主存中是如何存儲二進制的第4章數據的表示與運算:各種編碼以及計算…

【GPT模型訓練】第二課:張量與秩:從數學本質到深度學習的基礎概念解析

這里寫自定義目錄標題 張量(Tensor)的定義關鍵特點:示例: 張量的秩(Rank)示例:“秩”的拼音常見混淆點 總結 張量(Tensor)的定義 在數學和物理學中,張量是一…

RabbitMQ work模型

Work 模型是 RabbitMQ 最基礎的消息處理模式,核心思想是 ??多個消費者競爭消費同一個隊列中的消息??,適用于任務分發和負載均衡場景。同一個消息只會被一個消費者處理。 當一個消息隊列綁定了多個消費者,每個消息消費的個數都是平攤的&a…