学习了好几天,对 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.xmlCMakeLists.txt (或 setup.py )等规范
节点 (Node):ROS2 中最小的可执行单元。代码本身只是程序, ros2 run 运行起来之后才成为节点;一个机器人通常对应多个节点(比如:激光雷达节点、相机节点、运动控制节点、避障算法节点),节点之间互不干扰,各司其职
话题 (Topic):ROS2 最常用的异步通信方式(发布 / 订阅模型),单向、多对多通信。比如「相机节点」发布 (publish) 图像数据到 /image 话题,「图像处理节点」订阅 (subscribe) 这个话题就能拿到数据。发送方和接收方不直接认识,这是 ROS 2 解耦设计的核心
服务 (Service):ROS2 的同步请求 / 响应通信方式,双向通信。比如「控制节点」向「电机节点」发请求(转动角度),电机节点处理后返回响应(是否转动成功),适合需要确认执行结果的场景
参数 (Parameter):节点的配置项(比如:相机帧率、电机转速阈值),可以在节点启动时设置,也可以运行中动态修改,节点生命周期内生效
接口 (Interface):通信的数据格式约定,话题 / 服务的传输数据必须遵循固定格式。ROS2 内置了标准接口( std_msgsgeometry_msgssensor_msgs 等),也可以自定义接口
RMW(ROS Middleware):ROS2 的底层通信中间件抽象层,用户代码只面向 ROS2 API,具体由哪个 DDS 实现负责传输由 RMW 决定。Humble 默认是 Fast DDS,也可以用 Cyclone DDSexport RMW_IMPLEMENTATION=rmw_cyclonedds_cpp 可切换

geometry_msgs/Twist

geometry_msgs::msg::Vector3

下面分析一下 ROS2 中的几种消息类型:

  1. 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;
    
  2. 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;
    
  3. 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;
    
  4. 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;
    
  5. 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;
    
更新于 阅读次数 0

请我喝[茶]~( ̄▽ ̄)~*

bangdexuanyuan 微信支付

微信支付