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.rhkb.cn/news/38225.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pfsense部署四(静态路由的配置)

目录 一 . 介绍 二 . 配置过程 一 . 介绍 pfsense开源防火墙经常在进行组网时&#xff0c;通常会用于连接不同的网络&#xff0c;在这个时候进需要给pfsense配置路由&#xff0c;而这篇文章介绍的是静态路由的配置 二 . 配置过程 拓扑图&#xff1a; 本次实验使用ensp模拟器…

干货!三步搞定 DeepSeek 接入 Siri

Siri高频用户福音&#xff0c;接下来仅需3步教你如何将 DeepSeek 接入 Siri&#xff01;虽然苹果公司并没有给国行产品提供 ai 功能&#xff0c;但是我们可以让自己的 iPhone 更智能一点。虽然有消息称苹果和阿里巴巴将合作为中国iPhone用户开发AI功能&#xff0c;但我们可以先…

自动学习和优化过程,实现更加精准的预测和决策的智慧交通开源了

智慧交通视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。通过高效的实时视…

DeepSeek R1 本地部署指南 (3) - 更换本地部署模型 Windows/macOS 通用

0.准备 完成 Windows 或 macOS 安装&#xff1a; DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 DeepSeek R1 本地部署指南 (2) - macOS 本地部署-CSDN博客 以下内容 Windows 和 macOS 命令执行相同&#xff1a; Windows 管理员启动&#xff1a;命令提示符 CMD ma…

使用 Node.js 读取 Excel 文件并处理合并单元格

使用 Node.js 读取 Excel 文件并处理合并单元格 在现代的数据处理任务中&#xff0c;Excel 文件是一种非常常见的数据存储格式。无论是数据分析、报表生成&#xff0c;还是数据迁移&#xff0c;Excel 文件都扮演着重要的角色。然而&#xff0c;处理 Excel 文件时&#xff0c;尤…

汇川EASY系列之以太网通讯(MODBUS_TCP做从站)

汇川easy系列PLC做MODBUS_TCP从站,不需要任何操作,但是有一些需要知道的东西。具体如下: 1、汇川easy系列PLC做MODBUS_TCP从站,,ModbusTCP服务器默认开启,无需设置通信协议(即不需要配置),端口号为“502”。ModbusTCP从站最多支持31个ModbusTCP客户端(ModbusTCP主站…

1996-2023年各省公路里程数据(无缺失)

1996-2023年各省公路里程数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1996-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;公路里程&#xff08;万公里&#xff09; 4、范围&#xff1a;31省 5、指标解释&#xff1a;公路里程指报告期末…

虚拟机访问主机的plc仿真

主机 虚拟机 默认&#xff0c;连接物理地址

从“不敢买大”到“按墙选屏”,海信电视如何凭百吋重构客厅?

电视买小了&#xff0c;成为茜茜新房入住后最大的遗憾。 新房装修的时候&#xff0c;茜茜担心电视买大了眼睛看着累&#xff0c;因此把尺寸选在了65吋。结果入住后&#xff0c;孩子看动画片嚷着“画面太小”&#xff0c;老公看球赛吐槽“看不清球员号码”&#xff0c;全家追剧…

Swift 经典链表面试题:如何在不访问头节点的情况下删除指定节点?

摘要 在日常开发中&#xff0c;链表虽然不像数组、字典那么常用&#xff0c;但在某些场景下还是挺重要的。尤其是面试的时候&#xff0c;链表题目可是经典考点之一。今天我们要聊的就是一个看似简单&#xff0c;但很多人第一次做都会卡住的问题——删除单链表中的指定节点。 …

楼宇自控系统的结构密码:总线与分布式结构方式的差异与应用

在现代建筑中&#xff0c;为了实现高效、智能的管理&#xff0c;楼宇自控系统变得越来越重要。它就像建筑的 智能管家&#xff0c;可自动控制照明、空调、通风等各种机电设备&#xff0c;让建筑运行更顺畅&#xff0c;还能节省能源成本。而在楼宇自控系统里&#xff0c;有两种关…

git | 回退版本 并保存当前修改到stash,在进行整合。[git checkout | git stash 等方法 ]

目录 一些常见命令&#xff1a; git 回退版本 一、临时回退&#xff08;不会修改历史&#xff0c;可随时回到当前版本&#xff09; 方法1&#xff1a;git checkout HEAD~1 问题&#xff1a;处于 detached HEAD 状态下提交的&#xff0c;无法直接 git push ✅ 选项 1&…

Linux系统之美:环境变量的概念以及基本操作

本节重点 理解环境变量的基本概念学会在指令和代码操作上查询更改环境变量环境变量表的基本概念父子进程间环境变量的继承与隔离 一、引入 1.1 自定义命令&#xff08;我们的exe&#xff09; 我们以往的Linux编程经验告诉我们&#xff0c;我们在对一段代码编译形成可执行文件后…

尝试在软考65天前开始成为软件设计师-计算机网络

OSI/RM 七层模型 层次名功能主要协议7应用层实现具体应用功能 FTP(文件传输)、HTTP、Telnet、 POP3(邮件)SMTP(邮件) ------- DHCP、TFTP(小文件)、 SNMP、 DNS(域名) 6表示层数据格式,加密,压缩.....5会话层建立,管理&终止对话4传输层端到端连接TCP,UDP3网络层分组传输&a…

基于随机森林回归预测葡萄酒质量

基于随机森林回归预测葡萄酒质量 1.作者介绍2.随机森林算法与数据集介绍2.1定义2.2核心思想2.3主要步骤2.4数据集介绍 3.算法实现3.1数据加载与探索3.2数据可视化3.3数据预处理&#xff08;标准化、划分训练/测试集&#xff09;3.4模型训练与优化&#xff08;随机森林回归 超参…

【赵渝强老师】在Docker中运行达梦数据库

Docker是一个客户端服务器&#xff08;Client-Server&#xff09;架构。Docker客户端和Docker守护进程交流&#xff0c;而Docker的守护进程是运作Docker的核心&#xff0c;起着非常重要的作用&#xff08;如构建、运行和分发Docker容器等&#xff09;。达梦官方提供了DM 8在Doc…

【C语言】深入理解指针(二):从数组到二维数组的指针魔法

前言 在C语言中&#xff0c;指针一直是一个神秘而强大的存在。它不仅可以帮助我们高效地操作内存&#xff0c;还能让代码更加灵活和高效。今天&#xff0c;我们就来深入探讨指针的多种用法&#xff0c;从数组到二维数组&#xff0c;一步步揭开指针的神秘面纱。 一、数组名的指…

【MySQL】事务

目录 基本概念事务操作自动提交事务开启事务提交事务回滚事务代码示例 事务的特性 ACID事务的隔离级别读未提交 read uncommitted读已提交 read committed可重复读 repeatable read序列化&#xff08;串行&#xff09; serializable操作示例 基本概念 在 MySQL 中的事务&#…

flutter doctor提示cmdline-tools component is missing错误的解决

flutter doctor检测环境后报错如下: STEP1: 配置command-lines &#x1f4cc; 打开Androidstudio &#xff0c;找到sdkmanager &#x1f447; 安装command-line tools 如果找不到&#xff0c;记得打开右下角的「Show Package Details} 再次运行flutter doctor 即可正常 如…

iptables和netfilter内部报文处理

一、Iptables和netfilter 1.iptables基础 netfilter强大功能以及灵活性是通过iptables界面来实现。此命令行工具和它的前身ipchains语法相似&#xff1b;不过iptables使用netfilter子系统来增进网络连接、检验和处理方面的能力&#xff1b;ipchains使用错综复杂的规则集合来过…