摘要

本文是为机器人操作系统(ROS 2)的绝对新手准备的保姆级教程。无需任何ROS或机器人背景,我将带你从环境配置、安装、第一个程序,到经典Turtlesim项目实战,并提供清晰的4周学习路线图。只需每天1-2小时,你就能开启ROS 2开发之旅!


📝 写给完全新手的你

别担心!ROS 2 刚开始可能看起来复杂,但我会带你从零开始,一步一步学会。就像学骑自行车,先学会推车,再学会骑,最后才能玩花样。


🚀 第0步:心理准备

  • ✅ 你不需要是编程专家
  • ✅ 你不需要是机器人专家
  • ✅ 你只需要:耐心 + 好奇心
  • ⏰ 每天学习1-2小时,4周后你就能做有趣的项目了!

🖥️ 第一步:准备你的电脑(1天)

1.1 选择操作系统(三选一)

推荐选择①:最容易成功
⬤ Ubuntu 22.04 LTS (⭐最推荐,90%的ROS用户用这个)
⬤ Windows 10/11 (需要WSL2,稍复杂)
⬤ macOS (可能遇到兼容性问题)

1.2 安装Ubuntu(如果你用Windows/macOS)

方案A:Windows用户 - 安装WSL2
# 以管理员身份打开PowerShell,运行:
wsl --install -d Ubuntu-22.04
# 安装完成后,重启电脑
方案B:macOS用户
# 安装Homebrew(如果还没装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 安装Ubuntu虚拟机软件(如UTM)
方案C:直接安装Ubuntu(推荐)
  • 下载Ubuntu 22.04:官网下载
  • 制作启动U盘(用Rufus或balenaEtcher)
  • 安装到电脑(可以双系统)

📦 第二步:安装ROS 2(2小时)

2.1 跟着我一步步执行

打开终端(快捷键 Ctrl+Alt+T),逐行复制粘贴

# 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

# 2. 添加ROS 2软件源(就像在手机里添加应用商店)
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

# 3. 告诉电脑去哪里下载ROS 2
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

# 4. 安装ROS 2(这步需要一些时间,去喝杯水吧)
sudo apt update
sudo apt upgrade -y
echo "开始安装ROS 2,大约需要15-30分钟..."
sudo apt install ros-humble-desktop python3-argcomplete -y

# 5. 设置环境变量(告诉系统ROS 2在哪里)
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

# 6. 验证安装(如果看到版本号,恭喜你!)
ros2 --version
# 应该显示:ros2 版本 humble

2.2 安装成功了吗?做个简单测试

# 在终端输入:
ros2 run demo_nodes_cpp talker

你应该看到:

[INFO] [1678888888.888888]: Publishing: 'Hello World: 1'
[INFO] [1678888889.888888]: Publishing: 'Hello World: 2'
...

在这里插入图片描述

Ctrl+C 停止。如果看到这些,恭喜!安装成功!


🎮 第三步:你的第一个ROS 2程序(2小时)

3.1 创建你的工作空间(就像建一个工作室)

# 1. 创建一个专门放ROS项目的文件夹
mkdir -p ~/ros2_learning/src  # -p表示创建多级目录
cd ~/ros2_learning

# 2. 看看你创建了什么
ls -la
# 你会看到:src/ 目录

3.2 创建第一个ROS包(就像创建一个项目)

# 1. 进入src目录
cd ~/ros2_learning/src

# 2. 创建Python包(--build-type ament_python表示这是Python项目)
ros2 pkg create my_first_ros2_package --build-type ament_python --dependencies rclpy

# 3. 看看创建了什么
ls my_first_ros2_package/

你会看到:

my_first_ros2_package/
├── package.xml    # 项目信息(名字、版本等)
├── setup.py       # 安装配置
├── setup.cfg      # 更多配置
└── my_first_ros2_package/  # 真正的代码在这里
    └── __init__.py

在这里插入图片描述
在这里插入图片描述

3.3 创建你的第一个节点(节点 = 小程序)

# 1. 进入包目录
cd my_first_ros2_package/my_first_ros2_package

# 2. 创建一个Python文件
touch my_first_node.py
chmod +x my_first_node.py  # 让它可执行

# 3. 用文本编辑器打开它
# vim my_first_node.py

复制粘贴以下代码到 my_first_node.py

#!/usr/bin/env python3
# 上面这行告诉系统这是Python3程序

import rclpy  # ROS 2的Python库
from rclpy.node import Node  # 节点基类
import time

class MyFirstNode(Node):
    """
    我的第一个ROS 2节点
    这个节点会每隔1秒说一次"你好,ROS 2!"
    """
    
    def __init__(self):
        # 调用父类的初始化,给节点起名字
        super().__init__('my_first_node')
        
        # 打印欢迎信息
        self.get_logger().info('🎉 我的第一个ROS 2节点启动啦!')
        
        # 创建一个定时器,每秒调用一次say_hello函数
        self.create_timer(1.0, self.say_hello)
        
        # 计数器
        self.counter = 0
    
    def say_hello(self):
        """定时器回调函数:说你好"""
        self.counter += 1
        self.get_logger().info(f'👋 你好,ROS 2!这是第 {self.counter} 次问候')
        
        # 当说到第10次时,多说一句
        if self.counter == 10:
            self.get_logger().info('🎯 太棒了!我已经说了10次你好!')

def main(args=None):
    """
    主函数:程序的入口点
    """
    # 1. 初始化ROS 2
    rclpy.init(args=args)
    
    try:
        # 2. 创建节点实例
        node = MyFirstNode()
        
        # 3. 让节点保持运行(直到被停止)
        rclpy.spin(node)
        
    except KeyboardInterrupt:
        # 当用户按Ctrl+C时
        print('\n🛑 用户停止了程序')
    finally:
        # 4. 清理资源
        if 'node' in locals():
            node.destroy_node()
        rclpy.shutdown()
        print('🧹 程序已清理完毕')

# 这是Python的标准写法,表示如果直接运行这个文件,就执行main()
if __name__ == '__main__':
    main()

3.4 让系统认识你的程序

需要修改两个文件:

1. 修改 setup.py

cd ~/ros2_learning/src/my_first_ros2_package
vim setup.py

找到这一部分,添加 'my_first_node = my_first_ros2_package.my_first_node:main',

entry_points={
    'console_scripts': [
        'my_first_node = my_first_ros2_package.my_first_node:main',
    ],
},

2. 修改 setup.cfg

vim setup.cfg

确保内容是这样的:

[develop]
script_dir=$base/lib/my_first_ros2_package
[install]
install_scripts=$base/lib/my_first_ros2_package

🏗️ 第四步:构建和运行(1小时)

4.1 构建你的包(就像编译程序)

# 1. 回到工作空间根目录
cd ~/ros2_learning

# 2. 构建包(第一次需要一些时间)
colcon build --packages-select my_first_ros2_package

在这里插入图片描述

4.2 设置环境变量(告诉系统去哪里找你的程序)

# 每次打开新终端都需要运行(或者加到.bashrc里)
source ~/ros2_learning/install/setup.bash

4.3 运行你的第一个节点!

# 运行你的节点
ros2 run my_first_ros2_package my_first_node

🎉 你应该看到:

[INFO] [1678888888.888888] [my_first_node]: 🎉 我的第一个ROS 2节点启动啦!
[INFO] [1678888889.888888] [my_first_node]: 👋 你好,ROS 2!这是第 1 次问候
[INFO] [1678888890.888888] [my_first_node]: 👋 你好,ROS 2!这是第 2 次问候
...

在这里插入图片描述

Ctrl+C 停止程序。

4.4 看看系统里有什么

在新的终端窗口运行:

# 1. 先设置环境
source ~/ros2_learning/install/setup.bash

# 2. 看看所有正在运行的节点
ros2 node list
# 你应该看到:/my_first_node

# 3. 看看节点的详细信息
ros2 node info /my_first_node

# 4. 按q退出查看

在这里插入图片描述
在这里插入图片描述


🎪 第五步:玩转小海龟(Turtlesim)经典教程(2小时)

Turtlesim 是ROS的"Hello World",是一个可爱的小乌龟仿真器。

5.1 启动小海龟

# 打开终端1:运行小海龟仿真器
ros2 run turtlesim turtlesim_node

你会看到一个窗口,里面有一只小乌龟🐢。

5.2 控制小海龟

# 打开终端2:运行键盘控制
ros2 run turtlesim turtle_teleop_key

现在你可以:

  • 按键盘方向键 ↑ ↓ ← → 控制乌龟移动
  • GB 改变背景颜色
  • R 重置乌龟位置

5.3 查看通信情况

# 打开终端3:查看所有话题
ros2 topic list
# 你会看到:/turtle1/cmd_vel 等

# 查看乌龟位置
ros2 topic echo /turtle1/pose

# 查看按键发送的指令
ros2 topic echo /turtle1/cmd_vel

5.4 画一个正方形

# 打开终端4:创建一个画正方形的节点
cd ~/ros2_learning/src
ros2 pkg create draw_square --build-type ament_python --dependencies rclpy geometry_msgs

创建文件 draw_square/draw_square/draw_square.py

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
import time

class DrawSquare(Node):
    def __init__(self):
        super().__init__('draw_square')
        
        # 创建发布者,发布到乌龟控制话题
        self.publisher = self.create_publisher(Twist, '/turtle1/cmd_vel', 10)
        
        # 等待发布者建立连接
        time.sleep(1)
        
        self.get_logger().info('开始画正方形...')
        self.draw_square()
    
    def draw_square(self):
        """画一个正方形"""
        for i in range(4):
            # 向前走
            self.move_forward(2.0, 1.0)  # 线速度2.0,走1秒
            
            # 停止一下
            self.stop(0.5)
            
            # 右转90度
            self.turn_right(1.5, 1.0)  # 角速度1.5,转1秒
            
            # 停止一下
            self.stop(0.5)
            
        self.get_logger().info('正方形完成!')
    
    def move_forward(self, speed, duration):
        """向前移动"""
        msg = Twist()
        msg.linear.x = speed  # 线速度
        msg.angular.z = 0.0   # 角速度
        
        self.publisher.publish(msg)
        time.sleep(duration)
    
    def turn_right(self, speed, duration):
        """右转"""
        msg = Twist()
        msg.linear.x = 0.0
        msg.angular.z = -speed  # 负值表示右转
        
        self.publisher.publish(msg)
        time.sleep(duration)
    
    def stop(self, duration):
        """停止"""
        msg = Twist()
        msg.linear.x = 0.0
        msg.angular.z = 0.0
        
        self.publisher.publish(msg)
        time.sleep(duration)

def main():
    rclpy.init()
    node = DrawSquare()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

需要修改两个文件:

1. 修改 setup.py

cd ~/ros2_learning/src/draw_square
vim setup.py

找到这一部分,添加 'draw_square = draw_square.draw_square:main',

entry_points={
    'console_scripts': [
        'draw_square = draw_square.draw_square:main',
    ],
},

在这里插入图片描述

2. 修改 setup.cfg

vim setup.cfg

确保内容是这样的:

[develop]
script_dir=$base/lib/draw_square
[install]
install_scripts=$base/lib/draw_square

构建并运行:

cd ~/ros2_learning
colcon build --packages-select draw_square
source install/setup.bash
ros2 run draw_square draw_square

看!小乌龟会画一个正方形!


📚 第六步:学习路线图(4周计划)

第1周:熟悉基础(每天1-2小时)

周一:安装ROS 2(跟着上面的步骤)
周二:创建第一个节点(my_first_node)
周三:玩转Turtlesim(画正方形)
周四:学习话题(Topic)概念
周五:创建发布者和订阅者
周六:复习+做练习
周日:休息

第2周:通信机制

周一:服务(Service)通信
周二:动作(Action)通信
周三:参数(Parameter)管理
周四:使用launch文件启动多个节点
周五:自定义消息类型
周六:小项目:遥控小车
周日:休息

第3周:实用工具

周一:RViz2可视化工具
周二:TF2坐标变换
周三:rosbag2数据记录
周四:Gazebo仿真环境
周五:调试技巧和命令行工具
周六:项目:让小车在Gazebo中跑起来
周日:休息

第4周:实际项目

周一:SLAM基础(建地图)
周二:导航基础(路径规划)
周三:摄像头图像处理
周四:综合项目:自主导航小车
周五:代码优化和调试
周六:展示你的项目
周日:庆祝!

常见问题解答

Q1:我卡住了,哪里出错了?

# 1. 检查ROS 2安装
ros2 doctor

# 2. 检查环境变量
echo $ROS_DISTRO  # 应该显示:humble

# 3. 检查Python版本
python3 --version  # 应该显示:3.8或更高

Q2:我修改了代码,但运行还是旧版本?

# 需要重新构建
cd ~/ros2_learning
colcon build --packages-select 你的包名
source install/setup.bash

Q3:命令记不住怎么办?

完全正常!我刚开始也记不住。创建一个小抄:

# 常用命令小抄
ros2 node list        # 查看所有节点
ros2 topic list       # 查看所有话题
ros2 service list     # 查看所有服务
ros2 run 包名 节点名   # 运行节点
ros2 pkg create ...   # 创建包
colcon build          # 构建包

🎁 给你的小练习

练习1:改进问候程序

修改 my_first_node.py,让它:

  1. 问候语随机选择(“你好”、“嗨”、"Hello"等)
  2. 每隔5次问候,说一下当前时间

练习2:让小乌龟画个圆

创建新节点,让小乌龟画一个完美的圆形

练习3:双龟赛跑

创建两个乌龟,让它们比赛谁先到终点


💪 下一步行动

  1. 今天:完成第1-4步,运行你的第一个节点
  2. 明天:玩转Turtlesim,画正方形
  3. 本周内:完成第1周的学习计划

记住:每个人都是从零开始的。遇到问题是正常的,解决一个,你就进步一点。


希望这篇详细的ROS 2入门指南能帮助你顺利开启机器人开发之旅!如果在学习过程中遇到任何问题,欢迎在评论区留言交流,我会尽力解答。学习ROS 2就像学习一门新的语言,需要时间和实践,但一旦掌握,你将能创造出令人惊叹的机器人应用!

祝学习顺利,期待看到你的第一个ROS 2项目!🚀

Happy Coding!
你的机器人学习伙伴


#ROS2 #机器人编程 #入门教程 #Python


本文为原创内容,版权归作者所有,转载需注明出处。

Logo

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

更多推荐