ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu 22.04安装ROS2 Humble完整指南与colcon工作空间搭建

Ubuntu 22.04安装ROS2 Humble完整指南与colcon工作空间搭建 很多人第一次接触ROS2都会被安装这一步劝退。不是因为没有教程而是因为教程版本太多太乱有的讲20.04有的讲WSL2有的直接甩给你一串命令装完就闪人结果你照着一顿操作下来ros2命令打不出来小乌龟起不来中文乱码源冲突一天就这么没了。这篇文章我只讲一件事在全新的Ubuntu 22.04上把ROS2 humble完整装好跑通示例再顺手搭好一个能长期开发用的工作空间。我写的是完整可复现的流程每一步都会解释为什么要这样做以及遇到什么现象说明你走对了。里面大部分坑都是我实际踩过的不是网上那种复制粘贴的说明书。适合第一次装ROS2的小白也适合以前装过ROS1但现在要切到ROS2的开发者参考。1. 安装前的思路版本选择和方案权衡1.1 为什么是Ubuntu 22.04 ROS2 humbleROS2每个版本都有一个对应的Ubuntu LTS版本这不是随便配的而是官方做了完整测试和支持的组合。目前长期支持版本里最稳的一对就是Ubuntu 22.04代号jammy配合ROS2 humble全称Humble Hawksbill。之前很多人还在用ROS2 foxy配Ubuntu 20.04但foxy在2023年5月已经停止维护了这意味着之后官方不再发布针对foxy的安全补丁和bug修复。而humble的维护周期到2027年对学习、科研、产品原型开发都足够用。另外Jazzy对应的是Ubuntu 24.04虽然更新但很多第三方设备驱动、SDK、教学资料还停留在humble时代。如果你是跟着课程或开源项目学习大概率能找到的参考资料都是基于humble的。所以我的建议很直接2025年这个时间点学习或者做项目Ubuntu 22.04 ROS2 humble就是最优解。1.2 ROS2和ROS1的区别先说清楚如果你之前接触过ROS1这里必须先转变一个观念ROS2没有roscore也不存在master节点。ROS2的节点之间通过DDS协议自动发现、直接通信节点A和节点B只要在同一个网络域默认domain ID为0里就能自动找到对方。这个变化带来的直接体验就是以前启动ROS1之前必须先启动roscoreROS2完全不需要。我见过太多从ROS1转过来的同学装完ROS2之后第一反应是“roscore呢”然后到处找命令——根本不存在的。你直接ros2 run启动节点它自己就能工作。还有一点要注意ROS2的启动方式也变了rosrun变成了ros2 run话题列表变成ros2 topic list节点列表是ros2 node list。命令体系完全重写了一遍后面的验证部分我会一步步展示。1.3 环境方案物理机、虚拟机、WSL2还是Docker在开始动手之前先想清楚你打算把ROS2装在哪里。方案适合场景个人建议物理机双系统长期开发、要接激光雷达/相机等USB设备、要做实车或嵌入式实验首选虚拟机VirtualBox/VMware只是想体验ROS2、跑跑仿真、学习基本命令可以但别碰硬件设备WSL2Windows下快速体验无图形界面或仅简单仿真可行但图形和串口配置略折腾Docker部署、复现环境、团队协作进阶以后再碰如果你是第一次装我建议直接用物理机双系统。因为后面你可能要接真实硬件比如STM32、ESP32、激光雷达这些在虚拟机里的USB透传虽然能做但经常出现延迟和设备识别失败的问题非常搞心态。如果你实在不想重装系统虚拟机里用Ubuntu 22.04 Server版再加桌面环境也可以但记得给虚拟机分配至少4GB内存、双核CPU以上否则编译和启动RViz2会卡到怀疑人生。WSL2的话我也试过跑纯命令行程序没问题但打开RViz2这种图形工具需要额外配置WSLg有些机器上会很玄学。2. 换源与系统基础配置这一步决定后面是否顺利2.1 换国内apt源别在这一步偷懒如果你在国内安装软件源这一步不能跳过。Ubuntu默认的源服务器在国外直接sudo apt update你可能会等到崩溃或者是装了十分钟卡在某个包上下载失败。先把软件源换成国内镜像这里以清华源为例。Ubuntu 22.04的源配置在/etc/apt/sources.list操作前先备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后编辑文件把里面的archive.ubuntu.com和security.ubuntu.com全部替换为mirrors.tuna.tsinghua.edu.cn。如果你不想手动改可以直接用sedsudo sed -i s//.*archive.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo sed -i s//security.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list改完之后更新一下sudo apt update看到下载速度上来说明源生效了。这里顺便提一句ROS2本身的二进制包存储在packages.ros.org这个地址国内访问有时候快有时候慢如果后面在安装ros-humble-desktop时下载很慢可以把ROS源也换成国内镜像常见的阿里、中科大都有ROS源镜像。不过先别急着全换系统源换好后试试看后面安装ROS2时速度如何能用就用别过度配置。2.2 设置UTF-8语言环境这一步在官方文档里都有但是中文教程里很多人会忽略。ROS2在运行过程中会用到一些对locale敏感的脚本如果系统locale不是UTF-8后续可能会在构建工作空间或者运行rosdep时出现奇奇怪怪的报错比如Locale not supported by C library.为了避免这个问题我们预先设置好语言环境sudo apt update sudo apt install locales -y sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LC_ALLen_US.UTF-8 source /etc/profile这里有个细节update-locale写的是/etc/default/locale这个文件在系统启动时被读取。你执行完source /etc/profile后当前终端生效了但新开的终端可能还是读取旧的locale。所以最稳妥的做法是执行完上面命令后reboot重启一次系统再继续后面的操作。2.3 安装基础工具装ROS2之前先把系统里最基础的工具装齐。这些不是ROS2的依赖而是我们日常开发要用的东西sudo apt update sudo apt install -y curl wget git vim net-tools python3-pip其中curl很关键后面添加ROS2 GPG密钥的时候要用python3-pip用于安装Python包git用于拉取代码。都是基础中的基础顺手装一下不亏。3. 正式安装ROS2 Humble3.1 添加ROS2软件源和GPG密钥Ubuntu本身不包含ROS2的软件包所以我们要手动把ROS2的软件源添加到系统里。这一步包含两层操作下载GPG密钥然后写入源列表。先安装curl确保可用刚装完应该已经有了然后下载密钥sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg这里解释一下为什么要放到/usr/share/keyrings/目录下Ubuntu 22.04时代apt要求第三方源的GPG密钥必须放在keyrings目录里并且源配置里用signed-by参数指定这样apt在验证包的时候就知道用哪个密钥不会污染整个系统的信任链。老教程里那种直接丢到/etc/apt/trusted.gpg.d/的做法现在已经不推荐了如果混用容易出警告甚至报错。然后添加ROS2源列表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这条命令里有两个值得注意的地方$(dpkg --print-architecture)会自动获取当前系统架构大部分人是amd64不用手动写死$(source /etc/os-release echo $UBUNTU_CODENAME)会读出系统代号Ubuntu 22.04识别出来的就是jammy这样源地址就变成了http://packages.ros.org/ros2/ubuntu jammy main。版本维护起来很方便以后升级系统版本后这个地址也能跟着变。添加完成后更新一下软件包列表sudo apt update如果这里没有报错说明ROS2源已经成功接入。你可以用apt-cache search ros-humble | head看一眼应该能列出大量ros-humble-*开头的软件包。3.2 升级系统并安装ROS2桌面版接下来更新系统包库信息顺手升级一下系统中已有的软件包sudo apt update sudo apt upgrade -y注意upgrade这一步时间取决于你的网络和机器状况如果内核或者其他大件有更新可能会比较久。但别省这一步有时候ROS2的依赖包版本和系统仓库里的不一致提前升级一次能避免后面很多依赖冲突。然后选择要安装的ROS2版本。ROS2有两种常用安装级别ros-humble-desktop包含RViz2、Gazebo、demo节点、各种可视化工具功能最全ros-humble-ros-base只有基础的通信库和命令行工具没有图形界面第一次装直接装desktop版一步到位sudo apt install ros-humble-desktop -y这个包体积很大包含数百个依赖下载时间取决于网络。装的时候别闲着可以看看输出了解都装了哪些东西对后续理解ROS2模块构成很有帮助。如果你以后要做机器人导航、SLAM、MoveIt等后面按需apt install ros-humble-功能包名即可不用现在一股脑全装。3.3 配置环境变量安装完成后ROS2的可执行文件在/opt/ros/humble/目录下。如果你此刻直接打开一个终端输入ros2大概率会提示找不到命令因为系统还没告诉你这个工具在哪里。我们把这个路径配置到shell的启动文件里这样每次打开终端就能自动加载ROS2环境echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc这里解释一下setup.bash的作用ROS2的环境变量、可执行文件路径、库搜索路径都是靠这个脚本配置的。你以后创建自己的工作空间也会生成一个install/setup.bash原理完全一样。可以理解为运行环境变量集中在一处source一下就全部生效。验证一下是否配置成功echo $ROS_DISTRO如果输出humble说明环境变量已经生效。再输入ros2 --help能看到命令帮助列表说明ROS2命令已经可用。这个步骤我见过太多人栽跟头命令明明执行了但是新开的终端还是找不到ros2原因就是你只在当前终端source了没写进.bashrc。记住是echo ... ~/.bashrc写入不是用完就忘。另外如果你用zsh那么文件应该是.zshrc命令里的bash也要改成zsh。3.4 安装常用的开发工具链刚才装的ros-humble-desktop已经包含ROS2本身的功能但实际开发还需要几个配套工具sudo apt install -y python3-colcon-common-extensions python3-rosdep python3-rosinstall-generator python3-vcstool这里逐个说下用途colconROS2的编译工具替代ROS1里的catkin_make。以后你编写自己的功能包就是在工作空间里运行colcon build来编译rosdep自动安装功能包依赖的系统库。你从网上clone一个项目下来项目里的package.xml会声明它依赖哪些库rosdep能自动帮你查缺补漏vcstool和rosinstall-generator批量管理多个源码仓库的工具做多包项目时会用到装完后建议顺手初始化rosdepsudo rosdep init rosdep updaterosdep init如果提示已经初始化过说明你之前装过ROS1相关的环境不用管直接执行rosdep update即可。这个步骤偶尔会因为网络问题失败多试几次就好不影响ROS2本身使用。如果你确定以后要做Gazebo仿真还可以安装Gazebo的ROS2接口包sudo apt install -y ros-humble-gazebo-ros-pkgs这个包让Gazebo能跟ROS2节点通信比如从话题里读取速度指令或者发布传感器数据。不做仿真可以跳过后面想装再装也行。4. 验证安装用小乌龟把系统跑起来4.1 启动小乌龟节点装完之后最直观的验证方式就是跑官方的小乌龟示例。这个例子几乎所有ROS2教程里都会用到因为它是图形化、交互式、能直观看到节点通信过程的最简单演示。打开一个终端启动小乌龟仿真器ros2 run turtlesim turtlesim_node一个蓝色背景的小窗口会弹出来窗口中央有一只小乌龟如果一切正常说明ROS2基础环境没问题。接着再开一个新终端运行键盘控制节点ros2 run turtlesim turtle_teleop_key然后回到这个终端按键盘方向键小乌龟就会跟着移动。它走过的路径会留下一条彩色的轨迹。说明一下这里的ros2 run用法ros2 run 包名 可执行文件名第一个参数是功能包名第二个参数是包里的可执行程序。ROS2的官方示例包叫turtlesim里面有两个可执行程序一个负责图形显示一个负责读取键盘输入。这两个程序各自是一个独立的节点它们之间通过话题/turtle1/cmd_vel通信这就是分布式通信的最直观体现。4.2 用命令行工具查看节点和话题小乌龟跑起来之后打开第三个终端可以用ROS2自带的命令行工具查看系统里正在运行什么ros2 node list你应该能看到两个节点/teleop_turtle /turtlesim再看一下话题列表ros2 topic list你会看到/turtle1/cmd_vel、/turtle1/pose、/turtle1/color_sensor等话题。其中/turtle1/cmd_vel就是键盘节点发布速度指令、乌龟仿真器订阅速度指令的那条通信管道。进一步你可以实时监听这条话题里传输的数据ros2 topic echo /turtle1/cmd_vel然后回到键盘控制终端按一下方向键你会发现echo终端里立刻显示了一组Twist类型的数据包含线速度和角速度。这说明两个节点之间的通信是实时、双向的。还可以直接通过命令行给话题发指令不用键盘也能控制乌龟ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist {linear: {x: 2.0}, angular: {z: 1.8}}这条命令发布一次速度指令乌龟会以一个弧线运动一下。--once表示只发一次不加的话会持续发送。4.3 测试RViz2小乌龟验证的是基础的节点通信接下来验证图形可视化工具RViz2是否正常ros2 run rviz2 rviz2RViz2的主界面会弹出。第一次打开可能是纯黑色背景这正常因为你还没有加载任何话题数据。你可以在左侧Display面板里点击Add选择By topic然后添加/turtle1/pose等话题这样窗口里就能看到乌龟位姿的可视化效果。如果RViz2能正常打开且界面不卡死说明你的ROS2图形环境已经完整配置好了。5. 创建第一个ROS2工作空间colcon环境布置5.1 理解colcon的overlay机制环境跑通之后接下来要做的是搭建你自己的开发环境。ROS2的编译系统和ROS1的catkin不太一样它用的是colcon。colcon构建的结果放在工作空间下的install/目录里你写好的源码放在src/目录下。这里有个重要的概念叫overlay系统安装的ROS2环境是底层underlay你自己工作空间编译出来的包是上层overlay。当你source了工作空间的install/setup.bash之后你新建的包会“覆盖”在系统ROS2环境之上不会污染系统目录。这也就是为什么ROS2多项目切换比ROS1干净很多。5.2 动手创建并构建工作空间在终端里执行mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src现在这个src目录还是空的但我们可以先跑一次空构建把整个工作空间的骨架搭出来cd ~/ros2_ws colcon build此时你会在~/ros2_ws下看到三个新的目录build、install、log。build是编译中间文件目录install是编译产物目录log是日志目录。这三个目录默认都要写入.gitignore不用提交到版本控制里。接着让终端识别这个工作空间的环境source install/setup.bash由于这是第一次构建、还没有任何功能包source之后不会增加新的命令但这个source操作验证了环境是通的。以后你在src里放了自己的功能包比如复制一份turtlesim改改就是重复这个流程cd ~/ros2_ws colcon build source install/setup.bash这三个命令以后会成为你的日常。有一点值得注意如果你改动了环境变量或者新增了功能包必须重新构建并source新功能才能在当前终端里被识别。如果嫌每次忘source可以像前面把setup.bash写进.bashrc一样把source ~/ros2_ws/install/setup.bash也追加进去但我觉得开发阶段还是手动source比较好避免不同工作空间交叉覆盖。6. 常见问题与排查技巧实录6.1 找不到ros2命令bash: ros2: command not found出现这个基本是环境变量没配置好。先确认一下你source的是哪个文件source /opt/ros/humble/setup.bash。然后确认这个命令有没有写进.bashrc。如果你用zsh要写.zshrc。还有一种情况是你之前装过别的ROS版本两个版本的setup.bash互相覆盖了检查一下/opt/ros/下面有哪些目录只保留当前要用的那一个source行。我之前帮人排查过的最诡异案例是.bashrc里source了某虚拟环境路径导致每次开终端就停在某个特定环境下ROS2的环境变量被挤掉了。遇到这种情况把.bashrc里多余的source行注释掉重新开终端再试。6.2 安装时下载速度慢或超时如果apt install ros-humble-desktop时下载特别慢优先考虑换源和重试。ROS2的默认软件源在packages.ros.org国内访问速度不稳定。可以临时把/etc/apt/sources.list.d/ros2.list里的地址替换为镜像地址比如中科大或阿里的ROS源。替换后记得sudo apt update。还有一个比较隐蔽的问题如果你开了系统代理或者某些网络加速工具apt的下载可能走代理反而更慢。临时关闭代理再试一次经常有奇效。6.3 GPG key相关报错The following signatures couldnt be verified because the public key is not available说明GPG密钥下载失败或者不完整。重跑一次下载命令确认密钥文件存在且非空sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg ls -l /usr/share/keyrings/ros-archive-keyring.gpg密钥文件大小一般在几千字节如果只有几百字节大概率是下载到了错误页面需要重新下载。另外检查ros2.list里的signed-by路径是否和密钥文件实际位置一致。6.4 其他可选的安装方式说明现在网络上有些教程会推荐用snap安装ROS2命令是sudo snap install ros2-humble之类的。我只能说这个方式我自己试过一次就放弃了snap版本的ROS2和常规apt方式安装的附加包混用非常麻烦很多ros-humble-*功能包不能直接往snap环境里装而且社区的支持资料基本都是基于apt安装方式的。初学者老老实实用官方apt方式少给自己添堵。另外如果你是做嵌入式方向之后可能要碰micro-ROS和ESP32那又是另一套工具链了。micro-ROS主要是把ROS2通信能力跑到MCU上跟本文讲述的Ubuntu环境安装是两件事。先把桌面端的ROS2学好硬件那块后面接触时会轻松很多。6.5 小乌龟窗口乱码或字体异常小乌龟窗口里的文字显示成方块或者乱码一般是系统缺少中文字符集或者字体渲染问题。在Ubuntu 22.04桌面版上可以安装sudo apt install fonts-noto-cjk -y来解决中文字体显示问题。如果是在虚拟机里也可能是显卡驱动性能不足导致渲染异常。这个不影响ROS2本身功能但看着确实难受装个字体大多数情况能改善。 ### 6.6 RViz2启动闪退或白屏 RViz2启动后立刻崩溃常见原因有两个一是机器显卡驱动太老OpenGL版本不够二是虚拟机环境里3D加速没开启。先试试在启动RViz2前加上软件渲染 bash export LIBGL_ALWAYS_SOFTWARE1 ros2 run rviz2 rviz2如果软件渲染下能正常打开说明是OpenGL硬件加速问题去把显卡驱动更新一下比如NVIDIA装官方驱动或者在虚拟机设置里开启3D加速。以上问题排查完你的Ubuntu 22.04 ROS2 humble环境应该就稳了。我个人在实际操作中的体会是ROS2安装本身不难难的是环境叠加太久之后的各种冲突。所以从一开始就养成好习惯——新开一个项目就建独立工作空间环境变量只保留需要的source别把一堆东西全堆在.bashrc里。按照这套流程搭好底子后面写节点、做仿真、接硬件你会比那些环境乱糟糟的人舒服得多。
返回列表