DDS
DDS(Data Distribution Service)是一种基于数据的通信中间件标准,目的是建立分布式系统的高质量数据通信。它采用发布-订阅模型,通过主题(Topic)实现数据的逻辑分组和管理,支持灵活的数据传输策略。
DDS的核心模型是DSCP(Data-centric Publish-Subscribe)模型,定义了数据发布者和数据订阅者之间的交互方式。具体包括以下几个角色:
- Domain:DDS域,可以理解为一个通讯平面,由Domain ID唯一标识,用于标识一个或多个DomainParticipant,只有在同个域的DomainParticipant才允许通讯
- DomainParticipant:域参与者,是域中的一个实体(可以具象为一个设备,或者设备中的一个进程),是数据发布者、订阅者和主题的创建和管理者,负责管理DDS中的实体对象和通信配置
- Publisher/Subscriber:发布者/订阅者,由DomainParticipant创建,发布者负责将数据发布到特定的主题(Topic)中,而订阅者则通过订阅相关主题来接收所需的数据
- DataWriter/DataReader:数据写入/读取者,由Publisher/Subscriber创建,DataWriter负责将数据写入到特定的主题中,而DataReader负责从主题中读取相应的数据
- Topic:主题是DCPS中定义数据传输的逻辑分类和组织单元。它可以看作是一种数据的标签,用于区分不同类型的数据
这些角色之间的关系如下:
Domain-> DomainParticipant -> Publisher/Subscriber -> DataWriter/DataReader
编程基础
g++编译
1 | // 包含rclcpp头文件,如果Vscode显示红色的波浪线也没关系 |
g++ first_ros2_node.cpp
报错:
- No such file or directory——没有那个文件或目录
g++: error: first_ros2_node.cpp: 没有那个文件或目录
g++: fatal error: no input files
compilation terminated.
解决:
-I 添加头文件路径 套娃式,全部加入
g++ first_ros2_node.cpp -I /opt/ros/foxy/include/rclcpp/
- undefined reference to xxxxx
g++找不到库文件
解决:
-L 添加库文件路径
-lrclcpp -lrcutils 指定链接到 rclcpp rcutils库
make
cmake
工作空间
工作空间(Workspace)是一个目录结构,用于组织和管理多个ROS 2包。通常包括四个主要目录:
- src(包含所有源代码包。每个包是一个独立的目录,包含包的源代码、头文件、配置文件等)
- build(包含构建过程中生成的中间文件。这些文件在构建过程中由colcon工具生成,用于编译和链接。)
- install(包含构建完成后生成的可执行文件、库文件和配置文件。这些文件在构建完成后由colcon工具安装到此目录,用于运行和测试。)
- log(包含构建过程中的日志文件。这些文件记录了构建过程中的详细信息,方便调试和排查问题)
新建一个工作空间:
- mkdir -p <workspace_name>/src
- cd <workspace_name>
- colcon build //可以省略,构建包时一并进行
- cd <workspace_name>/src
功能包
功能包(Feature Package)是一个特殊的包(就等于包?),它提供了一组相关的功能或服务,通常用于扩展ROS 2的核心功能。功能包可以包含节点、服务、消息、动作等,也可以提供工具、库或配置文件,以支持特定的功能或任务。
ROS2中功能包根据编译方式的不同分为三种类型:
- ament_python,适用于python程序
- cmake,适用于C++
- ament_cmake,适用于C++程序,是cmake的增强版
结构
一个典型的ROS 2包通常包含以下文件和目录:
- epackage.xml
这是包的描述文件,包含包的元数据,如包名、版本、作者、依赖关系等。它用于定义包的基本信息和依赖关系,帮助ROS 2构建系统(如colcon)了解如何构建和安装包。 - CMakeLists.txt
这是包的构建脚本,使用CMake语法编写。它定义了如何构建包中的代码,包括编译源文件、链接库、生成可执行文件等。 - src目录
包含源代码文件,如C++或Python文件。这些文件定义了包中的节点、库等。 - include目录
包含头文件,这些头文件定义了包中的类、函数等。 - launch目录
包含启动文件,这些文件定义了如何启动包中的节点。启动文件通常使用XML或Python编写。
相关代码
获取
安装获取——sudo apt install ros-<version代号>-package_name
也可手动编译获取(手动source工作空间的install目录 )
常用命令
- 创建功能包
1 | ros2 pkg create <package-name> --build-type {cmake,ament_cmake,ament_python} --dependencies <依赖名字> --node-name NAME |
自动生成NAME.cpp源文件 注意别加后缀
- 列出可执行文件
1 | ros2 pkg executables <package_name> |
- 列出所有的包
1 | ros2 pkg list |
- 输出某个包所在路径前缀
1 | ros2 pkg prefix <package_name> |
- 列出包的清单描述文件
1 | ros2 pkg xml <package_name> |
节点
节点可以理解为相互独立的进程。每一个节点只负责一个单独的模块化功能,比如一个节点负责控制车轮转动,一个节点负责从激光雷达获取数据、一个节点负责处理激光雷达的数据、一个节点负责定位等等
相关命令
- 启动包下的节点
1 | ros2 run <package_name> <executable_name> |
- 查看节点信息
1 | ros2 node info <node_name> |
- 重映射节点名称
1 | ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle |
–ros-args 后面跟上相关参数
- 运行节点时设置参数
1 | ros2 run example_parameters_rclcpp parameters_basic --ros-args -p rcl_log_level:=10 |
Colcon
功能包构建工具,可以用来编译代码
相关代码
- 允许通过更改src下的部分文件来改变install(重要)每次调整 python 脚本时都不必重新build了 ???
1 | colcon build --symlink-install |
- 只编译一个包
1 | colcon biuld --packages-select YOUR_PKG_NAME |
- 编译整个工程
1 | colcon build |
- 不编译测试单元
1 | colcon build --packages-select YOUR_PKG_NAME --cmake-args -DBUILD_TESTING=0 |
- 运行编译的包的测试
1 | colcon test |
一般流程
建空间——建包——写源代码——修改CMakelists.txt——编译——加载setup.bash文件——执行