ros2-base
2025-09-20 13:53:26

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
2
3
4
5
6
7
8
9
10
11
12
// 包含rclcpp头文件,如果Vscode显示红色的波浪线也没关系
// 我们只是把VsCode当记事本而已,谁会在意记事本对代码的看法呢,不是吗?
#include "rclcpp/rclcpp.hpp"

int main(int argc, char **argv)
{
// 调用rclcpp的初始化函数
rclcpp::init(argc, argv);
// 调用rclcpp的循环运行我们创建的first_node节点
rclcpp::spin(std::make_shared<rclcpp::Node>("first_node"));
return 0;
}

g++ first_ros2_node.cpp
报错:

  1. 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/

  1. 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包通常包含以下文件和目录:

  1. epackage.xml
    这是包的描述文件,包含包的元数据,如包名、版本、作者、依赖关系等。它用于定义包的基本信息和依赖关系,帮助ROS 2构建系统(如colcon)了解如何构建和安装包。
  2. CMakeLists.txt
    这是包的构建脚本,使用CMake语法编写。它定义了如何构建包中的代码,包括编译源文件、链接库、生成可执行文件等。
  3. src目录
    包含源代码文件,如C++或Python文件。这些文件定义了包中的节点、库等。
  4. include目录
    包含头文件,这些头文件定义了包中的类、函数等。
  5. launch目录
    包含启动文件,这些文件定义了如何启动包中的节点。启动文件通常使用XML或Python编写。
    相关代码

获取

安装获取——sudo apt install ros-<version代号>-package_name
也可手动编译获取(手动source工作空间的install目录 )

常用命令

  1. 创建功能包
1
ros2 pkg create <package-name>  --build-type  {cmake,ament_cmake,ament_python}  --dependencies <依赖名字> --node-name NAME  

自动生成NAME.cpp源文件 注意别加后缀

  1. 列出可执行文件
1
2
ros2 pkg executables <package_name>
ros2 pkg executables turtlesim
  1. 列出所有的包
1
ros2 pkg list 
  1. 输出某个包所在路径前缀
1
ros2 pkg prefix <package_name>
  1. 列出包的清单描述文件
1
ros2 pkg xml <package_name>

节点

节点可以理解为相互独立的进程。每一个节点只负责一个单独的模块化功能,比如一个节点负责控制车轮转动,一个节点负责从激光雷达获取数据、一个节点负责处理激光雷达的数据、一个节点负责定位等等

相关命令

  1. 启动包下的节点
1
2
3
4
5
ros2 run <package_name> <executable_name>
```
2. 查看节点列表
```bash
ros2 node list
  1. 查看节点信息
1
ros2 node info <node_name>        
  1. 重映射节点名称
1
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle    

–ros-args 后面跟上相关参数

  1. 运行节点时设置参数
1
ros2 run example_parameters_rclcpp parameters_basic --ros-args -p rcl_log_level:=10

Colcon

功能包构建工具,可以用来编译代码

相关代码

  1. 允许通过更改src下的部分文件来改变install(重要)每次调整 python 脚本时都不必重新build了 ???
1
colcon build --symlink-install     
  1. 只编译一个包
1
colcon biuld --packages-select YOUR_PKG_NAME           
  1. 编译整个工程
1
colcon build         
  1. 不编译测试单元
1
colcon build --packages-select YOUR_PKG_NAME --cmake-args -DBUILD_TESTING=0    
  1. 运行编译的包的测试
1
colcon test        

一般流程

建空间——建包——写源代码——修改CMakelists.txt——编译——加载setup.bash文件——执行