当前位置: 首页 > news >正文

ROS2总结(二)

1.QoS (Quality of Service)

1.1 概述

ROS2提供了一套非常丰富的服务质量QoS策略用于调整节点之间的通信。众所周知,在TCP与UDP之间存在着无数的折中设置,QoS既可以设置成像TCP一样可靠(reliable),也可以设置为像UDP一样高效(best effort)。

一套QoS策略形成了一个QoS Profile。考虑到为特定的场景选择正确QoS策略较为复杂,ROS2提供了一套预定义的QoS Profiles,用于常见场景(如传感器数据)。同时,也提供了特定的Profiles给使用者设置QoS策略。发布器、订阅器、服务端和客户端可以指定Profile,且它们的每个实例都可以单独指定Profile,但不兼容的Profiles可能导致无法通信

1.2 QoS策略

QoS Profile提供了对以下QoS策略的设置:

(1)可靠性(Reliability) 消息传达的可靠性

  • 可靠的(Reliable):反复重传以保证数据成功传输。
  • 尽力的(Best effort):尝试传输数据但不保证成功传输(当网络不稳定时可能丢失数据)。

(2)历史记录(History)    消息的历史记录方式

当订阅者由于忙碌错过了消息,其仍能收到历史消息。这个参数只有在 Reliability 为 RELIABLE 时才有用。

  • 保留近期记录(Keep last):缓存最多N条记录,可通过队列长度选项来配置。
  • 保留所有记录(Keep all):缓存所有记录,但受限于底层中间件可配置的最大资源。

 (3)深度(Depth)

  • 队列深度(Size of the queue):只能与Keep last配合使用,指定需要保留的消息个数。

 (4)持续性(Durability)

消息是否应该在网络中持久化,以便新加入的订阅者也能接收。这个参数只有在 Reliability 为 RELIABLE 时才有用。  

  • Transient local:消息在发布者端持久化,新加入的订阅者可以接收到旧消息,接收个数由History和Depth决定。
  • Volatile:不保留任何数据。
rclcpp::QoS custom_qos_profile(rclcpp::QoSInitialization::from_rmw(rmw_qos_profile_default));// 设置 QoS 策略
custom_qos_profile.keep_last(10)                    // History: Keep last 10 条.reliable()                       // Reliability: Reliable.transient_local();               // Durability: Transient Local

SensorDataQoS 是 ROS2 中一个 预定义的 QoS配置,专门用于处理传感器数据(如摄像头图像、激光雷达点云等)的 发布-订阅通信。它被设计为在高频、低延迟但可容忍丢包的场景中使用。

  • History: Keep last,
  • Depth: 5,
  • Reliability: Best effort,  不保证每条消息传达成功(适用于实时要求高的传感器数据)
  • Durability: Volatile,
  • Deadline: Default,
  • Lifespan: Default,
  • Liveliness: System default,
  • Liveliness lease duration: default,
  • avoid ros namespace conventions: false

ROS2学习日志:QoS要点总结 - dzyBK - 博客园

2.DDS

DDS是ROS2的一大特性,具体就不再赘述了,一般而言默认使用的是FAST DDS ,可通过 ros2 doctor --report 查看

RMW MIDDLEWARE
middleware name    : rmw_fastrtps_cpp

有个需求:两个docker需要相互话题通信,需要把DDS改为cyclone dds(适合多机通信和生产环境)

export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

此外,只有设置相同 domain_id 的 ROS 节点,才能发现彼此、进行通信。

export ROS_DOMAIN_ID=3

Eclipse Cyclone DDS — ROS 2 Documentation: Jazzy documentation

3. 节点进程通信

3.1 单进程

intra-process 也叫 IPC,当多个节点合并启动时,如果开启 IPC,数据将直接通过进程内的指针传递,绕过中间件,这样可以大大降低通信开销。

demo

// LIO-SAM ros2 code
int main(int argc, char** argv)
{   rclcpp::init(argc, argv);rclcpp::NodeOptions options;options.use_intra_process_comms(true);rclcpp::executors::MultiThreadedExecutor e;auto ImuP = std::make_shared<IMUPreintegration>(options);auto TF = std::make_shared<TransformFusion>(options);e.add_node(ImuP);e.add_node(TF);RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "\033[1;32m----> IMU Preintegration Started.\033[0m");e.spin();rclcpp::shutdown();return 0;
}

总结:同一个进程内的两个 ROS 节点间通信,零拷贝,减少CPU负载。

3.2 多进程

上一小节只是单进程内多个节点通信,但实际应用中是多个进程间通信,这个时候需要使用component 合并进程。

具体参考 demo 即可,注意需要把  add_library声明的动态库 install 到 lib目录下。

对比LIO-SAM代码修改为单进程的CPU负载:

①独立进程:

②合并进程:

http://www.lryc.cn/news/601628.html

相关文章:

  • VMware Workstation Pro虚拟机的下载和安装图文保姆级教程(附下载链接)
  • Mysql 二进制安装常见问题
  • QUARTUS速通流程
  • HCIP---MGRE实验
  • 数学建模——模糊综合评价
  • 2-4、Dify案例实践—基于工作流构建商城用户评价智能分析系统
  • 算法竞赛阶段二-数据结构(37)数据结构循环链表模拟实现
  • print(“\033[31m红\033[32m绿\033[34m蓝\033[0m默认色“)
  • 零基础学习性能测试第五章:JVM性能分析与调优-JVM运行时内存区域介绍
  • Maven之多模块项目管理
  • C语言——关于指针(逐渐清晰版)
  • 嵌入式——单片机的独立按键
  • 数据结构基础内容(第七篇:堆、哈夫曼树)
  • 电子电气架构 --- 软件bug的管理模式
  • 「iOS」————MRC
  • Flink2.0学习笔记:Stream API 常用转换算子
  • 第十八章:AI的“通感”:揭秘图、文、音的共同语言——CLIP模型
  • 常见认证机制详解
  • Unity FXAA
  • 设计模式(六)创建型:单例模式详解
  • 五、搭建springCloudAlibaba2021.1版本分布式微服务-gateway网关
  • 新手开发 App,容易陷入哪些误区?
  • c++加载qml文件
  • 【学习笔记】DexMimicGen:通过模仿学习实现双臂灵巧操作的自动化数据生成
  • 小白成长之路-Ansible自动化(一)
  • 小白投资理财 - 从换手率和成交量分析股票趋势
  • 【机器学习深度学习】NLP评价指标 BLEU 和 ROUGE
  • 扩展组件(uni-ui)之uni-group
  • Dify 本地化部署深度解析与实战指南
  • C语言自定义数据类型详解(四)——联合体