基本概念

节点

定义:每个节点负责一个单独的模块化的功能,本质上就是一个进程,也是可执行文件

节点之间的通信方式

  • 话题、服务、动作、参数

CLI工具

运行一个节点

  • ros2 run <功能包名字> <可执行文件名>

查看节点列表

  • ros2 node list

查看节点信息

  • ros2 node info <node_name>

运行时重映射节点名称

  • ros2 run <pkd> <node_name> --ros-args --remap __node=:xxxx

功能包

定义:实现一个功能可能需要多个节点,ROS将实现某功能的多个节点看成一个功能包

功能包的手动编译有3种方式:

  • ament_python(python)
  • ament_cmake(ROS2定义的一系列CMake函数)
  • cmake

手动编译的功能包一般需要手动source工作空间的install目录

除了手动编译,也可直接下载开源功能包:

  • sudo apt install ros-<version>-<pkg_name>

下载的开源包会直接装到ROS的系统目录opt/ros/humble,不用手动source

CLI工具

创建功能包

  • ros2 pkg create <pkg_name> --build-type {cmake/ament_cmake/ament_python} --dependencies <依赖名字>

列出所有可执行文件(节点)

  • ros2 pkg excutables (<pkg_name>)

列出所有包

  • ros2 pkg list

输出包的前缀名字

  • ros2 pkg prefix <pkg_name>

5.列出包的描述文件

  • 每一个pkg都有一个.xml文件,用于记录这个包的名字,构建工具,目的等信息。通过这个信息,就可以自动为包安装依赖,构件时确定编译顺序等。

  • ros2 pkg xml <pkg_name>

工作空间

定义:存放多个功能包的目录,功能包一般放在工作空间的src文件夹里面

ROS2的工程结构:工作空间 / 功能包x/ 节点x

Interface

由于ROS2需要跨进程进行通信,因此需要定义一种通信格式,来实现不同进程之间的数据交互

ROS2使用接口文件(.msg/.srv/.action格式)来定义通信格式(类似protobuf中的.proto文件)。编译时rosidl

根据这些文件生成相应的C++代码,供ROS2节点使用。通信时,DDS会根据这些文件进行序列化和反序列化

数据类型

在写接口文件时,需要定义变量,这就涉及到一个问题:有哪些能用的数据类型?

ROS2的接口文件有9种基础的数据类型,基于这些基础数据类型,又可以封装各种自定义类型

使用命令ros2 interface show <xxx>即可查看某接口的各个字段到底是什么

开发方式

ROS2中,Interface同样要在功能包之中进行开发。具体参考7.ROS2接口介绍

源码按如下方式进行组织,不同类型的接口文件放到不同目录中:

1
2
3
4
5
6
7
8
.
├── CMakeLists.txt
├── msg
│ ├── RobotPose.msg
│ └── RobotStatus.msg
├── package.xml
└── srv
└── MoveRobot.srv

编译完成后会得到一些头文件,即可使用这些自定义的Interface了

导入方式

ament_cmake类型功能包导入消息接口分为三步:

  1. CMakeLists.txt中导入,具体是先find_packagesament_target_dependencies
  2. packages.xml中导入,具体是添加depend标签并将消息接口写入
  3. 在代码中导入,C++中是#include"消息功能包/xxx/xxx.hpp"