ROS2 从零到一完整学习
一、前置总览
1. ROS2 是什么
ROS2 = Robot Operating System 2,机器人开发中间件,不是真正操作系统,运行在 Linux(主力 Ubuntu)上。 作用:统一机器人硬件驱动、传感器通信、算法调度、仿真、上位机交互,支持机械臂、移动小车、人形机器人、自动驾驶。 对比 ROS1:抛弃 Master 单点故障,采用 DDS 分布式通信,支持多机、实时性、嵌入式(Jetson / 单片机)。
2. 必备环境
- 系统:Ubuntu 22.04 LTS → 匹配 ROS2 Humble Hawksbill(长期支持,推荐新手)
- 硬件可选:电脑虚拟机 / 双系统 / Jetson 开发板
- 基础前置知识
- Linux 基础命令(cd ls mkdir chmod apt 进程操作)
- C++ / Python 二选一(新手优先 Python 入门,工程用 C++)
- 基础面向对象编程
- 简单计算机概念:进程、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 结果 适用:导航、机械臂运动、轨迹追踪(任务执行时间长,需要实时进度)
配套核心概念
- Message 消息:话题 / 服务 /action 的数据格式,自带官方标准库
- Package 功能包:ROS2 代码存放单元,所有代码按包管理
- Workspace 工作空间:统一存放自己写的所有功能包,目录结构
colcon_ws/src/ - 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:项目实战学习顺序(由浅到深)
- 基础通信:话题、服务、Action 全套手写 Demo
- 机器人模型 URDF/XACRO:描述机器人连杆、关节、传感器
- Gazebo 仿真小车:差速底盘、激光雷达、相机驱动
- SLAM 建图:cartographer /slam_toolbox 构建环境地图
- Navigation2 导航框架:路径规划、避障、自主巡航(ROS2 最核心工程模块)
- 机械臂控制:MoveIt2 运动规划、抓取仿真
- 多机通信:两台电脑 ROS2 分布式协同
- 嵌入式部署: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
十一 、从零运行完整流程(复制按顺序执行)
- 创建工作空间
mkdir -p ~/colcon_ws/src
cd ~/colcon_ws/src
- 创建 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代码
- 修改同目录 setup.py 注册程序入口
- 创建 launch 文件夹,放入 launch 启动文件
mkdir launch
# 写入talker_listener.launch.py
- 返回工作空间根目录编译
cd ~/colcon_ws
colcon build
source install/setup.bash
- 两种运行方式
- 分开两个终端:
# 终端1
ros2 run my_py_pkg talker
# 终端2
ros2 run my_py_pkg listener
- 一键 launch 启动:
ros2 launch my_py_pkg talker_listener.launch.py
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)