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

ROS2软件架构全面解析-rmw软件框架

前言

本章是详细介绍ROS2通信中间件中rmw模块软件框架。
不了解背景的同学请先看:

  • ROS2软件架构全面解析-学习如何设计通信中间件框架: link

rmw框架

  • rmw是为兼容各种DDS组件而设计的中间件抽象层:the middleware abstraction layer called rmw (ROS MiddleWare)
  • 用户可以根据性能、软件许可或支持的平台等各种约束条件,选择不同的RMW 实现,也就是基于DDS协议的组件
  • 提供丰富的自由度让用户选择DDS协议实现组件,只要实现了rmw Layer规定的接口就可以装载到ROS2系统中完成消息传递

rmw软件架构

  • rmw Layer本人划分是主要两个文件夹:rmw、rmw_implementation
    在这里插入图片描述
  • rmw Layer主要的内容是规定DDS组件的功能接口:rmw.h、init.h 头文件,本身逻辑功能不多。rmw_validate_node_name实现在rmw Layer validate_node_name.c文件中,对node name 有效性进行验证,算逻辑代码多的文件了。
  • rmw_implementation模块中有一个动态函数调用框架,能够把DDS实现组件的函数接口直接提供给rcl Layer调用,能够让rcl Layer调用到DDS组件中。
//function.cpp
RMW_INTERFACE_FN(
  rmw_send_response,
  rmw_ret_t, RMW_RET_ERROR,
  3, ARG_TYPES(const rmw_service_t *, rmw_request_id_t *, void *))
  • rmw_send_response就是在rcl Layer service.c文件中调用的,rmw implementation通过RMW_INTERFACE_FN进行封装动态调用到选择的DDS组件。主要功能是在RMW_INTERFACE_FN Macro中。
#define CALL_SYMBOL(symbol_name, ReturnType, error_value, ArgTypes, arg_values) \
  if (!symbol_ ## symbol_name) { \
    /* only necessary for functions called before rmw_init */ \
    symbol_ ## symbol_name = get_symbol(#symbol_name); \
  } \
  if (!symbol_ ## symbol_name) { \
    /* error message set by get_symbol() */ \
    return error_value; \
  } \
  typedef ReturnType (* FunctionSignature)(ArgTypes); \
  FunctionSignature func = reinterpret_cast<FunctionSignature>(symbol_ ## symbol_name); \
  return func(arg_values);

// cppcheck-suppress preprocessorErrorDirective
#define RMW_INTERFACE_FN(name, ReturnType, error_value, _NR, ...) \
  void * symbol_ ## name = nullptr; \
  ReturnType name(EXPAND(ARGS_ ## _NR(__VA_ARGS__))) \
  { \
    CALL_SYMBOL( \
      name, ReturnType, error_value, ARG_TYPES(__VA_ARGS__), \
      EXPAND(ARG_VALUES_ ## _NR(__VA_ARGS__))); \
  }

  • RMW_INTERFACE_FN Macro用于定义一个函数,CALL_SYMBOL Macro调用负责动态加载调用传入名字的函数体
  • 比如rmw implementation设置的cyclonedds就会调入到如下代码实现
// rmw_node.cpp    rmw_cyclonedds_cpp文件夹目录
extern "C" rmw_ret_t rmw_send_response(
  const rmw_service_t * service,
  rmw_request_id_t * request_header, void * ros_response){}

rmw集成方式

  • rmw模组通过CMake会编译为rmw库,然后再rcl CMakeList中引入编译,使用的时候直接引入头文件就可以使用接口函数
// rmw CMakeLists.txt
cmake_minimum_required(VERSION 3.5)

project(rmw)

# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

//rcl CMakeLists.txt
# specific order: dependents before dependencies
ament_target_dependencies(${PROJECT_NAME}
  "rcl_interfaces"
  "rcl_logging_interface"
  "rcl_yaml_param_parser"
  "rcutils"
  "rmw"
  "rmw_implementation"
  ${RCL_LOGGING_IMPL}
  "rosidl_runtime_c"
  "tracetools"
)
  • rmw implementation package.xml支持集成rmw_connextdds、rmw_cyclonedds、rmw_fastrtps几种DDS实现,具体使用是通过RMW_IMPLEMENTATION系统属性设置的。

DDS组件

  • 目前提供三种DDS实现:connextdds、cyclonedds、fastrtps。
  • 还有一个dds_common作为一个共有的DDS模块,提供功能支持对其他差异化DDS。

相关文章:

  • 使用系统自带的磁盘清理工具清理c盘空间 以及手动删除临时文件
  • leetcode141.环形链表
  • 数据分析中的基线校正算法全解析:原理、实现与应用
  • 什么是Giteki认证?认证流程详解
  • 盾牌图鉴(死亡细胞)
  • Go 语言常见错误——控制结构
  • 前端知识点 --- border-Radius的四个角(css)
  • MSYS2:Windows 开发环境的技术革新
  • react + css 实现 椭圆布局
  • 赛逸展2025年重磅回归,科技盛宴再启新篇
  • Manus的开源替代者之一:OpenManus通用AI智能体框架解析及产品试用
  • MacOS 安装open webui
  • 数据类设计_图片类设计总结(常更新)
  • 快速入手-基于Django-rest-framework的mixins混合类简洁写法(六)
  • 【算法学习计划】贪心算法(上)
  • 单片机 - MSB先发的串行数据收发 知识点整理
  • 华宇TAS应用中间件与晓窗科技智慧校园管理一体化平台完成兼容互认证
  • 有关C++加密和自制简单加密程序。
  • 西门子 CPU 1513-1 PN TCP Server 接收字符串前多了一个问号
  • OpenAI 推出图像生成新突破:GPT-4o 实现图像编辑对话化
  • 做网站要坚持/市场调研分析报告模板
  • 怎样做影视网站不侵权/珠海网站建设制作
  • a做片手机免费网站有哪些/词爱站的关键词
  • 简单的网站建设合同书/永久免费自助建站软件
  • 网站负责人信息表/简述什么是网络营销
  • 上海网站公司电话/公司网站建设费