ROS2 共享内存 SHM > UDP 速度

张开发
2026/4/21 17:14:19 15 分钟阅读

分享文章

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.xmlxml?xml version1.0 encodingUTF-8? profiles xmlnshttp://www.eprosima.com/XMLSchemas/fastRTPS_Profiles transport_descriptors !-- 共享内存传输 开启 最高优先级 -- transport_descriptor transport_idshm_transport/transport_id typeSHM/type enabletrue/enable maxMessageSize65536/maxMessageSize /transport_descriptor !-- 彻底禁用UDP不走网卡不走协议栈 -- transport_descriptor transport_idudp_transport/transport_id typeUDPv4/type enablefalse/enable /transport_descriptor /transport_descriptors participant profile_nameshm_realtime_profile rtps transports transport_refshm_transport/transport_ref /transports !-- 关闭冗余心跳、发现开销 极致低延迟 -- discovery initialAnnouncements1/initialAnnouncements leaseDuration sec10/sec nanosec0/nanosec /leaseDuration /discovery writer heartbeatPeriod sec0/sec nanosec5000000/nanosec /heartbeatPeriod /writer /rtps /participant /profiles三、一键启动环境脚本shm_env.sh新建shm_env.sh每次运行 ROS2 前 source 它bash运行#!/bin/bash # ROS2 共享内存极速模式 UDP原生速度 # 切换FastDDS中间件 export RMW_IMPLEMENTATIONrmw_fastrtps_cpp # 加载上面共享内存配置 export FASTRTPS_DEFAULT_PROFILES_FILE$HOME/ros2_fast_shm/fastdds_shm_no_udp.xml # 关闭冗余日志降低CPU占用 export RCUTILS_LOGGING_MIN_SEVERITY_LEVELERROR export RCUTILS_CONSOLE_OUTPUT_FORMAT # 增大Linux共享内存内核限制必须 sudo sysctl -w kernel.shmmax68719476736 sudo sysctl -w kernel.shmall16777216 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_test2. 发布节点 publisher.cppcpp运行#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_publisherstd_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::Publisherstd_msgs::msg::Header::SharedPtr publisher_; rclcpp::TimerBase::SharedPtr timer_; }; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node std::make_sharedFastPublisher(); 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_subscriptionstd_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::Subscriptionstd_msgs::msg::Header::SharedPtr subscriber_; }; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node std::make_sharedFastSubscriber(); rclcpp::spin(node); rclcpp::shutdown(); return 0; }4. CMakeLists.txt 替换全部内容cmakecmake_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()五、编译 启动测试编译bash运行cd ~/ros2_fast_shm/ros2_shm_speed_test colcon build source install/setup.bash终端 1加载环境必须先执行bash运行cd ~/ros2_fast_shm source shm_env.sh终端 1启动订阅bash运行ros2 run ros2_shm_speed_test subscriber终端 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μsROS2 默认 UDP 模式150~300μs更慢你这套ROS2 SHM 共享内存8~35μs✅ROS2 速度远快于原生 UDP七、验证是否真的在用 SHM、没用 UDPbash运行ros2 doctor --report | grep -i transport出现SHM transport enabled即成功完全不走网卡 UDP 协议栈。八、额外终极提速针对你机器人伺服 / 实时控制消息不要嵌套结构体只用基础类型QoS 一律best_effort不要 reliable关闭防火墙、关闭网络管理节点全部同机不要 Docker 虚拟机

更多文章