学习了好几天,对 ROS2 有了更准确的认识。ROS 2 是机器人操作系统(Robot Operating System)的第二代版本,但它本身并不是操作系统,而是运行在 Linux 等系统之上的分布式机器人中间件框架。它的核心是通信,但不止是通信:它还提供节点管理、功能包构建、参数、日志、工具链等一整套能力,可以把不同的传感器(激光雷达、摄像头)和执行模块(电机、舵机)组合起来,让机器人完成移动、感知和控制任务。以前自己可能一直有一个误区,以为 ROS2 是操纵单片机的方式,现在理解得更准确:单片机通常运行实时控制系统,ROS 2 一般运行在工控机或开发板上,通过话题、服务等接口与底层硬件交互。
参考资料:ROS 2 Documentation(官方)、About ROS 2
几个理解:
工作空间 (Workspace):存放你所有 ROS2 项目代码的文件夹,常用结构为 src/ (源码)+ build/ 、 install/ 、 log/ (构建产物)。 ros2_ws 只是社区常用命名,不是强制约定;构建工具是 colcon
功能包 (Package):ROS2 中代码组织和分发的基本单元,一个功能包可以包含多个节点、消息定义、配置文件等,有固定的目录和 package.xml 、 CMakeLists.txt (或 setup.py )等规范
节点 (Node):ROS2 中最小的可执行单元。代码本身只是程序, ros2 run 运行起来之后才成为节点;一个机器人通常对应多个节点(比如:激光雷达节点、相机节点、运动控制节点、避障算法节点),节点之间互不干扰,各司其职
话题 (Topic):ROS2 最常用的异步通信方式(发布 / 订阅模型),单向、多对多通信。比如「相机节点」发布 (publish) 图像数据到 /image 话题,「图像处理节点」订阅 (subscribe) 这个话题就能拿到数据。发送方和接收方不直接认识,这是 ROS 2 解耦设计的核心
服务 (Service):ROS2 的同步请求 / 响应通信方式,双向通信。比如「控制节点」向「电机节点」发请求(转动角度),电机节点处理后返回响应(是否转动成功),适合需要确认执行结果的场景
参数 (Parameter):节点的配置项(比如:相机帧率、电机转速阈值),可以在节点启动时设置,也可以运行中动态修改,节点生命周期内生效
接口 (Interface):通信的数据格式约定,话题 / 服务的传输数据必须遵循固定格式。ROS2 内置了标准接口( std_msgs 、 geometry_msgs 、 sensor_msgs 等),也可以自定义接口
RMW(ROS Middleware):ROS2 的底层通信中间件抽象层,用户代码只面向 ROS2 API,具体由哪个 DDS 实现负责传输由 RMW 决定。Humble 默认是 Fast DDS,也可以用 Cyclone DDS; export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp 可切换
geometry_msgs/Twist
geometry_msgs::msg::Vector3
下面分析一下 ROS2 中的几种消息类型:
-
Point
Point 用于表示三维空间中的一个点,有三个浮点类型的成员变量:x, y, z。ROS2 里引用方式为
geometry_msgs/msg/Point,C++ 写法如下:#include <geometry_msgs/msg/point.hpp> geometry_msgs::msg::Point point; point.x = 1.0; point.y = 2.0; point.z = 3.0; -
Vector3
Vector3 用于表示三维空间中的一个向量,同样有三个浮点类型的成员变量:x, y, z。
#include <geometry_msgs/msg/vector3.hpp> geometry_msgs::msg::Vector3 vector; vector.x = 1.0; vector.y = 2.0; vector.z = 3.0; -
Quaternion
Quaternion 用于表示四元数,用于描述三维空间中的旋转,有四个浮点类型的成员变量:x, y, z, w。单位四元数表示 “不旋转”。
#include <geometry_msgs/msg/quaternion.hpp> geometry_msgs::msg::Quaternion quaternion; quaternion.x = 0.0; quaternion.y = 0.0; quaternion.z = 0.0; quaternion.w = 1.0; -
Pose
Pose 用于表示机器人在三维空间中的位置和方向,包含一个 Point 类型的成员变量 position 和一个 Quaternion 类型的成员变量 orientation。
#include <geometry_msgs/msg/pose.hpp> geometry_msgs::msg::Pose pose; pose.position.x = 1.0; pose.position.y = 2.0; pose.position.z = 3.0; pose.orientation.x = 0.0; pose.orientation.y = 0.0; pose.orientation.z = 0.0; pose.orientation.w = 1.0; -
Twist 用于表示机器人的线速度和角速度,包含两个 Vector3 类型的成员变量:linear 和 angular。
#include <geometry_msgs/msg/twist.hpp> geometry_msgs::msg::Twist twist; twist.linear.x = 1.0; twist.linear.y = 0.0; twist.linear.z = 0.0; twist.angular.x = 0.0; twist.angular.y = 0.0; twist.angular.z = 1.0;