Linux 上的 ROS 2 系统入门教程从安装到第一个发布/订阅节点本文面向第一次接触 ROS 2 的 Linux 用户。环境以Ubuntu 24.04 LTS ROS 2 Jazzy Jalisco为主因为 Jazzy 是 ROS 2 的长期支持版本适合学习、比赛、课程项目和较长期的机器人开发。资料核对日期2026-04-11。1. ROS 2 是什么ROS 2全称 Robot Operating System 2。它不是传统意义上的“操作系统”更像是一套机器人软件开发框架它帮我们处理节点通信、消息传递、参数管理、启动编排、传感器数据记录、坐标变换、工具可视化等问题。如果你做过单片机或普通 Linux 应用可以把 ROS 2 理解成机器人软件里的“中间层”传感器程序负责采集数据比如相机、雷达、IMU。算法程序负责处理数据比如定位、建图、路径规划。控制程序负责驱动硬件比如电机、机械臂、底盘。ROS 2 负责把这些程序组织起来让它们用统一方式通信。下面是一张简化示意图/image/scan/map /tf/cmd_vel相机节点DDS 通信层雷达节点建图/定位节点导航节点底盘控制节点ros2 命令行工具看懂这张图就够了ROS 2 的核心不是“把所有代码写到一个程序里”而是把机器人拆成多个节点让节点之间通过 Topic、Service、Action 等机制协作。2. 版本怎么选截至 2026-04-11ROS 2 官方文档中Jazzy Jalisco 是适合 Ubuntu 24.04 的长期支持版本。Kilted Kaiju 是更新的版本适合跟进新特性但如果你是教学、就业准备、课程项目或希望环境稳定优先选 Jazzy。常见选择如下Ubuntu 版本推荐 ROS 2 版本适合场景Ubuntu 24.04 LTSJazzy Jalisco推荐。长期学习、教学、项目开发Ubuntu 24.04 LTSKilted Kaiju想跟进更新特性的用户Ubuntu 22.04 LTSHumble Hawksbill老项目维护、已有课程环境本文后续命令全部使用Jazzy。如果你安装的是其他发行版把命令中的jazzy换成对应版本名即可例如humble或kilted但要确认 Ubuntu 版本匹配。3. 安装前准备打开终端先确认系统版本lsb_release-a建议输出中能看到Ubuntu 24.04再更新一下软件包索引sudoaptupdate如果你是刚安装的 Ubuntu也建议执行一次sudoaptupgrade这一步可能需要一些时间正常等待即可。4. 设置系统语言环境ROS 2 官方安装文档建议系统使用支持 UTF-8 的 locale。执行locale如果没有看到UTF-8可以按下面方式设置sudoaptupdatesudoaptinstalllocalessudolocale-gen en_US en_US.UTF-8sudoupdate-localeLC_ALLen_US.UTF-8LANGen_US.UTF-8exportLANGen_US.UTF-8 locale很多新手会忽略这一步后面安装或运行 Python 节点时遇到编码问题。提前设置好会省不少事。5. 配置 ROS 2 软件源先安装基础工具并启用 Ubuntu 的 universe 仓库sudoaptinstallsoftware-properties-commonsudoadd-apt-repository universesudoaptupdatesudoaptinstallcurl然后安装 ROS 2 官方 apt 源配置包exportROS_APT_SOURCE_VERSION$(curl-shttps://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest|grep-Ftag_name|awk-F\{print $4})curl-L-o/tmp/ros2-apt-source.debhttps://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(./etc/os-releaseecho$VERSION_CODENAME)_all.debsudodpkg-i/tmp/ros2-apt-source.deb安装完成后更新索引sudoaptupdate如果这一步下载很慢通常是网络访问 GitHub 或软件源速度不稳定。建议先保证系统能正常访问官方源再继续安装。6. 安装 ROS 2 Jazzy推荐初学者安装桌面版它包含常用命令、示例、RViz 等工具sudoaptinstallros-jazzy-desktop再安装开发常用工具sudoaptinstallros-dev-tools安装完成后在当前终端加载 ROS 2 环境source/opt/ros/jazzy/setup.bash为了以后每次打开终端都自动加载可以写入.bashrcechosource /opt/ros/jazzy/setup.bash~/.bashrc让配置立即生效source~/.bashrc检查是否安装成功ros2--help如果能看到 ROS 2 的命令帮助就说明基础环境已经装好了。7. 运行官方 Talker/Listener 示例ROS 2 最经典的入门示例是 talker 和 listener。它们展示的是 Topic 通信talker发布消息。listener订阅消息。Topic消息通道。打开第一个终端运行ros2 run demo_nodes_cpp talker再打开第二个终端运行ros2 run demo_nodes_py listener你会看到 listener 持续收到 talker 发出的字符串消息。可以再打开第三个终端观察当前 Topicros2 topic list再查看/chatter的实时内容ros2 topicecho/chatter这就是 ROS 2 最基本的通信模型发布 std_msgs/String订阅talker 节点Topic: /chatterlistener 节点ros2 topic echo8. ROS 2 里最常见的几个概念学习 ROS 2 时不要一开始就把所有工具都背下来。先掌握下面几个概念就能开始写程序。概念作用类比Node节点一个独立运行的功能单元一个小程序Topic话题用于连续数据发布/订阅广播频道Message消息Topic 里传输的数据类型数据结构Service服务用于一次请求、一次响应函数调用Action动作用于可取消、可反馈的长任务带进度条的任务Parameter参数运行时配置节点行为配置项Launch启动文件一次拉起多个节点启动脚本TF坐标变换系统机器人各坐标系关系rosbag数据录制与回放黑匣子/日志回放最常用的命令也可以先记这一组ros2nodelist ros2 topic list ros2 topicecho/chatter ros2 topic info /chatter ros2 interface show std_msgs/msg/String9. 创建自己的 ROS 2 工作空间ROS 2 项目通常放在 workspace 里。我们创建一个工作空间mkdir-p~/ros2_ws/srccd~/ros2_ws/src创建一个 Python 包ros2 pkg create --build-type ament_python py_pubsub_demo--dependenciesrclpy std_msgs目录结构大致如下ros2_ws/ └── src/ └── py_pubsub_demo/ ├── package.xml ├── setup.py ├── setup.cfg ├── resource/ ├── test/ └── py_pubsub_demo/ └── __init__.py接下来写两个节点一个发布消息一个订阅消息。10. 编写发布者节点新建文件cd~/ros2_ws/src/py_pubsub_demo/py_pubsub_demotouchpublisher_member_function.py写入下面代码importrclpyfromrclpy.nodeimportNodefromstd_msgs.msgimportStringclassMinimalPublisher(Node):def__init__(self):super().__init__(minimal_publisher)self.publisher_self.create_publisher(String,chatter,10)self.timerself.create_timer(1.0,self.timer_callback)self.count0deftimer_callback(self):msgString()msg.datafHello ROS 2:{self.count}self.publisher_.publish(msg)self.get_logger().info(fPublishing: {msg.data})self.count1defmain(argsNone):rclpy.init(argsargs)nodeMinimalPublisher()try:rclpy.spin(node)exceptKeyboardInterrupt:passnode.destroy_node()rclpy.shutdown()if__name____main__:main()这段代码做了三件事创建一个名为minimal_publisher的节点。创建一个名为chatter的 Topic 发布者。每 1 秒发布一次字符串消息。其中10是队列深度表示短时间内消息来不及处理时最多缓存多少条。初学阶段可以先按这个值写。11. 编写订阅者节点同一个目录下新建文件touchsubscriber_member_function.py写入下面代码importrclpyfromrclpy.nodeimportNodefromstd_msgs.msgimportStringclassMinimalSubscriber(Node):def__init__(self):super().__init__(minimal_subscriber)self.subscriptionself.create_subscription(String,chatter,self.listener_callback,10,)deflistener_callback(self,msg):self.get_logger().info(fI heard: {msg.data})defmain(argsNone):rclpy.init(argsargs)nodeMinimalSubscriber()try:rclpy.spin(node)exceptKeyboardInterrupt:passnode.destroy_node()rclpy.shutdown()if__name____main__:main()订阅者的核心是create_subscription()。它订阅chatter只要收到String类型消息就调用listener_callback()。12. 修改 setup.py回到包目录cd~/ros2_ws/src/py_pubsub_demo打开setup.py找到entry_points改成类似下面这样entry_points{console_scripts:[talker py_pubsub_demo.publisher_member_function:main,listener py_pubsub_demo.subscriber_member_function:main,],},这一步的作用是把 Python 文件注册成 ROS 2 可执行命令。后面就可以通过ros2 run py_pubsub_demo talker来运行发布者节点。13. 编译并运行自己的节点回到工作空间根目录cd~/ros2_ws编译colcon build加载当前工作空间sourceinstall/setup.bash打开第一个终端运行发布者ros2 run py_pubsub_demo talker打开第二个终端记得也加载工作空间cd~/ros2_wssourceinstall/setup.bash ros2 run py_pubsub_demo listener如果一切正常listener 会持续输出I heard: Hello ROS 2: 0 I heard: Hello ROS 2: 1 I heard: Hello ROS 2: 2到这里你已经完成了一个最小 ROS 2 应用两个节点通过 Topic 通信。14. 调试用命令行看懂系统状态运行节点时可以再开一个终端执行ros2nodelist预期能看到/minimal_publisher /minimal_subscriber查看 Topicros2 topic list查看 Topic 类型ros2 topic info /chatter查看消息定义ros2 interface show std_msgs/msg/String查看实时消息ros2 topicecho/chatter这些命令很重要。刚开始写 ROS 2 程序时不要只盯着代码。节点有没有启动、Topic 名字是否一致、消息类型是否一致都可以用这些命令快速确认。15. source 命令为什么这么重要ROS 2 新手最常见的问题之一是明明编译成功ros2 run却找不到包。原因通常是没有加载环境。ROS 2 有两层常见环境source/opt/ros/jazzy/setup.bash这一层加载系统安装的 ROS 2。source~/ros2_ws/install/setup.bash这一层加载你自己的工作空间。如果你打开了新终端只加载了/opt/ros/jazzy/setup.bash但没有加载~/ros2_ws/install/setup.bash系统就不知道你的py_pubsub_demo在哪里。开发时可以养成习惯cd~/ros2_wssourceinstall/setup.bash再运行自己的包。16. 常见问题排查16.1 ros2: command not found说明 ROS 2 环境没有加载。执行source/opt/ros/jazzy/setup.bash如果想每次打开终端自动加载echosource /opt/ros/jazzy/setup.bash~/.bashrcsource~/.bashrc16.2 colcon: command not found说明开发工具没装sudoaptinstallros-dev-tools16.3 ros2 run 找不到自己的包先确认是否编译cd~/ros2_ws colcon build再确认是否加载工作空间sourceinstall/setup.bash如果还是找不到检查setup.py的console_scripts是否写对文件名和函数名是否一致。16.4 两个终端互相收不到消息先确认 Topic 名称一致ros2 topic list再确认消息类型一致ros2 topic info /chatter如果是在多台机器通信还要检查防火墙、网络、DDS 配置和ROS_DOMAIN_ID是否一致。单机学习时通常不需要改这些。16.5 终端状态怪怪的可以重启 ROS 2 daemonros2 daemon stop ros2 daemon start再重新打开终端运行。17. 总结ROS 2 的入门关键不是记住所有命令而是理解它的组织方式机器人系统由一个个节点组成节点之间通过 Topic、Service、Action 等机制通信。本文从 Ubuntu 24.04 上安装 ROS 2 Jazzy 开始跑通官方 talker/listener再写了一个自己的 Python 发布/订阅示例。把这条线跑通后你再去学导航、建图、机械臂、视觉就不会觉得 ROS 2 是一堆散乱命令而是一套可以逐步扩展的机器人软件框架。