ROS多機通信功能包——Multibotnet

引言

這是之前看到一位大佬做的集群通信中間件,突發奇想,自己也來做一個,實現更多的功能、更清楚的架構和性能更加高效的ROS多機通信的功能包
鏈接:https://blog.csdn.net/benchuspx/article/details/128576723

Multibotnet

Multibotnet 是一個專為多機器人系統設計的 ROS 包,利用 ZeroMQ 技術實現高效的分布式通信。簡單來說,它能讓多臺機器人或電腦之間輕松共享 ROS 話題和服務,哪怕它們不在同一個網絡環境下也能協作工作。無論是機器人團隊協同任務,還是跨設備的數據共享,Multibotnet 都能派上用場!

  • 項目地址:github 倉庫——Multibotnet

主要功能

話題共享

  • 發送話題:把本地的 ROS 話題通過網絡發出去,其他機器人就能收到。
  • 接收話題:從網絡上抓取其他機器人發來的話題,融入本地 ROS 系統。

服務管理

  • 提供服務:讓你的機器人通過網絡為別人提供 ROS 服務,比如遠程開關控制。
  • 請求服務:調用其他機器人提供的服務,實現跨設備的功能交互。

支持的消息類型

支持常見的 ROS 消息類型,包括但不限于:

  • sensor_msgs/Imu(IMU 數據)
  • geometry_msgs/Twist(速度指令)
  • std_msgs/String(字符串)
  • nav_msgs/Odometry(里程計)
  • sensor_msgs/LaserScan(激光雷達)
  • sensor_msgs/Image(圖像)
  • geometry_msgs/Pose(位姿)
  • geometry_msgs/Point(點坐標)
  • std_msgs/Float32(浮點數)
  • std_msgs/Int32(整數)
  • geometry_msgs/PoseStamped(帶時間戳的位姿)
  • sensor_msgs/PointCloud2(點云)
  • geometry_msgs/Vector3(三維向量)
  • 自定義類型(稍作修改就能支持,超靈活!)

支持的服務類型

  • std_srvs/SetBool(布爾開關服務)
  • nav_msgs/GetPlan(路徑規劃服務)
  • 自定義服務(同樣支持擴展)

項目優勢

  • 簡單配置,一鍵搞定
    通過一個 YAML 文件就能設置話題、服務、IP 和端口,想改啥改啥,完全不用碰代碼。

  • 通信超快,效率爆表
    用 ZeroMQ 技術,支持多對多通信,哪怕是大規模機器人集群也能hold住。

  • 頻率可控,不怕卡頓
    發送話題時可以限制頻率,避免網絡堵塞,帶寬利用率剛剛好。

  • 擴展方便,隨心所欲
    想加新的消息或服務類型?改幾行代碼就行,完美適配你的項目需求。

  • 跨平臺無壓力
    不管是機器人還是普通電腦,只要有 ROS 環境,就能跑起來,分布式系統so easy!

效果部分展示

在這里插入圖片描述

安裝步驟

準備工作

需要先裝好以下依賴:

  • ZeroMQ:網絡通信核心
  • yaml-cpp:解析配置文件用
  • ROS:確保你的 ROS 環境已經配置好

安裝命令

  1. 安裝依賴:

    sudo apt-get install libzmq3-dev libyaml-cpp-dev
    
  2. 克隆項目到你的 catkin 工作空間:

    cd ~/catkin_ws/src
    git clone https://github.com/nanwanuser/multibotnet.git
    
  3. 編譯項目:

    cd ~/catkin_ws
    catkin_make
    

使用方法

  1. 配置一下
    打開 config/default.yaml 文件,填入你想要共享的話題和服務信息,比如 IP 地址、端口號等。

  2. 啟動程序
    一行命令搞定:

    roslaunch multibotnet multibotnet.launch
    

配置說明

config/default.yaml 是你的“控制中心”,里面有這些關鍵項:

  • IP:給 IP 地址起個別名,比如 self: ‘*’ 表示本機所有 IP。
  • send_topics:設置要發出去的話題(話題名、類型、頻率、地址、端口)。
  • recv_topics:設置要接收的話題(話題名、類型、地址、端口)。
  • provide_services:定義你要提供的服務(服務名、類型、地址、端口)。
  • request_services:定義你要調用的遠程服務(服務名、類型、地址、端口)。

具體格式可以參考默認文件,照著改就行!

如何擴展自定義類型

想用自己的消息或服務類型?很簡單,按以下步驟操作:

添加自定義消息類型

  1. 引入頭文件
    在 include/multibotnet/ros_sub_pub.hpp 中加一行:

    #include <your_package/YourMessage.h>
    
  2. 映射類型
    在 getMsgType 函數中添加:

    if (type == "your_package/YourMessage") return "your_package::YourMessage";
    
  3. 發送邏輯
    在 src/zmq_manager.cpp 的 sendTopic 函數中加一段:

    else if (message_type == "your_package/YourMessage") {sub = nh.subscribe<your_package::YourMessage>(topic, 1, [this, &current_socket, index, topic](const your_package::YourMessage::ConstPtr& msg) {if (send_freq_control(index)) {auto buffer = serializeMsg(*msg);zmq::message_t zmq_msg(buffer.size());memcpy(zmq_msg.data(), buffer.data(), buffer.size());if (!current_socket.send(zmq_msg, zmq::send_flags::none)) {ROS_ERROR("Failed to send message on topic %s", topic.c_str());}}});
    }
    
  4. 接收邏輯
    在 src/zmq_manager.cpp 的 recvTopic 函數中,首先為新消息類型創建發布者:

    else if (message_type == "your_package/YourMessage") {pub = nh.advertise<your_package::YourMessage>(topic, 1);
    }
    

    然后,在接收線程中反序列化并發布:

    else if (message_type == "your_package/YourMessage") {your_package::YourMessage msg = deserializeMsg<your_package::YourMessage>(static_cast<uint8_t*>(zmq_msg.data()), zmq_msg.size());pub.publish(msg);
    }
    
  5. 更新依賴
    在 package.xml 中添加:

    <depend>your_package</depend>
    
  6. 重新編譯

    catkin_make
    

添加自定義服務類型

  1. 引入頭文件
    在 include/multibotnet/ros_sub_pub.hpp 中添加對你的服務類型頭文件的引用,以便編譯器識別該類型:

    #include <your_package/YourService.h>
    
  2. 在 ServiceManager 中支持新服務類型
    在 src/service_manager.cpp 的 createHandler 函數中,為你的服務類型添加一個條件分支,創建對應的 SpecificServiceHandler:

    else if (service_type == "your_package/YourService") {return std::make_shared<SpecificServiceHandler<your_package::YourService>>(service_name);
    }
    

    這步是核心,ServiceManager 通過 createHandler 為提供的服務創建處理程序,綁定到 REP 套接字。
    SpecificServiceHandler 會自動調用本地 ROS 服務并處理序列化/反序列化。

  3. 更新模板實例化(可選)
    如果你需要在代碼中通過 callService 調用該服務,需要在 src/service_manager.cpp 文件末尾添加模板實例化:

    template bool ServiceManager::callService<your_package/YourService>(const std::string&, your_package/YourService::Request&, your_package/YourService::Response&);
    

    如果你只提供服務(provide_services),這步可以跳過;但如果涉及請求服務(request_services),則必須添加。

  4. 更新依賴
    在 package.xml 中添加對你服務包的依賴,確保項目能找到服務定義:

    <depend>your_package</depend>
    
  5. 重新編譯
    在工作空間根目錄下運行以下命令以應用更改:

    catkin_make
    
  6. 配置 YAML 文件
    在 config/default.yaml 中添加你的服務配置,例如:

    提供服務:

    provide_services:
    - service_name: /your_serviceservice_type: your_package/YourServicebind_address: selfport: 5560
    

    請求服務:

    request_services:
    - service_name: /remote_your_serviceservice_type: your_package/YourServiceconnect_address: robot1port: 5560
    

應用示例

場景描述

  • Robot1(IP: 192.168.1.101):發送 /imu 話題,提供 /set_bool 服務。
  • Robot2(IP: 192.168.1.102):接收 /imu 話題(顯示為 /imu_recv),調用 /set_bool 服務。

Robot1 配置

IP:self: '*'robot2: 192.168.1.102send_topics:
- topic: /imumessage_type: sensor_msgs/Imumax_frequency: 50bind_address: selfport: 3001provide_services:
- service_name: /set_boolservice_type: std_srvs/SetBoolbind_address: selfport: 5555

Robot2 配置

IP:self: '*'robot1: 192.168.1.101recv_topics:
- topic: /imu_recvmessage_type: sensor_msgs/Imuconnect_address: robot1port: 3001request_services:
- service_name: /set_boolservice_type: std_srvs/SetBoolconnect_address: robot1port: 5555

啟動兩臺機器上的 Multibotnet 后,Robot2 就能收到 Robot1 的 IMU 數據,并遠程控制它的開關服務。

總結

Multibotnet 是一個簡單又強大的工具,能讓多機器人系統高效協作。無論是話題共享還是服務調用,它都能通過靈活的配置和高性能通信滿足你的需求。快來試試吧,讓你的機器人團隊更聰明、更協同!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74220.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74220.shtml

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

相關文章

C++:背包問題習題

1. 貨幣系統 1371. 貨幣系統 - AcWing題庫 給定 V 種貨幣&#xff08;單位&#xff1a;元&#xff09;&#xff0c;每種貨幣使用的次數不限。 不同種類的貨幣&#xff0c;面值可能是相同的。 現在&#xff0c;要你用這 V 種貨幣湊出 N 元錢&#xff0c;請問共有多少種不同的…

IT工具 | node.js 進程管理工具 PM2 大升級!支持 Bun.js

P(rocess)M(anager)2 是一個 node.js 下的進程管理器&#xff0c;內置負載均衡&#xff0c;支持應用自動重啟&#xff0c;常用于生產環境運行 node.js 應用&#xff0c;非常好用&#x1f44d; &#x1f33c;概述 2025-03-15日&#xff0c;PM2發布最新版本v6.0.5&#xff0c;這…

2025年01月02日浙江鼎永前端面試

目錄 webpack 和 vite 區別react fiber 架構vue diff 算法react diff 算法hooks 源碼垂直水平布局項目介紹單點登錄大文件上傳微前端 1. webpack 和 vite 區別 Webpack 和 Vite 是兩種不同的前端構建工具&#xff0c;它們在設計理念、性能表現和使用場景上存在顯著差異。以下…

1.企業級AD活動目錄核心解析:架構、組件與集成實踐

在當今數字化時代&#xff0c;企業級網絡環境日益復雜&#xff0c;高效、安全的資源管理和用戶認證成為企業 IT 運營的關鍵。AD&#xff08;Active Directory&#xff09;活動目錄作為微軟 Windows 系列服務器中的重要目錄服務&#xff0c;為企業級網絡管理提供了強大的解決方案…

【數據分享】2014-2024年我國各城市逐年空氣質量指數(AQI)數據

空氣質量指數&#xff08;AQI&#xff09;是一個衡量空氣污染程度的綜合指標&#xff0c;它并不直接表示具體污染物的濃度值&#xff0c;而是基于多種污染物的濃度進行的綜合評價&#xff0c;具體基于六種主要污染物的濃度&#xff1a;PM2.5、PM10、SO?、NO?、O?和CO。AQI是…

【C++】深入理解list迭代器的設計與實現

深入理解list迭代器的設計與實現 引言1、鏈表基礎結構2、鏈表迭代器的封裝2.1 初步封裝迭代器類2.2 引入const迭代器2.2.1 參考STL源代碼2.2.2 完善迭代器 3、迭代器實現機制結語 引言 在STL容器中&#xff0c;list作為經典的雙向鏈表容器&#xff0c;其迭代器設計體現了C模板編…

C語言基礎系列【27】typedef

博主介紹&#xff1a;程序喵大人 35- 資深C/C/Rust/Android/iOS客戶端開發10年大廠工作經驗嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手《C20高級編程》《C23高級編程》等多本書籍著譯者更多原創精品文章&#xff0c;首發gzh&#xff0c;見文末&#x1f447;&#x1f…

【CXX-Qt】2.5 繼承

某些 Qt API 要求你從抽象基類中重寫某些方法&#xff0c;例如 QAbstractItemModel。 為了支持直接從 Rust 中創建這樣的子類&#xff0c;CXX-Qt 提供了多種輔助工具。 某些基類可能需要特殊的構造參數。這可以通過使用自定義構造函數來實現。 訪問基類方法 要在 Rust 中訪…

磁盤清理工具-TreeSize Free介紹

TreeSizeFree是一個磁盤空間管理工具&#xff0c;主要用于分析磁盤使用情況&#xff0c;幫助用戶找到占用空間大的文件和文件夾: 特點&#xff1a;按大小排序&#xff1a;快速找到占用空間最大的文件或文件夾 一般可以刪除: 掃描 C:\Users\XXX\AppData\Local\Temp 或 C:\Window…

OpenCV中距離公式

一、各類距離公式總結 常見距離公式 歐氏距離&#xff1a; 曼哈頓距離&#xff08;L1&#xff09;?&#xff1a; 切比雪夫距離&#xff08;Chessboard&#xff09;?&#xff1a; 1、點與點距離(歐氏距離) ?二維空間? 設兩點坐標為 P1(x1,y1)、P2(x2,y2)&#xff0c;其距離…

Vue.js 模板語法全解析:從基礎到實戰應用

引言 在 Vue.js 的開發體系中&#xff0c;模板語法是構建用戶界面的核心要素&#xff0c;它讓開發者能夠高效地將數據與 DOM 進行綁定&#xff0c;實現動態交互效果。通過對《Vue.js 快速入門實戰》中關于 Vue 項目部署章節&#xff08;實際圍繞 Vue 模板語法展開&#xff09;…

論文筆記(七十三)Gemini Robotics: Bringing AI into the Physical World

Gemini Robotics: Bringing AI into the Physical World 文章概括1. 引言2. Gemini 2.0的具身推理2.1. 具身推理問答&#xff08;ERQA&#xff09;基準測試2.2. Gemini 2.0的具身推理能力2.3. Gemini 2.0支持零樣本和少樣本機器人控制 3. 使用 Gemini Robotics 執行機器人動作3…

centos7搭建postgresql12主從

主從搭建 192.168.159.101 node1 主庫&#xff08;讀寫&#xff09; 192.168.159.102 node2 備庫&#xff08;只讀&#xff09; 兩臺機器首先安裝postgrsql 主庫 postgres用戶操作&#xff1a; 修改postgresql.conf # 在文件中修改(此配置僅用于遠程訪問, 流復制后續還有額外…

嵌入式基礎知識學習:SPI通信協議是什么?

SPI&#xff08;Serial Peripheral Interface&#xff09;是串行外設接口的縮寫&#xff0c;是一種廣泛應用于嵌入式系統的高速同步串行通信協議&#xff0c;由摩托羅拉公司于20世紀80年代提出。以下是其核心要點&#xff1a; 一、SPI的核心定義與特點 基本特性 全雙工同步通信…

996引擎-接口測試:背包

996引擎-接口測試:背包 背包測試NPC參考資料背包測試NPC CONSTANT = require("Envir/QuestDiary/constant/CONSTANT.lua"); MsgUtil = require("Envir/QuestDiary/utils/996/MsgUtil.lua");

vulnhub靶場之【hack-me-please靶機】

前言 靶機&#xff1a;billu_b0x2靶機&#xff0c;IP地址為192.168.10.8 攻擊&#xff1a;kali&#xff0c;IP地址為192.168.10.6 靶機和攻擊機都采用VMware虛擬機&#xff0c;都采用橋接網卡模式 文章涉及的靶機及工具&#xff0c;都可以自行訪問官網或者項目地址進行獲取&…

機器學習——KNN模型評價

一、主要函數 sklearn.metrics.accuracy_score() 是 scikit-learn 中用于計算分類模型準確率的函數&#xff0c;適用于評估分類任務的整體性能。 1、核心功能 作用&#xff1a;計算模型預測的準確率&#xff0c;即正確分類的樣本數占總樣本數的比例。公式&#xff1a;Accurac…

美國國家數據浮標中心(NDBC)

No.大劍師精品GIS教程推薦0地圖渲染基礎- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入門教程】 - 【源代碼示例 300】 2Leaflet 【入門教程】 - 【源代碼圖文示例 150】 3MapboxGL【入門教程】 - 【源代碼圖文示例150】 4Cesium 【入門教程】…

Qt調用Miniconda的python方法

1、 Win 64環境下載及安裝 Miniconda 首先下載Windows 版Miniconda&#xff0c;https://docs.conda.io/en/latest/miniconda.html或 https://repo.anaconda.com/miniconda/ 安裝界面及選擇如下圖所示&#xff1a; 安裝完python3.12版報錯如下。 說明&#xff1a;python3.11版…

Unity 與 JavaScript 的通信交互:實現跨平臺的雙向通信

前言 在現代游戲開發和 Web 應用中&#xff0c;Unity 和 JavaScript 的結合越來越常見。Unity 是一個強大的跨平臺游戲引擎&#xff0c;而 JavaScript 是 Web 開發的核心技術之一。通過 Unity 和 JavaScript 的通信交互&#xff0c;開發者可以實現從 Unity 到 Web 頁面的功能擴…