目录

ROS2 使用详细总结

目录

ROS2 使用详细总结

本文基于ROS2最新LTS版本(Humble Hawksbill / Jazzy Jalisco)编写,覆盖从环境搭建、核心概念、开发流程、进阶特性到生态应用、避坑指南的全链路内容,兼顾入门与实战,是一份可直接落地的ROS2全栈使用手册。

一、ROS2 核心概述与版本选择

1.1 核心定位

ROS2(Robot Operating System 2)是新一代开源机器人软件开发中间件,基于工业级DDS通信标准重构,彻底解决了ROS1中心化架构、实时性不足、跨平台能力弱、安全性缺失等核心痛点,完成了从「学术原型验证」到「工业级生产环境部署」的定位升级。

1.2 ROS2 核心优势(对比ROS1)

对比维度 ROS1 ROS2
核心架构 中心化(依赖Master节点,单点故障全局瘫痪) 去中心化(DDS自动发现,无Master,系统健壮性极强)
实时性 无原生硬实时支持,仅适用于非实时场景 原生支持μs级硬实时,适配Linux PREEMPT_RT、FreeRTOS等实时系统
跨平台 仅原生支持Linux 全平台原生支持Linux、Windows、macOS、嵌入式RTOS
通信机制 仅基础TCP/UDP传输,无通信质量保障 基于DDS的QoS服务质量配置,可精准适配不同场景的通信需求
编译系统 catkin_make/catkin_tools colcon 通用编译工具,支持ament_cmake/ament_python/cmake等多种构建类型
节点管理 节点启停无状态控制,故障容错能力弱 生命周期节点(Lifecycle Node),支持可控的状态机管理,适配工业级启停与故障处理
多机通信 需复杂配置,依赖Master节点 原生支持,同网段+相同ROS_DOMAIN_ID即可自动发现,无需额外配置
安全性 无原生安全机制,仅适用于内网封闭环境 原生支持SROS2安全层,提供身份认证、数据加密、访问控制,适配工业敏感场景

1.3 版本选择(2026年推荐)

优先选择LTS长期支持版本,生产环境严禁使用非LTS版本:

  • Humble Hawksbill:适配Ubuntu 22.04,LTS支持至2027年,生态最完善、文档最齐全、稳定性最高,新手与生产环境首选。
  • Jazzy Jalisco:适配Ubuntu 24.04,LTS支持至2029年,包含最新特性,适合尝鲜与前沿开发。
  • 其他说明:ROS1 Noetic已于2025年5月停止官方支持,2025年后所有机器人开发均应全面转向ROS2。

二、ROS2 环境安装与基础配置

2.1 Ubuntu 官方标准安装(以Humble为例)

步骤1:配置系统环境与密钥

# 安装依赖
sudo apt update && sudo apt install curl gnupg lsb-release -y

# 添加ROS2官方GPG密钥
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

# 添加ROS2软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

步骤2:安装ROS2

# 更新软件源
sudo apt update

# 安装桌面完整版(推荐,包含RViz、仿真、Demo等全量功能)
sudo apt install ros-humble-desktop -y

# 安装基础版(无GUI,适合嵌入式设备)
# sudo apt install ros-humble-ros-base -y

# 安装开发依赖与构建工具
sudo apt install python3-colcon-common-extensions python3-rosdep -y

# 初始化rosdep(解决依赖问题)
sudo rosdep init
rosdep update

一键安装脚本(新手推荐)

国内网络环境推荐使用鱼香ROS一键安装脚本,自动解决源与依赖问题:

wget http://fishros.com/install -O fishros && . fishros

2.2 环境核心配置

1. 环境变量生效

每次打开终端都需要source环境变量,临时生效执行:

# 基础ROS2环境
source /opt/ros/humble/setup.bash
# 工作空间环境(编译后执行)
source ~/ros2_ws/install/setup.bash

永久生效(写入终端配置文件):

# bash终端
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
# zsh终端
echo "source /opt/ros/humble/setup.zsh" >> ~/.zshrc

2. 核心网络配置

# 1. ROS_DOMAIN_ID:隔离不同ROS2网络,同网段设备必须相同,取值0-101
echo "export ROS_DOMAIN_ID=42" >> ~/.bashrc

# 2. ROS_LOCALHOST_ONLY:仅本机通信,1=开启,0=关闭(多机通信必须设为0)
echo "export ROS_LOCALHOST_ONLY=0" >> ~/.bashrc

2.3 安装验证

  1. 系统完整性检查:ros2 doctor,无报错则环境正常。
  2. 通信功能验证:
    • 终端1:ros2 run demo_nodes_cpp talker(发布话题)
    • 终端2:ros2 run demo_nodes_cpp listener(订阅话题)
    • 若listener持续收到talker的消息,说明ROS2通信完全正常。

三、ROS2 核心概念与通信架构

3.1 ROS2 整体架构

ROS2采用分层解耦设计,从下到上分为4层,核心优势在于底层DDS的可插拔与上层API的统一封装:

用户应用层 → 客户端库(rclcpp/rclpy)→ RCL核心中间层 → RMW DDS适配层 → DDS通信底层
  • DDS底层:工业级数据分发服务,实现去中心化通信、自动节点发现、QoS保障,默认使用Fast DDS,可无缝切换Cyclone DDS等其他实现。
  • RMW层:ROS中间件适配层,屏蔽不同DDS实现的差异,为上层提供统一接口。
  • RCL层:ROS核心公共层,封装了节点、参数、时间、日志等通用功能,避免不同客户端库重复开发。
  • 客户端库:提供C++(rclcpp)、Python(rclpy)等语言的API,是用户开发的核心入口。
  • 用户应用层:用户开发的节点、功能包、机器人系统。

3.2 核心基础概念

1. 工作空间(Workspace)

ROS2的工程根目录,用于管理所有功能包源码与编译产物,标准目录结构如下:

ros2_ws/
├── src/      # 核心目录,存放所有功能包源码(唯一需要手动管理的目录)
├── build/    # 编译中间文件,colcon自动生成
├── install/  # 编译输出目录,包含可执行文件、环境变量、库文件
└── log/      # 编译与运行日志
  • 核心机制:overlay覆盖机制,工作空间的环境会叠加在底层ROS2基础环境之上,可同时存在多个工作空间,后source的工作空间优先级更高。

2. 功能包(Package)

ROS2软件分发、编译、运行的最小单元,所有代码必须放在功能包中,分为两种类型:

  • ament_cmake:C++功能包,基于CMake构建系统。
  • ament_python:Python功能包,基于setuptools构建系统。

标准功能包核心文件:

  • package.xml:功能包的元信息文件,声明包名、版本、依赖、作者等信息,是ROS2识别功能包的核心。
  • CMakeLists.txt:C++功能包的编译规则文件,定义编译选项、依赖链接、安装规则。
  • setup.py/setup.cfg:Python功能包的编译与安装规则文件。
  • 可选目录:src/(源码)、include/(头文件)、launch/(启动文件)、msg/srv/action/(自定义接口)。

3. 节点(Node)

ROS2系统的最小执行单元,一个节点对应一个独立的功能模块(如传感器驱动、路径规划、电机控制),遵循「单一职责原则」,一个完整的机器人系统由多个协同工作的节点组成。

  • 核心特点:每个节点有唯一的名称,可独立启动/停止,支持命名空间隔离,一个进程可运行多个节点(节点组合),减少进程间通信开销。
  • 进阶特性:生命周期节点(Lifecycle Node),为节点定义了标准状态机(未配置→已配置→激活→去激活→关闭),实现节点的可控初始化、启停、故障恢复,是工业机器人的核心必备特性。

3.3 四大核心通信机制

ROS2的核心是节点间的通信,提供了4种适配不同场景的通信模式,全部支持QoS服务质量配置,是机器人系统的「神经网络」。

通信模式 架构模式 通信特性 核心适用场景
话题(Topic) 发布-订阅(Pub/Sub) 异步、一对多/多对多、无应答、无阻塞 高频连续数据流:传感器数据、里程计、图像、点云
服务(Service) 客户端-服务器(Client/Server) 同步、一对一、请求-应答、阻塞式 一次性触发任务:开关设备、参数查询、单次计算
动作(Action) 客户端-服务端 异步、长时任务、支持反馈/取消/抢占、结果返回 长耗时可控任务:机械臂运动、导航、路径规划、相机标定
参数(Parameter) 节点级配置管理 去中心化、动态修改、类型校验、事件通知 节点运行时配置:PID参数、阈值、帧率、功能开关

关键补充:QoS服务质量

QoS是ROS2区别于ROS1的核心特性,可精准配置通信的传输规则,解决ROS1通信不可控、丢包、延迟高等问题。核心配置项与常用预设:

  • 核心配置项:可靠性(RELIABLE可靠传输/BEST_EFFORT尽力而为)、历史记录、队列深度、生命周期、截止时间、持久性。
  • 常用预设:
    • SENSOR_DATA:适配高频传感器数据,BEST_EFFORT+小队列深度,优先保证低延迟。
    • DEFAULT:默认配置,RELIABLE+队列深度10,平衡可靠性与延迟。
    • PARAMETERS:适配参数服务,高可靠性配置。
    • SYSTEM_DEFAULT:使用底层DDS的默认配置。

四、ROS2 常用命令行工具(CLI)速查

ROS2所有命令均以ros2 <子命令>为前缀,核心子命令分类如下,覆盖90%日常开发场景:

4.1 节点管理

# 列出所有运行中的节点
ros2 node list
# 查看节点详细信息(发布/订阅的话题、服务、参数)
ros2 node info /节点名
# 重映射节点名称(运行时修改)
ros2 run 包名 可执行文件 --ros-args --remap __node:=新节点名

4.2 话题管理

# 列出所有话题,-t 同时显示消息类型
ros2 topic list -t
# 实时查看话题数据
ros2 topic echo /话题名
# 查看话题详细信息(发布者、订阅者、QoS)
ros2 topic info /话题名 -v
# 手动发布话题消息
ros2 topic pub /话题名 消息类型 '{"字段名": 值}'
# 查看话题发布频率
ros2 topic hz /话题名
# 查看话题带宽占用
ros2 topic bw /话题名

4.3 服务管理

# 列出所有服务,-t 同时显示服务类型
ros2 service list -t
# 查看服务类型定义
ros2 service type /服务名
# 手动调用服务
ros2 service call /服务名 服务类型 '{"请求字段": 值}'
# 查找指定类型的服务
ros2 service find 服务类型

4.4 动作管理

# 列出所有动作
ros2 action list -t
# 查看动作详细信息
ros2 action info /动作名
# 发送动作目标,-f 持续接收反馈
ros2 action send_goal /动作名 动作类型 '{"目标字段": 值}' -f

4.5 参数管理

# 列出指定节点的所有参数
ros2 param list /节点名
# 获取参数值
ros2 param get /节点名 参数名
# 运行时设置参数值
ros2 param set /节点名 参数名 值
# 保存节点参数到yaml文件
ros2 param dump /节点名 > params.yaml
# 从yaml文件加载参数到节点
ros2 param load /节点名 params.yaml
# 启动节点时加载参数文件
ros2 run 包名 可执行文件 --ros-args --params-file params.yaml

4.6 接口管理

# 列出所有可用的接口(msg/srv/action)
ros2 interface list
# 查看接口的详细定义
ros2 interface show 接口类型
# 查看接口所属的功能包
ros2 interface package 接口类型

4.7 功能包管理

# 创建C++功能包
ros2 pkg create --build-type ament_cmake 包名 --dependencies rclcpp std_msgs
# 创建Python功能包
ros2 pkg create --build-type ament_python 包名 --dependencies rclpy std_msgs
# 列出所有已安装的功能包
ros2 pkg list
# 查看功能包的安装路径
ros2 pkg prefix 包名
# 列出功能包的所有可执行文件
ros2 pkg executables 包名

4.8 编译与运行

# 工作空间全量编译(工作空间根目录执行)
colcon build
# 仅编译指定功能包
colcon build --packages-select 包名1 包名2
# Python开发专用:软链接安装,修改代码无需重新编译
colcon build --symlink-install
# 编译时忽略指定包
colcon build --packages-ignore 包名
# 运行单个节点
ros2 run 包名 可执行文件
# 运行launch文件(批量启动节点)
ros2 launch 包名 launch文件.py

4.9 数据录制与回放

# 录制指定话题数据
ros2 bag record /话题1 /话题2
# 录制所有话题
ros2 bag record -a
# 录制到指定目录
ros2 bag record -o 录制文件名 /话题名
# 查看bag文件信息
ros2 bag info 录制文件名
# 回放bag数据
ros2 bag play 录制文件名
# 倍速回放
ros2 bag play 录制文件名 -r 0.5

4.10 系统诊断

# 系统完整性与环境检查
ros2 doctor
# 全量详细诊断报告
ros2 doctor --report
# 查看ROS2版本信息
ros2 --version

五、ROS2 标准开发全流程(C++/Python)

以「话题发布-订阅」为例,完整演示从0到1的ROS2开发流程,覆盖C++与Python双版本。

5.1 步骤1:创建工作空间与功能包

# 1. 创建工作空间与src目录
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

# 2. 创建C++功能包
ros2 pkg create --build-type ament_cmake cpp_demo --dependencies rclcpp std_msgs

# 3. 创建Python功能包
ros2 pkg create --build-type ament_python py_demo --dependencies rclpy std_msgs

# 4. 回到工作空间根目录
cd ~/ros2_ws

5.2 步骤2:编写节点代码

版本1:C++ 话题发布者与订阅者

  1. 发布者节点:cpp_demo/src/publisher_node.cpp
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

using namespace std::chrono_literals;

// 自定义发布者节点,继承rclcpp::Node
class PublisherNode : public rclcpp::Node
{
public:
    PublisherNode() : Node("cpp_publisher"), count_(0)
    {
        // 创建发布者:话题名、消息类型、QoS队列深度
        publisher_ = this->create_publisher<std_msgs::msg::String>("chatter", 10);
        // 创建定时器,100ms执行一次回调函数
        timer_ = this->create_wall_timer(
            100ms, std::bind(&PublisherNode::timer_callback, this));
    }

private:
    void timer_callback()
    {
        // 构造消息
        auto msg = std_msgs::msg::String();
        msg.data = "Hello ROS2! 计数: " + std::to_string(count_++);
        // 发布消息
        publisher_->publish(msg);
        // 打印日志
        RCLCPP_INFO(this->get_logger(), "发布: %s", msg.data.c_str());
    }

    // 成员变量声明
    rclcpp::TimerBase::SharedPtr timer_;
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
    size_t count_;
};

int main(int argc, char * argv[])
{
    // 初始化ROS2
    rclcpp::init(argc, argv);
    // 运行节点,阻塞等待
    rclcpp::spin(std::make_shared<PublisherNode>());
    // 关闭ROS2,释放资源
    rclcpp::shutdown();
    return 0;
}
  1. 订阅者节点:cpp_demo/src/subscriber_node.cpp
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

class SubscriberNode : public rclcpp::Node
{
public:
    SubscriberNode() : Node("cpp_subscriber")
    {
        // 创建订阅者:话题名、QoS、回调函数
        subscriber_ = this->create_subscription<std_msgs::msg::String>(
            "chatter", 10, std::bind(&SubscriberNode::topic_callback, this, std::placeholders::_1));
    }

private:
    void topic_callback(const std_msgs::msg::String & msg) const
    {
        // 收到消息后的处理,打印日志
        RCLCPP_INFO(this->get_logger(), "收到: %s", msg.data.c_str());
    }

    rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscriber_;
};

int main(int argc, char * argv[])
{
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<SubscriberNode>());
    rclcpp::shutdown();
    return 0;
}
  1. 配置cpp_demo/CMakeLists.txt,添加以下内容到ament_package()之前:
# 添加可执行文件
add_executable(publisher_node src/publisher_node.cpp)
add_executable(subscriber_node src/subscriber_node.cpp)

# 链接依赖库
ament_target_dependencies(publisher_node rclcpp std_msgs)
ament_target_dependencies(subscriber_node rclcpp std_msgs)

# 安装可执行文件到install目录
install(TARGETS
  publisher_node
  subscriber_node
  DESTINATION lib/${PROJECT_NAME})

版本2:Python 话题发布者与订阅者

  1. 发布者节点:py_demo/py_demo/publisher_node.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class PublisherNode(Node):
    def __init__(self):
        super().__init__('py_publisher')
        # 创建发布者
        self.publisher_ = self.create_publisher(String, 'chatter', 10)
        # 创建定时器,0.1s执行一次
        self.timer = self.create_timer(0.1, self.timer_callback)
        self.count = 0

    def timer_callback(self):
        # 构造并发布消息
        msg = String()
        msg.data = f'Hello ROS2! 计数: {self.count}'
        self.publisher_.publish(msg)
        # 打印日志
        self.get_logger().info(f'发布: {msg.data}')
        self.count += 1

def main(args=None):
    rclpy.init(args=args)
    # 创建节点
    publisher_node = PublisherNode()
    # 运行节点
    rclpy.spin(publisher_node)
    # 释放资源
    publisher_node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()
  1. 订阅者节点:py_demo/py_demo/subscriber_node.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class SubscriberNode(Node):
    def __init__(self):
        super().__init__('py_subscriber')
        # 创建订阅者
        self.subscriber_ = self.create_subscription(
            String, 'chatter', self.topic_callback, 10)

    def topic_callback(self, msg):
        # 收到消息后的处理
        self.get_logger().info(f'收到: {msg.data}')

def main(args=None):
    rclpy.init(args=args)
    subscriber_node = SubscriberNode()
    rclpy.spin(subscriber_node)
    subscriber_node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()
  1. 配置py_demo/setup.py,修改entry_points字段:
entry_points={
    'console_scripts': [
        'publisher_node = py_demo.publisher_node:main',
        'subscriber_node = py_demo.subscriber_node:main',
    ],
},

5.3 步骤3:编译与环境生效

# 回到工作空间根目录
cd ~/ros2_ws

# 全量编译,Python开发添加--symlink-install
colcon build --symlink-install

# 生效工作空间环境
source install/setup.bash

5.4 步骤4:运行与测试

# 终端1:运行C++发布者
ros2 run cpp_demo publisher_node

# 终端2:运行C++订阅者
ros2 run cpp_demo subscriber_node

# 终端3:运行Python发布者
ros2 run py_demo publisher_node

# 终端4:运行Python订阅者
ros2 run py_demo subscriber_node

可看到不同语言、不同节点之间,通过话题实现了无缝通信。

5.5 进阶:Launch文件批量启动

ROS2推荐使用Python编写launch文件,实现批量启动节点、配置参数、设置命名空间、管理节点生命周期,替代手动逐个启动节点。

  1. 创建launch目录:mkdir -p ~/ros2_ws/src/cpp_demo/launch
  2. 编写launch文件:cpp_demo/launch/demo_launch.py
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    # 声明节点
    cpp_publisher = Node(
        package='cpp_demo',
        executable='publisher_node',
        name='my_cpp_publisher',  # 重映射节点名
        output='screen'  # 日志输出到终端
    )

    py_subscriber = Node(
        package='py_demo',
        executable='subscriber_node',
        name='my_py_subscriber',
        output='screen'
    )

    # 返回启动描述,包含所有要启动的节点
    return LaunchDescription([
        cpp_publisher,
        py_subscriber
    ])
  1. 配置cpp_demo/CMakeLists.txt,添加launch文件安装规则:
# 安装launch文件
install(DIRECTORY launch
  DESTINATION share/${PROJECT_NAME})
  1. 重新编译并运行launch文件:
cd ~/ros2_ws
colcon build
source install/setup.bash
# 运行launch文件,一键启动两个节点
ros2 launch cpp_demo demo_launch.py

六、ROS2 进阶核心特性

6.1 生命周期节点(Lifecycle Node)

为节点提供标准化的状态管理,解决ROS1节点启动顺序混乱、初始化失败无容错、异常无法优雅关闭的问题。

  • 核心状态:Unconfigured(未配置)→ Inactive(已配置)→ Active(激活,正常运行)→ Inactive(去激活)→ Finalized(关闭)。
  • 核心回调:on_configure(配置)、on_activate(激活)、on_deactivate(去激活)、on_cleanup(清理)、on_shutdown(关闭)。
  • 适用场景:传感器驱动、机械臂控制、工业机器人等需要严格启停顺序与故障容错的场景。

6.2 节点组合(Composition)

将多个节点编译为共享库组件,在同一个进程中加载运行,彻底消除进程间通信的序列化/反序列化开销,大幅提升系统性能,降低延迟。

  • 适用场景:嵌入式设备、高性能实时控制、多节点密集型系统。
  • 核心优势:低延迟、低CPU占用、高效内存使用,支持运行时动态加载/卸载节点。

6.3 多机通信配置

ROS2原生支持多机分布式通信,无需中心化Master,配置极简:

  1. 前提条件:所有设备处于同一局域网,关闭防火墙,ROS_LOCALHOST_ONLY=0
  2. 核心配置:所有设备设置相同的ROS_DOMAIN_ID,如export ROS_DOMAIN_ID=42
  3. 验证:设备A运行talker,设备B运行listener,可自动发现并通信,无需额外配置。
  4. 进阶优化:通过DDS配置文件调整发现机制、传输带宽、优先级,适配复杂网络环境。

6.4 TF2 坐标变换

ROS2的坐标变换系统,用于管理机器人各个连杆、传感器、世界坐标系之间的位置与姿态关系,是机器人导航、运动规划、视觉感知的基础。

  • 核心功能:发布静态/动态坐标变换、监听坐标变换、坐标系之间的点/向量转换、时间同步。
  • 核心工具:tf2_rosstatic_transform_publisher(静态坐标发布)、tf2_monitor(坐标变换监控)、rviz2 TF可视化。

6.5 SROS2 安全机制

ROS2的原生安全层,基于DDS安全标准实现,为机器人系统提供工业级安全保障:

  • 核心能力:身份认证(节点身份校验,防止非法节点接入)、数据加密(话题/服务数据端到端加密,防止窃听)、访问控制(精细化权限管理,限制节点的发布/订阅/调用权限)、日志审计。
  • 适用场景:工业机器人、医疗机器人、商用服务机器人、跨公网通信的机器人系统。

6.6 实时性优化

ROS2原生支持硬实时,可实现μs级的控制延迟抖动,适配工业实时控制场景:

  1. 系统层面:安装Linux PREEMPT_RT实时补丁内核,配置实时权限。
  2. ROS2层面:配置DDS实时传输策略、线程优先级、内存锁定,避免内存换页。
  3. 开发层面:使用实时安全的API,避免在实时线程中使用动态内存分配、阻塞调用、系统调用。

七、ROS2 主流生态与工具链

ROS2拥有完善的机器人开发生态,覆盖从仿真、感知、规划、控制到调试的全流程,核心工具与框架如下:

7.1 可视化工具

  • RViz2:ROS2核心3D可视化工具,可可视化机器人模型、传感器数据(点云、图像、激光雷达)、导航路径、TF坐标变换、地图等,是机器人开发调试的核心工具。
  • RQt:Qt框架开发的可视化工具集,包含rqt_graph(节点关系图)、rqt_plot(数据曲线绘制)、rqt_console(日志查看与过滤)、rqt_image_view(图像可视化)等插件,无需编程即可快速调试系统。

7.2 仿真工具

  • Gazebo Harmonic(Ignition):新一代机器人仿真平台,与ROS2深度集成,支持高精度物理仿真、传感器仿真、多机器人仿真、环境建模,是机器人算法验证、虚拟测试的核心工具,替代老旧的Gazebo Classic。

7.3 核心应用框架

  • Navigation2(Nav2):ROS2官方导航栈,替代ROS1的navigation,基于行为树、生命周期节点、插件化设计,支持全局路径规划、局部避障、定位、路径跟随、自主充电等功能,是移动机器人自主导航的首选方案。
  • MoveIt2:ROS2官方机械臂运动规划框架,替代ROS1的MoveIt,支持运动学求解、碰撞检测、轨迹规划、避障、力控,适配绝大多数工业机械臂与协作机器人。
  • ROS2 Control:ROS2官方机器人控制框架,替代ROS1的ros_control,提供标准化的硬件抽象、控制器管理、实时控制接口,适配移动机器人底盘、机械臂、舵机、电机等执行器。
  • SLAM Toolbox:ROS2主流2D激光SLAM框架,替代ROS1的gmapping、cartographer,支持建图、地图保存、定位、回环检测,是移动机器人建图的首选方案。

7.4 调试与测试工具

  • ros2 bag:数据录制与回放工具,可记录机器人运行过程中的所有话题数据,用于离线调试、算法验证、问题复现。
  • ros2 doctor:系统诊断工具,快速定位环境配置、依赖、网络、通信等问题。
  • GDB/Valgrind:C++节点调试与内存检测工具,解决程序崩溃、内存泄漏问题。
  • ros2 test:ROS2原生测试框架,支持单元测试、集成测试,保障代码质量。

八、ROS1→ROS2 迁移与兼容方案

8.1 核心迁移要点

  1. 编译系统:从catkin_make迁移到colcon,构建规则从catkin迁移到ament_cmake/ament_python。
  2. API重构:ROS2的C++/Python API完全重构,需重新编写节点代码,核心逻辑可复用,通信相关代码需适配rclcpp/rclpy接口。
  3. 通信机制:话题、服务、动作的定义方式不变,需适配QoS配置,动作从actionlib迁移到ROS2原生action接口。
  4. 参数管理:从中心化参数服务器迁移到节点级参数,修改参数读写代码。
  5. 启动文件:从roslaunch XML文件迁移到ROS2 Python launch文件。

8.2 兼容方案:ros1_bridge

对于无法一次性完成迁移的系统,可使用ros1_bridge实现ROS1与ROS2的双向通信,支持话题、服务、动作的桥接,实现平滑过渡:

  1. 同时安装ROS1与ROS2环境,编译ros1_bridge。
  2. 分别启动ROS1的roscore与ROS2节点。
  3. 运行ros1_bridge,自动实现双向话题桥接,无需额外配置。

九、高频踩坑与避坑指南

9.1 环境与编译类问题

  1. 命令找不到/节点找不到:90%是因为没有source工作空间的setup.bash,每次编译后必须source,或写入bashrc永久生效。
  2. colcon编译失败:优先执行rosdep install --from-paths src --ignore-src -r -y安装缺失依赖;检查CMakeLists.txt/setup.py的依赖声明是否完整。
  3. Python代码修改后不生效:编译时必须添加--symlink-install参数,创建软链接,避免每次修改都重新编译。
  4. 功能包不被ROS2识别:检查package.xml是否存在且格式正确,编译后必须source install目录。

9.2 通信类问题

  1. 话题能看到但echo不到数据:90%是QoS不匹配,发布者与订阅者的QoS配置不兼容,使用ros2 topic info /话题名 -v查看两端QoS,统一配置即可解决。
  2. 多机通信无法发现节点:检查是否同一网段、防火墙是否关闭、ROS_DOMAIN_ID是否完全一致、ROS_LOCALHOST_ONLY是否设为0。
  3. 服务调用无响应:检查服务端是否正常运行,客户端与服务端的服务类型是否完全一致,网络是否互通。

9.3 其他高频问题

  1. 中文日志乱码:执行export LC_ALL=zh_CN.UTF-8,并将终端编码设置为UTF-8。
  2. 串口/USB设备权限不足:执行sudo chmod 666 /dev/ttyUSB0临时解决,永久解决需编写udev规则配置设备权限。
  3. 节点启动顺序混乱:使用生命周期节点管理节点状态,或在launch文件中配置节点启动顺序与依赖关系。
  4. RViz2无法可视化数据:检查header.frame_id是否正确,TF坐标变换是否正常发布,时间戳是否同步。

十、学习资源与进阶路线

10.1 官方核心资源

  • ROS2官方文档:https://docs.ros.org/ (最权威、最全面的教程与API文档)
  • ROS2官方教程:https://docs.ros.org/en/humble/Tutorials.html (从零开始的入门到进阶教程)
  • ROS2 GitHub仓库:https://github.com/ros2 (源码、issue、最新特性)

10.2 优质书籍

  • 《ROS2机器人编程实战》
  • 《机器人操作系统ROS2原理与应用》
  • 《ROS2入门与实战》(古月居)

10.3 社区与问答

  • ROS Discourse:https://discourse.ros.org/ (官方社区,最新动态、技术讨论)
  • ROS Answers:https://answers.ros.org/ (官方问答平台,解决开发问题)
  • 国内社区:古月居、鱼香ROS、CSDN ROS2专区

10.4 进阶学习路线

  1. 入门阶段:环境搭建→核心概念理解→CLI命令熟练→简单节点开发→话题/服务通信。
  2. 进阶阶段:自定义接口开发→launch文件编写→TF坐标变换→仿真环境搭建→常用工具使用。
  3. 实战阶段:Nav2导航/MoveIt2运动规划→SLAM建图→ROS2 Control硬件控制→多机分布式系统开发。
  4. 精通阶段:DDS深度配置→实时性优化→SROS2安全机制→节点组合性能优化→工业级系统部署。