一、前置总览

1. ROS2 是什么

ROS2 = Robot Operating System 2,机器人开发中间件,不是真正操作系统,运行在 Linux(主力 Ubuntu)上。 作用:统一机器人硬件驱动、传感器通信、算法调度、仿真、上位机交互,支持机械臂、移动小车、人形机器人、自动驾驶。 对比 ROS1:抛弃 Master 单点故障,采用 DDS 分布式通信,支持多机、实时性、嵌入式(Jetson / 单片机)。

2. 必备环境

  • 系统:Ubuntu 22.04 LTS → 匹配 ROS2 Humble Hawksbill(长期支持,推荐新手)
  • 硬件可选:电脑虚拟机 / 双系统 / Jetson 开发板
  • 基础前置知识
    1. Linux 基础命令(cd ls mkdir chmod apt 进程操作)
    2. C++ / Python 二选一(新手优先 Python 入门,工程用 C++)
    3. 基础面向对象编程
    4. 简单计算机概念:进程、IP、网络通信

二、阶段 1:环境安装(第一步实操)

1. Ubuntu 22.04 安装 Humble

步骤 1 设置软件源

sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

添加 ROS2 源密钥

sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

步骤 2 安装完整桌面版(带仿真、RViz、示例)

sudo apt update
sudo apt install ros-humble-desktop

步骤 3 环境变量配置(必须配置,否则终端找不到 ros2 命令)

临时生效(当前终端)

source /opt/ros/humble/setup.bash

永久生效(每次打开终端自动加载)

gedit ~/.bashrc
# 文件末尾添加
source /opt/ros/humble/setup.bash
# 保存关闭,生效
source ~/.bashrc

步骤 4 测试安装是否成功

新开终端运行示例 talker/listener(发布订阅经典 demo) 终端 1(发布者)

ros2 run demo_nodes_cpp talker

终端 2(订阅者)

ros2 run demo_nodes_py listener

能看到文字互相打印 = 环境安装成功。

补充工具安装(开发必备)

sudo apt install ros-dev-tools
# colcon编译工具、rosdep依赖管理、bag录制工具等

三、阶段 2:核心基础概念(ROS2 四大通信核心,重中之重)

ROS2 所有程序基于节点 (Node) 通信,一套分布式模型:

1. Node 节点

最小执行单元,一个功能程序就是一个节点。 例:相机驱动节点、激光雷达节点、路径规划节点、电机控制节点。 命令:ros2 run 包名 节点名

2. Topic 话题(最常用,单向数据流)

发布者 (Publisher) → 话题通道 → 订阅者 (Subscriber) 适用场景:传感器数据持续输出(图像、雷达、速度) 数据载体:Message 消息(固定数据结构,std_msgs、sensor_msgs)

常用话题调试命令

# 查看所有话题
ros2 topic list
# 打印话题实时数据
ros2 topic echo /话题名
# 查看话题消息类型
ros2 topic type /话题名
# 手动发布一条数据
ros2 topic pub /chatter std_msgs/msg/String "{data: 'hello'}"

3. Service 服务(请求 - 应答,同步通信)

客户端 Client 发请求 → 服务端 Server 处理 → 返回结果 适用:单次交互,拍照、开关设备、单次坐标请求

服务调试命令

ros2 service list
ros2 service call /服务名 消息类型 "{参数}"

4. Action 动作(带反馈的长耗时任务)

Goal 目标 → 持续 Feedback 实时反馈 → 最终 Result 结果 适用:导航、机械臂运动、轨迹追踪(任务执行时间长,需要实时进度)

配套核心概念

  1. Message 消息:话题 / 服务 /action 的数据格式,自带官方标准库
  2. Package 功能包:ROS2 代码存放单元,所有代码按包管理
  3. Workspace 工作空间:统一存放自己写的所有功能包,目录结构 colcon_ws/src/
  4. DDS:底层通信协议,负责多节点跨进程 / 跨电脑数据传输

四、阶段 3:自建工作空间 + 编译工具 colcon

1. 创建工作空间

mkdir -p ~/colcon_ws/src
cd ~/colcon_ws/src

所有自定义包都放在 src 文件夹内。

2. 创建功能包(两种语言)

Python 包(新手推荐)

ros2 pkg create --build-type ament_python my_py_pkg --dependencies rclpy std_msgs
  • rclpy:ROS2 Python 客户端库
  • std_msgs:标准消息库

C++ 包(工程开发)

ros2 pkg create --build-type ament_cmake my_cpp_pkg --dependencies rclcpp std_msgs

3. 编译工作空间

回到 ws 根目录编译

cd ~/colcon_ws
colcon build

编译完成后生成 install、build、log 文件夹。

4. 刷新环境变量,让系统识别自己写的包

source install/setup.bash
# 永久添加到bashrc
echo "source ~/colcon_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

五、阶段 4:手写第一个程序(Python 发布订阅实操)

1. 编写发布者

进入 py 包文件夹 my_py_pkg/my_py_pkg/,新建 talker.py

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class TalkerNode(Node):
    def __init__(self):
        super().__init__("talker")
        # 创建发布者,话题名chatter,消息类型String,队列长度10
        self.pub = self.create_publisher(String, "chatter", 10)
        # 定时器 0.5s 发一次
        self.timer = self.create_timer(0.5, self.timer_cb)
        self.count = 0

    def timer_cb(self):
        msg = String()
        msg.data = f"Hello ROS2 count:{self.count}"
        self.pub.publish(msg)
        self.get_logger().info(f"发布:{msg.data}")
        self.count += 1

def main():
    rclpy.init()
    node = TalkerNode()
    rclpy.spin(node) # 循环监听节点回调
    rclpy.shutdown()

if __name__ == "__main__":
    main()

2. 编写订阅者 listener.py

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class ListenerNode(Node):
    def __init__(self):
        super().__init__("listener")
        self.sub = self.create_subscription(
            String,
            "chatter",
            self.sub_cb,
            10
        )
    def sub_cb(self, msg):
        self.get_logger().info(f"收到消息:{msg.data}")

def main():
    rclpy.init()
    node = ListenerNode()
    rclpy.spin(node)
    rclpy.shutdown()

if __name__ == "__main__":
    main()

3. 配置入口:修改包内 setup.py

找到 entry_points,修改:

entry_points={
    'console_scripts': [
        'talker = my_py_pkg.talker:main',
        'listener = my_py_pkg.listener:main'
    ],
},

4. 编译运行

cd ~/colcon_ws
colcon build
source install/setup.bash
# 终端1
ros2 run my_py_pkg talker
# 终端2
ros2 run my_py_pkg listener

双向通信跑通,完成第一个 ROS2 程序。

六、阶段 5:进阶核心知识点(按学习顺序)

1. 消息类型进阶

  • std_msgs:基础类型 String、Int32、Bool
  • geometry_msgs:机器人运动 Twist (速度)、Pose (位姿)
  • sensor_msgs:图像 Image、激光雷达 LaserScan、IMU 可视化工具:ros2 interface show 消息类型 查看消息内部结构

2. 参数 Parameter

节点动态配置参数,不用改代码重启,调机器人参数必备

# 查看参数
ros2 param list /节点名
# 设置参数
ros2 param set /节点名 参数名 值

3. Launch 文件(批量启动多节点)

手动开 N 个终端启动节点太麻烦,launch 一次性启动多个发布 / 订阅 / 驱动节点,支持参数配置、命名空间、条件启动。 后缀 .launch.py,启动命令:

ros2 launch 包名 xxx.launch.py

4. ROS2 Bag 数据录制回放

记录传感器话题数据,离线调试算法

# 录制所有话题
ros2 bag record -a
# 回放数据包
ros2 bag play xxx.db3

5. RViz2 可视化工具

机器人可视化核心:显示雷达点云、相机图像、机器人模型、轨迹地图,调试感知导航必备

rviz2

6. Gazebo 仿真环境

虚拟机器人仿真,无实体硬件也能开发小车 / 机械臂,加载物理环境、传感器

gazebo

七、阶段 6:项目实战学习顺序(由浅到深)

  1. 基础通信:话题、服务、Action 全套手写 Demo
  2. 机器人模型 URDF/XACRO:描述机器人连杆、关节、传感器
  3. Gazebo 仿真小车:差速底盘、激光雷达、相机驱动
  4. SLAM 建图:cartographer /slam_toolbox 构建环境地图
  5. Navigation2 导航框架:路径规划、避障、自主巡航(ROS2 最核心工程模块)
  6. 机械臂控制:MoveIt2 运动规划、抓取仿真
  7. 多机通信:两台电脑 ROS2 分布式协同
  8. 嵌入式部署:Jetson Orin/Nano 部署 ROS2 实时机器人程序

八、阶段 7:常用排错命令(开发高频)

# 查看节点
ros2 node list
# 查看节点信息(发布/订阅话题)
ros2 node info /节点名
# 查看消息结构
ros2 interface show sensor_msgs/msg/LaserScan
# 查看进程占用
ps aux | grep ros
# 清理编译缓存
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
colcon clean-packages

九、ROS2 配套 Linux 必备命令速查表

1. 系统 & 软件源(安装 / 更新 ROS2)

# 更新软件源
sudo apt update && sudo apt upgrade -y
# 安装依赖工具
sudo apt install curl gnupg lsb-release software-properties-common git vim
# 查看系统版本(确认Ubuntu22.04对应Humble)
lsb_release -a
# 编辑环境变量
gedit ~/.bashrc
# 刷新环境变量
source ~/.bashrc
# 查看磁盘空间(编译大工程容易爆满)
df -h
# 解压/压缩
unzip xxx.zip
tar -zcvf out.tar.gz file1 file2
tar -zxvf out.tar.gz

2. 文件 & 目录操作(工作空间高频)

# 创建ROS标准工作空间
mkdir -p ~/colcon_ws/src
# 进入源码目录
cd ~/colcon_ws/src
# 查看目录文件
ls -l
# 删除文件夹(慎用)
rm -rf 文件夹名
# 复制文件夹
cp -r 源目录 目标目录
# 查找文件(找py/cpp代码)
find . -name "*.py"
find . -name "*.launch.py"
# 权限修复(文件无法执行)
chmod +x xxx.py

3. 进程 & 端口排错

# 查看所有ros2相关进程
ps aux | grep ros
# 强制杀掉卡死的ros进程
kill -9 进程号
# 查看端口占用(DDS通信冲突排查)
netstat -tulpn
# 清理终端输出缓存
clear

4. Git 拉取机器人源码包(Turtlebot3、Nav2 等)

git clone https://github.com/xxx/xxx.git
# 更新仓库代码
git pull
# 切换分支
git checkout humble

九、ROS2 全套核心命令速查(Node/Topic/Service/Action/Bag)

1. 节点 Node

# 运行节点
ros2 run 包名 可执行文件
# 查看所有运行节点
ros2 node list
# 查看节点详细信息(发布/订阅/服务)
ros2 node info /节点名称

2. 话题 Topic(最常用)

# 列出所有话题
ros2 topic list
# 实时打印话题数据
ros2 topic echo /话题名
# 查看话题消息类型
ros2 topic type /话题名
# 命令行手动发布单次消息
ros2 topic pub /chatter std_msgs/msg/String "{data: "test"}"
# 持续10Hz发布消息
ros2 topic pub -r 10 /chatter std_msgs/msg/String "{data: "hello"}"
# 查看话题频率
ros2 topic hz /话题名

3. 服务 Service

# 查看所有服务
ros2 service list
# 查看服务消息结构
ros2 service type /服务名
# 调用服务
ros2 service call /服务名 消息类型 "{参数键: 值}"

4. Action 动作

ros2 action list
ros2 action info /action名称
# 发送action目标
ros2 action send_goal /目标名称 消息类型 "{参数}"

5. 消息接口 Message

# 查看所有消息包
ros2 interface packages
# 查看某个包下所有消息
ros2 interface list -p sensor_msgs
# 查看消息内部字段结构
ros2 interface show sensor_msgs/msg/LaserScan

6. 参数 Parameter

# 查看某节点所有参数
ros2 param list /节点名
# 获取参数值
ros2 param get /节点名 参数名
# 设置运行时参数
ros2 param set /节点名 参数名 数值
# 保存参数到文件
ros2 param dump /节点名 --output params.yaml

7. Bag 录制回放数据集

# 录制全部话题
ros2 bag record -a
# 只录制指定话题
ros2 bag record -o my_bag /camera/image_raw /scan
# 查看bag信息
ros2 bag info my_bag
# 回放bag
ros2 bag play my_bag
# 倍速回放(0.5倍慢放)
ros2 bag play my_bag --rate 0.5

8. Colcon 编译工作空间

# 全量编译
colcon build
# 只编译单个包
colcon build --packages-select my_py_pkg
# 编译同时输出日志
colcon build --event-handlers console_direct+
# 清理编译缓存
rm -rf build install log
# 编译Release性能版本
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
# 编译后刷新环境
source install/setup.bash

9. Launch 启动多节点

# 启动launch文件
ros2 launch 包名 xxx.launch.py

10. 可视化工具

# 机器人可视化
rviz2
# 仿真环境
gazebo
# 命令行图形化工具
rqt
# 话题绘图工具
rqt_plot
# 消息查看器
rqt_tf_tree

11. TF 坐标变换(机器人底盘 / 雷达 / 相机必备)

# 查看坐标树
ros2 run rqt_tf_tree rqt_tf_tree
# 打印两坐标系变换关系
ros2 tf echo base_link laser_link
# 生成TF pdf图
ros2 tf view

十、完整可运行示例代码合集(Python)

示例 1:发布者 talker.py

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Talker(Node):
    def __init__(self):
        super().__init__("talker_node")
        self.pub = self.create_publisher(String, "chatter", 10)
        self.timer_period = 0.5
        self.timer = self.create_timer(self.timer_period, self.timer_callback)
        self.count = 0

    def timer_callback(self):
        msg = String()
        msg.data = f"ROS2 Count: {self.count}"
        self.pub.publish(msg)
        self.get_logger().info(f"发布:{msg.data}")
        self.count += 1

def main(args=None):
    rclpy.init(args=args)
    node = Talker()
    rclpy.spin(node)
    rclpy.shutdown()

if __name__ == "__main__":
    main()

示例 2:订阅者 listener.py

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Listener(Node):
    def __init__(self):
        super().__init__("listener_node")
        self.sub = self.create_subscription(
            String,
            "chatter",
            self.sub_callback,
            10
        )

    def sub_callback(self, msg):
        self.get_logger().info(f"收到数据:{msg.data}")

def main(args=None):
    rclpy.init(args=args)
    node = Listener()
    rclpy.spin(node)
    rclpy.shutdown()

if __name__ == "__main__":
    main()

示例 3:setup.py 配置入口(必须修改)

找到 entry_points 字段替换: 

entry_points={
    'console_scripts': [
        'talker = my_py_pkg.talker:main',
        'listener = my_py_pkg.listener:main',
    ],
},

示例 4:launch.py 一键启动发布 + 订阅(重点)

在包内新建 launch/talker_listener.launch.py

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    talker_node = Node(
        package="my_py_pkg",
        executable="talker",
        name="talker",
        output="screen"
    )
    listener_node = Node(
        package="my_py_pkg",
        executable="listener",
        name="listener",
        output="screen"
    )
    return LaunchDescription([
        talker_node,
        listener_node
    ])

launch 启动命令

colcon build && source install/setup.bash
ros2 launch my_py_pkg talker_listener.launch.py

十一 、从零运行完整流程(复制按顺序执行)

  1. 创建工作空间
mkdir -p ~/colcon_ws/src
cd ~/colcon_ws/src
  1. 创建 Python 功能包
ros2 pkg create --build-type ament_python my_py_pkg --dependencies rclpy std_msgs
cd my_py_pkg/my_py_pkg
# 粘贴上面talker.py、listener.py代码
  1. 修改同目录 setup.py 注册程序入口
  2. 创建 launch 文件夹,放入 launch 启动文件
mkdir launch
# 写入talker_listener.launch.py
  1. 返回工作空间根目录编译
cd ~/colcon_ws
colcon build
source install/setup.bash
  1. 两种运行方式
  • 分开两个终端:
# 终端1
ros2 run my_py_pkg talker
# 终端2
ros2 run my_py_pkg listener
  • 一键 launch 启动:
ros2 launch my_py_pkg talker_listener.launch.py
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐