ROS2 入门教程第一篇:配置 ROS2 环境
在上一篇文章里,我们已经按照官方 First Steps 梳理了 ROS2 的学习顺序:先理解基本概念,再安装 ROS 和 turtlesim,然后练习 nodes、topics、services、parameters、actions,接着学习日志、launch、rosbag,最后进入 client libraries 开始自己写节点。
这篇文章正式进入 ROS2 入门教程的第一篇:配置 ROS2 环境。
参考资料是 ROS2 Humble 官方文档中的 Configuring environment。官方给这篇教程的定位很明确:Beginner 级别,目标是在 5 分钟内学会准备 ROS2 环境。
但我不想只把它写成三条命令。因为source /opt/ros/humble/setup.bash这条命令看起来简单,背后却是 ROS2 工程里非常重要的一个概念:workspace 叠加。
一、为什么第一篇不是写节点,而是配置环境
很多人学习 ROS2 时,最想看到的是怎么写 publisher 和 subscriber。
但官方第一篇 CLI 教程不是写节点,而是配置环境。这不是偶然。
在我的“数据加工工业园区”模型里,ROS2 是一个品牌化的数据加工园区。Node 是标准工厂,topic/service/action 是物流体系,message 是标准物料箱,launch 是生产订单,rosbag 是现场留档。
那么配置 ROS2 环境是什么?
它相当于给当前终端签发“入园通行证”和“园区通讯录”。
如果你没有 source ROS2 的 setup 文件,当前终端就不知道 ROS2 园区在哪里。它找不到ros2命令,找不到已经安装的包,找不到共享库,也找不到接口定义。你明明已经安装了 ROS2,但终端像一个没登记的外来人员,进不了园区。
所以 ROS2 入门第一步不是“建厂”,而是“入园”。
二、官方背景:ROS2 依赖 shell 环境组合工作空间
官方文档开头讲了一个非常关键的概念:ROS2 依赖 shell environment 来组合多个 workspaces。
Workspace 是 ROS2 中用于开发的位置。核心 ROS2 工作空间叫 underlay,后续本地工作空间叫 overlay。开发 ROS2 时,经常会同时激活多个工作空间。
这个说法很抽象。换成数据加工园区模型就容易理解。
Underlay 是品牌方已经建好的基础园区。
比如我们通过 deb 包安装的 ROS2 Humble,一般在:
/opt/ros/humble这里面有 ROS2 官方提供的命令、库、接口、工具和示例包。
Overlay 是我们自己建设的加盟工厂区。
比如后面我们会创建自己的工作空间:
~/ros2_ws当我们在里面写自己的 package,编译后会生成:
~/ros2_ws/install如果你只 source 了/opt/ros/humble/setup.bash,终端只能看到官方基础园区。如果你还 source 了~/ros2_ws/install/setup.bash,终端才能在官方基础园区之上看到你自己的包。
这就是 underlay 和 overlay 的关系。
三、第一步:手动 source ROS2 setup 文件
如果你按照 Ubuntu deb packages 安装了 ROS2 Humble,那么最常用的命令是:
source/opt/ros/humble/setup.bash这条命令需要在每一个新打开的终端里执行一次。
执行之后,当前终端就能访问 ROS2 命令,例如:
ros2--help如果你不是 bash,而是 zsh 或其他 shell,setup 文件后缀也要相应变化。官方文档提到可能的文件包括:
setup.bash setup.sh setup.zsh这背后的逻辑是一样的:不同 shell 使用不同格式的启动脚本,但目标都是把 ROS2 的路径、库路径、Python 路径、包路径和发行版信息写进当前 shell 环境。
如果 source 后仍然找不到ros2命令,第一件事不是重装 ROS2,而是检查路径是否正确:
ls/opt/ros/humble/setup.bash如果这个文件不存在,说明你的安装路径和命令不一致,或者 ROS2 没有安装成功。
四、第二步:写入 ~/.bashrc,让每个终端自动入园
每次打开终端都手动 source,当然可以,但很麻烦。
官方给出的方式是把 source 命令写入 shell startup script。对 bash 来说,就是~/.bashrc:
echo"source /opt/ros/humble/setup.bash">>~/.bashrc写入后,重新打开终端,或者手动执行:
source~/.bashrc以后每次打开终端都会自动加载 ROS2 Humble 环境。
这个动作在工程上很常见,但也要知道如何撤销。如果你写错了路径,或者以后切换 ROS2 版本,就需要打开~/.bashrc删除或修改这一行。
比如:
gedit ~/.bashrc或者:
vim~/.bashrc这里要提醒一点:不要在~/.bashrc里盲目堆很多 source 命令。比如同时 source Humble、Galactic、Jazzy,或者多个本地 workspace,容易造成环境混乱。工程上应该明确当前终端服务于哪个项目、哪个 ROS2 版本、哪个工作空间。
五、第三步:检查 ROS2 环境变量
官方建议,如果你遇到找不到包、无法使用 ROS2 包或命令异常的问题,第一步检查环境变量。
Linux 下可以执行:
printenv|grep-iROS正常情况下,至少应该看到类似:
ROS_VERSION=2 ROS_PYTHON_VERSION=3 ROS_DISTRO=humble这三个变量可以理解为当前终端的 ROS2 身份信息。
ROS_VERSION=2表示当前是 ROS2,而不是 ROS1。
ROS_PYTHON_VERSION=3表示当前 ROS2 使用 Python 3。
ROS_DISTRO=humble表示当前激活的是 Humble 发行版。
如果你明明想使用 Humble,却看到ROS_DISTRO是别的版本,就说明当前终端环境被其他 setup 文件污染了。
这就是 ROS2 调试里的第一个基本动作:先查环境,再查代码。
六、underlay 和 overlay:官方园区和本地加盟工厂
配置 ROS2 环境真正重要的地方,是理解 workspace 叠加。
假设你现在只有官方 ROS2:
source/opt/ros/humble/setup.bash这时当前终端只知道官方 underlay。
以后你创建自己的工作空间:
mkdir-p~/ros2_ws/srccd~/ros2_ws colcon build编译后会生成:
~/ros2_ws/install/setup.bash此时正确顺序是:
source/opt/ros/humble/setup.bashsource~/ros2_ws/install/setup.bash先 source underlay,再 source overlay。
用数据加工园区比喻就是:先登记品牌方基础园区,再登记你自己的加盟工厂区。这样你的本地工厂既能使用品牌方提供的工具和库,也能被终端找到。
如果顺序反了,或者只 source 了 underlay,没有 source overlay,就会出现常见问题:
- 自己编译的 package 找不到。
ros2 run看不到自己的节点。ros2 launch找不到自己的 launch 文件。- 同一个包在不同 workspace 中版本不一致。
所以后面每次构建本地工作空间后,都要记得:
sourceinstall/setup.bash这一步不是形式主义,它是在告诉终端:刚刚新建的工厂已经加入园区了。
七、ROS_DOMAIN_ID:给不同园区划分通信频道
官方 guide 还提到ROS_DOMAIN_ID。
ROS2 底层依赖 DDS 通信。简单理解,ROS_DOMAIN_ID就像园区的通信频道编号。同一个 domain 里的节点可以互相发现和通信,不同 domain 的节点默认互相隔离。
设置方式是:
exportROS_DOMAIN_ID=<your_domain_id>如果希望长期生效,可以写入~/.bashrc:
echo"export ROS_DOMAIN_ID=<your_domain_id>">>~/.bashrc这个变量在多人调试、多机器人实验、教室环境、公司局域网中很有用。
比如几组人都在同一个网络里跑 turtlesim,如果大家都使用默认 domain,就可能互相发现对方的节点和 topic,出现一些奇怪现象。给每组设置不同的ROS_DOMAIN_ID,就能把它们隔离开。
在真实项目里也一样。多台车、多套 ROS2 系统、多组调试环境共用一个局域网时,domain 隔离是非常基础的工程习惯。
八、ROS_LOCALHOST_ONLY:只允许本机通信
官方还提到ROS_LOCALHOST_ONLY。
默认情况下,ROS2 通信不限制在 localhost,本机节点可能会被同一局域网里的其他计算机发现。
如果设置:
exportROS_LOCALHOST_ONLY=1ROS2 的 topics、services、actions 就只在本机可见。
这在某些场景很有用。比如教学环境里,多台电脑都在跑同名 topic,如果不限制本机通信,可能互相干扰。设置ROS_LOCALHOST_ONLY=1后,每台电脑只看自己的 ROS2 系统。
但这个变量也有坑。
如果你需要跨机器通信,比如一台工控机发点云,另一台开发电脑用 RViz 看数据,那么设置ROS_LOCALHOST_ONLY=1会直接阻断跨机器发现。表现出来就是:topic 在发送机器上存在,但接收机器看不到。
所以它不是“越开越安全”的默认配置,而是一个明确的网络隔离开关。什么时候打开,什么时候关闭,要和项目通信拓扑一致。
九、配置环境的最小检查清单
每次遇到 ROS2 命令或包找不到问题,可以按这个顺序排查。
第一,确认 setup 文件存在:
ls/opt/ros/humble/setup.bash第二,手动 source:
source/opt/ros/humble/setup.bash第三,检查 ROS2 命令:
ros2--help第四,检查环境变量:
printenv|grep-iROS第五,如果使用本地工作空间,确认 overlay 已 source:
source~/ros2_ws/install/setup.bash第六,检查 domain 和 localhost 设置:
echo$ROS_DOMAIN_IDecho$ROS_LOCALHOST_ONLY这套检查比直接重装 ROS2 更有效。很多 ROS2 初学问题,本质不是安装坏了,而是当前终端没有正确进入 ROS2 环境。
十、结论
配置 ROS2 环境是 ROS2 入门教程的第一篇,也是后续所有操作的前提。
从官方角度看,这篇 guide 讲的是 source setup files、写入 shell startup script、检查 ROS 环境变量,以及理解ROS_DOMAIN_ID和ROS_LOCALHOST_ONLY。
从我的数据加工工业园区模型看,这一步是在给当前终端办理入园手续:source underlay 让你进入 ROS2 官方基础园区,source overlay 让你自己的工作空间加入园区,环境变量则告诉系统当前使用哪个 ROS2 版本、哪个通信域、是否只允许本机通信。
学会这一篇之后,下一步就可以进入官方 First Steps 的第二篇:使用 turtlesim、ros2 和 rqt,真正开始在教学园区里观察 ROS2 的节点、话题和工具如何工作。
