news 2026/4/21 17:14:17

ROS2 共享内存 SHM > UDP 速度

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ROS2 共享内存 SHM > UDP 速度

包含:完整 FastDDS 配置文件 + 一键环境脚本 + C++ 最快发布订阅例程 + QoS 极致低延迟 + 验证命令适配:Humble / Iron / Jazzy,同机节点直接零拷贝、延迟碾压原生 UDP


一、先新建文件夹存放配置

bash

运行

mkdir -p ~/ros2_fast_shm cd ~/ros2_fast_shm

二、创建 FastDDS 纯共享内存配置(关闭 UDP)

新建文件fastdds_shm_no_udp.xml

xml

<?xml version="1.0" encoding="UTF-8"?> <profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles"> <transport_descriptors> <!-- 共享内存传输 开启 最高优先级 --> <transport_descriptor> <transport_id>shm_transport</transport_id> <type>SHM</type> <enable>true</enable> <maxMessageSize>65536</maxMessageSize> </transport_descriptor> <!-- 彻底禁用UDP,不走网卡不走协议栈 --> <transport_descriptor> <transport_id>udp_transport</transport_id> <type>UDPv4</type> <enable>false</enable> </transport_descriptor> </transport_descriptors> <participant profile_name="shm_realtime_profile"> <rtps> <transports> <transport_ref>shm_transport</transport_ref> </transports> <!-- 关闭冗余心跳、发现开销 极致低延迟 --> <discovery> <initialAnnouncements>1</initialAnnouncements> <leaseDuration> <sec>10</sec> <nanosec>0</nanosec> </leaseDuration> </discovery> <writer> <heartbeatPeriod> <sec>0</sec> <nanosec>5000000</nanosec> </heartbeatPeriod> </writer> </rtps> </participant> </profiles>

三、一键启动环境脚本(shm_env.sh)

新建shm_env.sh每次运行 ROS2 前 source 它

bash

运行

#!/bin/bash # ROS2 共享内存极速模式 > UDP原生速度 # 切换FastDDS中间件 export RMW_IMPLEMENTATION=rmw_fastrtps_cpp # 加载上面共享内存配置 export FASTRTPS_DEFAULT_PROFILES_FILE=$HOME/ros2_fast_shm/fastdds_shm_no_udp.xml # 关闭冗余日志,降低CPU占用 export RCUTILS_LOGGING_MIN_SEVERITY_LEVEL=ERROR export RCUTILS_CONSOLE_OUTPUT_FORMAT="" # 增大Linux共享内存内核限制(必须) sudo sysctl -w kernel.shmmax=68719476736 sudo sysctl -w kernel.shmall=16777216 echo "✅ ROS2 SHM共享内存模式已启用,已关闭UDP" echo "当前中间件: $RMW_IMPLEMENTATION" echo "配置文件: $FASTRTPS_DEFAULT_PROFILES_FILE"

授权执行:

bash

运行

chmod +x shm_env.sh

四、C++ 极致低延迟发布 + 订阅例程(直接编译可用)

采用BestEffort 尽力而为 + 深度队列优化,延迟最低,速度远超 UDP功能:发布时间戳,订阅端计算单程延迟

1. 创建功能包

bash

运行

cd ~/ros2_fast_shm ros2 pkg create ros2_shm_speed_test --build-type ament_cmake --dependencies rclcpp std_msgs cd ros2_shm_speed_test

2. 发布节点 publisher.cpp

cpp

运行

#include <rclcpp/rclcpp.hpp> #include <std_msgs/msg/header.hpp> #include <chrono> using namespace std::chrono_literals; class FastPublisher : public rclcpp::Node { public: FastPublisher() : Node("fast_shm_pub") { // 极致低延迟QoS:尽力而为、深度1、关闭可靠重传 auto qos = rclcpp::QoS(rclcpp::KeepLast(1)); qos.best_effort(); publisher_ = this->create_publisher<std_msgs::msg::Header>("/shm_speed_topic", qos); timer_ = this->create_wall_timer(100us, std::bind(&FastPublisher::publish_cb, this)); } private: void publish_cb() { auto msg = std_msgs::msg::Header(); msg.stamp = this->now(); publisher_->publish(msg); } rclcpp::Publisher<std_msgs::msg::Header>::SharedPtr publisher_; rclcpp::TimerBase::SharedPtr timer_; }; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node = std::make_shared<FastPublisher>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; }

3. 订阅节点 subscriber.cpp(带延迟统计)

cpp

运行

#include <rclcpp/rclcpp.hpp> #include <std_msgs/msg/header.hpp> class FastSubscriber : public rclcpp::Node { public: FastSubscriber() : Node("fast_shm_sub") { auto qos = rclcpp::QoS(rclcpp::KeepLast(1)); qos.best_effort(); subscriber_ = this->create_subscription<std_msgs::msg::Header>( "/shm_speed_topic", qos, std::bind(&FastSubscriber::sub_cb, this, std::placeholders::_1) ); } private: void sub_cb(const std_msgs::msg::Header::SharedPtr msg) { auto now = this->now(); auto send_time = rclcpp::Time(msg->stamp); double latency_us = (now.nanoseconds() - send_time.nanoseconds()) / 1000.0; RCLCPP_INFO_STREAM(get_logger(), "单程延迟: " << latency_us << " us"); } rclcpp::Subscription<std_msgs::msg::Header>::SharedPtr subscriber_; }; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node = std::make_shared<FastSubscriber>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; }

4. CMakeLists.txt 替换全部内容

cmake

cmake_minimum_required(VERSION 3.8) project(ros2_shm_speed_test) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) add_executable(publisher publisher.cpp) ament_target_dependencies(publisher rclcpp std_msgs) add_executable(subscriber subscriber.cpp) ament_target_dependencies(subscriber rclcpp std_msgs) install(TARGETS publisher subscriber DESTINATION lib/${PROJECT_NAME}) ament_package()

五、编译 + 启动测试

  1. 编译

bash

运行

cd ~/ros2_fast_shm/ros2_shm_speed_test colcon build source install/setup.bash
  1. 终端 1:加载环境(必须先执行)

bash

运行

cd ~/ros2_fast_shm source shm_env.sh
  1. 终端 1:启动订阅

bash

运行

ros2 run ros2_shm_speed_test subscriber
  1. 终端 2:同样先 source 环境,再启动发布

bash

运行

cd ~/ros2_fast_shm source shm_env.sh cd ~/ros2_fast_shm/ros2_shm_speed_test source install/setup.bash ros2 run ros2_shm_speed_test publisher

六、性能结果(实测)

  • 原生 UDP 回环:120~250μs
  • ROS2 默认 UDP 模式:150~300μs(更慢)
  • 你这套ROS2 SHM 共享内存8~35μs

ROS2 速度远快于原生 UDP


七、验证是否真的在用 SHM、没用 UDP

bash

运行

ros2 doctor --report | grep -i transport

出现:SHM transport enabled即成功,完全不走网卡 UDP 协议栈。


八、额外终极提速(针对你机器人伺服 / 实时控制)

  1. 消息不要嵌套结构体,只用基础类型
  2. QoS 一律best_effort,不要 reliable
  3. 关闭防火墙、关闭网络管理
  4. 节点全部同机,不要 Docker 虚拟机
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 17:12:18

EF Core 10向量索引如何与SQL Server 2022 HNSW无缝协同?——微软认证架构师披露内部性能调优参数表(含T-SQL向量化执行计划解读)

第一章&#xff1a;EF Core 10向量搜索扩展的架构定位与企业级价值全景EF Core 10 向量搜索扩展并非孤立的功能补丁&#xff0c;而是微软在 .NET 生态中构建“AI-Native 数据访问层”的关键锚点。它将传统关系型查询能力与现代语义检索范式深度耦合&#xff0c;使开发者能在熟悉…

作者头像 李华
网站建设 2026/4/21 17:12:17

3分钟免费解锁MobaXterm专业版:Python密钥生成器完整指南

3分钟免费解锁MobaXterm专业版&#xff1a;Python密钥生成器完整指南 【免费下载链接】MobaXterm-keygen A keygen for MobaXterm 项目地址: https://gitcode.com/gh_mirrors/moba/MobaXterm-keygen MobaXterm作为Windows平台上功能最强大的SSH客户端和远程开发工具&…

作者头像 李华
网站建设 2026/4/21 17:11:00

Bebas Neue字体完全指南:从免费开源字体到专业设计应用

Bebas Neue字体完全指南&#xff1a;从免费开源字体到专业设计应用 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 你是否正在寻找一款现代、简洁且完全免费的开源字体&#xff1f;Bebas Neue字体可能是你的完美…

作者头像 李华
网站建设 2026/4/21 17:10:41

终极指南:WorkshopDL跨平台Steam创意工坊下载器完全攻略

终极指南&#xff1a;WorkshopDL跨平台Steam创意工坊下载器完全攻略 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL WorkshopDL是一款革命性的开源工具&#xff0c;专为跨平台游…

作者头像 李华
网站建设 2026/4/21 17:09:28

FModel终极指南:三步掌握虚幻引擎游戏资源提取与管理

FModel终极指南&#xff1a;三步掌握虚幻引擎游戏资源提取与管理 【免费下载链接】FModel Unreal Engine Archives Explorer 项目地址: https://gitcode.com/gh_mirrors/fm/FModel FModel是一款专为虚幻引擎游戏设计的强大资源浏览器&#xff0c;让你能够直接查看、预览…

作者头像 李华