先说一个我碰到很多次的典型场景:有人拿一台 Ubuntu 24.04 跑 sudo apt install ros-humble-desktop,装了大半天报“Unable to locate package”,然后跑来问我是不是源没配好。其实问题根本不在源,而是 ROS2 和 Ubuntu 的版本是严格绑定的——22.04 对应 Humble,24.04 对应 Jazzy,交叉安装就是找死。这篇文章把 Ubuntu 22.04/24.04 安装 ROS2 的完整流程拆开讲,Humble 和 Jazzy 两条线都覆盖,从版本选型、换源、加 key、装包、配环境变量,到 turtlesim 跑通、rviz2 可视化验证,最后再补充 colcon、Gazebo、Nav2 这些实际干活一定会用到的东西,争取你照着走一遍就能跑起来,不折腾。
1. 版本选型:为什么 22.04 对应 Humble、24.04 对应 Jazzy
1.1 ROS2 发行版与 Ubuntu 版本的生命周期映射
ROS2 每个发行版发布时,官方只针对一个或少数几个 Ubuntu 版本提供二进制包。这个“支持矩阵”不是随便定的,而是跟着 Ubuntu LTS 的节奏走。目前最常见的对应关系是这样:
| Ubuntu 版本 | 代号 | 对应 ROS2 发行版 | 类型 | 支持周期 |
|---|---|---|---|---|
| Ubuntu 20.04 | Focal | Foxy Fitzroy | LTS | 至 2023 年(已 EOL) |
| Ubuntu 22.04 | Jammy | Humble Hawksbill | LTS | 至 2027 年 |
| Ubuntu 24.04 | Noble | Jazzy Jalisco | LTS | 至 2029 年 |
| Ubuntu 24.04 | Noble | Rolling | 滚动版 | 持续更新,不稳定 |
记住这个映射表基本就够了。ROS2 的二进制源在加入 apt 源时,会用 $(lsb_release -cs) 自动取 Ubuntu 的代号,放到源的 URL 路径里。比如 Humble 对应的路径是 .../ubuntu jammy main,Jazzy 对应的路径是 .../ubuntu noble main。你如果硬要在 24.04 上安装 Humble,apt 会拿 noble 去匹配 Humble 的源,但那个路径下根本没有针对 noble 的 Humble 包,自然就报找不到。
所以遇到“找不到软件包”这一类问题,先别急着怀疑源有问题,第一件事是对照这张表,看你的 Ubuntu 版本和 ROS2 发行版是不是匹配。
1.2 手头有多个 Ubuntu 版本时怎么选 ROS2 发行版
如果你是刚入门,建议优先选 LTS 版本的 ROS2,因为 LTS 代表官方承诺长期维护,bug 修复和安全更新会持续很多年。教学资源、开源项目、工业应用里,Humble 的存量最大,搜“ros2菜鸟教程”“ros2安装教程”这类内容,大部分也是基于 Humble 写的,踩坑的时候容易搜到答案。如果你是新项目、新环境,或者需要 Gazebo、Nav2 等新版本特性,可以直接上 Jazzy,毕竟它支持到 2029 年,对 Ubuntu 24.04 的适配也最完整。
我自己平常的选型逻辑是:帮别人搭学习环境,默认 22.04 + Humble;自己折腾新功能或者做毕业设计、比赛项目,会选 24.04 + Jazzy,因为新工具链对 Jazzy 的支持明显更好,比如 Jazzy 对 ARM 交叉编译的支持比 Humble 完善不少。至于 Rolling 这种滚动版,适合想追新特性的人,但隔三差五更新就能给你整个依赖 break,不建议新手碰。
1.3 安装前先确认系统架构与硬件环境
执行安装命令之前,我强烈建议先看一下系统架构。在终端里跑:
bash复制uname -m
输出是 x86_64,说明是 Intel/AMD 的 64 位机器;输出是 aarch64,说明是 ARM 架构,比如树莓派、RK3588、Jetson 系列。这个区别很重要,因为 ROS2 的 apt 源会自动根据架构匹配对应的二进制包,大部分情况下你不用额外操作,但如果你打算从源码编译,x86_64 和 aarch64 的依赖库差异很大,尤其是 Eigen、PCL、OpenCV 这些底层库。
另一个值得提前确认的是运行环境。在 VMware、VirtualBox 这类虚拟机里装 Ubuntu 再装 ROS2 的教程非常多,我实测过,虚拟机里跑 turtlesim、rviz2 是没问题的,但要注意给虚拟机分至少 4GB 内存、双核 CPU,否则 rviz2 打开后转动视角会比较卡。虚拟机里如果显卡 3D 加速没开,rviz2 可能黑屏,后面我会专门讲怎么处理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 装前准备:软件源、locale 与虚拟机的三件套
2.1 Ubuntu 系统软件源先换成国内镜像
ROS2 安装过程中要拉很多依赖包,如果系统源用的是官方地址,在国内网络环境下,下载速度可能非常慢,甚至偶尔超时。所以第一步我会先把 Ubuntu 软件源换成国内镜像。这里要注意,22.04 和 24.04 的源配置文件格式不一样。
Ubuntu 22.04 的源文件在 /etc/apt/sources.list,可以直接备份后替换:
bash复制sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list
sudo sed -i 's@//security.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list
sudo apt update
Ubuntu 24.04 改用了 deb822 格式,源配置在 /etc/apt/sources.list.d/ubuntu.sources,不能用老办法直接改 sources.list 了。不过 sed 替换依然有效,只需要把 archive.ubuntu.com 替换成镜像域名:
bash复制sudo sed -i 's@http://archive.ubuntu.com/ubuntu/@https://mirrors.aliyun.com/ubuntu/@g' /etc/apt/sources.list.d/ubuntu.sources
sudo apt update
镜像源用清华、阿里云、中科大都行,个人习惯是阿里云,稳定而且带宽充足。这里多说一句:换源之后如果 apt update 出现 Signature error 或者哈希校验失败,一般是镜像同步延迟导致的,换个时间再 update 就能解决,不用大动干戈重装系统。
2.2 UTF-8 locale 设置:ROS2 的隐藏前置条件
ROS2 的很多工具链对 locale 有要求,默认必须支持 UTF-8。我在 Ubuntu 22.04 上见过不少中文系统装完 ROS2 后,rqt 打开直接中文乱码、控制台打印异常的情况,十有八九就是 locale 没设置好。所以安装 ROS2 之前,先把 locale 设置成 UTF-8 是个好习惯:
bash复制sudo apt update && sudo apt install locales -y
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
设置完后新开一个终端,输入 locale 确认 LANG 已经是 en_US.UTF-8。这里有个小细节:update-locale 只改系统的默认 locale,已经打开的终端不会自动生效,必须重新打开终端或者执行 source /etc/default/locale。
2.3 启用 universe、multiverse、restricted 仓库
ROS2 的不少依赖包,包括 python3-vcstool、python3-rosdep、python3-colcon-common-extensions 等,都存放在 Ubuntu 的 universe 仓库里。默认安装的 Ubuntu 一般只启用了 main 和 restricted,universe 不一定全部启用,所以安装前建议执行:
bash复制sudo apt install software-properties-common -y
sudo add-apt-repository universe
sudo add-apt-repository multiverse
sudo add-apt-repository restricted
add-apt-repository 这个命令本身就是来自 software-properties-common 这个包,如果你系统里还没有,先装上再说。这步做完之后 apt update 一次,看到源正常刷新就说明仓库启用成功了。如果你明明执行了安装命令却提示找不到相关依赖包,多半就是 universe 没开。
2.4 虚拟机、物理机和显卡驱动的注意事项
如果你是在 VMware 里装 Ubuntu 再装 ROS2,有几个点提前处理好能省不少事。第一,安装 VMware Tools 或 open-vm-tools,方便共享文件夹和自适应分辨率;第二,给虚拟机分配至少 4GB 内存和 2 个 CPU 核心,Ubuntu 24.04 本身桌面就要占 2GB 左右,ROS2 跑起来再叠加 rviz2、Gazebo,内存太小会直接卡死。第三,虚拟机里 USB 设备直通默认是关闭的,如果你后面要连 Pixhawk、ArduPilot 飞控或者自己做的下位机板子,需要在虚拟机设置里把 USB 控制器和对应设备直通进去,否则 ls /dev/ttyUSB0 永远看不到设备。
物理机上如果用的 NVIDIA 显卡,Ubuntu 24.04 默认的 Wayland 会话和 rviz2 的兼容性偶尔有奇怪的现象,比如画面闪烁、工具按钮失效。遇到这种情况,可以登录界面右下角切换成“Ubuntu on Xorg”会话再试试。装 NVIDIA 驱动时尽量用系统自带的“附加驱动”工具或者 ubuntu-drivers install,如果用 CUDA 又装驱动又装 ROS2,顺序建议是先装系统、再装驱动、最后装 ROS2,避免两边的库产生冲突。
3. 安装实操:Humble 与 Jazzy 的完整命令与替换方案
3.1 添加 ROS2 GPG 密钥与软件源
ROS2 的 apt 源在官方文档里推荐使用 packages.ros.org。网络环境正常的情况下,直接按官方流程走就行。这里以 Humble 为例,Jazzy 只需要把所有 humble 替换成 jazzy:
bash复制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
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
sudo apt update && sudo apt upgrade -y
这段命令里有几个点值得展开说一下。$(dpkg --print-architecture) 会自动获取当前系统架构,比如 amd64 或 arm64,不用手动写死。$(. /etc/os-release && echo $UBUNTU_CODENAME) 会自动解析 Ubuntu 代号,在 22.04 上就是 jammy,在 24.04 上就是 noble。这样同一个命令在两种系统上都能用,不用手动改路径。
如果你在服务器或国内网络环境下访问 raw.githubusercontent.com 超时,key 下载失败,可以改用 ROS2 镜像站提供的同一个 key 文件。这里拿清华镜像举例:
bash复制sudo curl -sSL https://mirrors.tuna.tsinghua.edu.cn/ros2/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
ROS2 源本身也可以换成镜像地址,把 http://packages.ros.org/ros2/ubuntu 替换成 https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu 或 https://mirrors.aliyun.com/ros2/ubuntu。我个人经验是先按官方源试一次,如果 apt update 时速度太慢再切换镜像,这样既能保证源是最新的,又能避免不必要的猜测。
3.2 安装 ros-base 还是完整版 desktop
源配好之后,接下来就是安装本体。ROS2 的包分得很细,最常用的是两个安装粒度:
ros-humble-ros-base:只包含通信、参数、tf、urdf 等基础功能,不包含 GUI 工具,适合服务器、嵌入式板子或者只想跑几个 Node 的场景,安装体积小很多。ros-humble-desktop:包含 rviz2、demo 程序、turtlesim 等可视化与演示工具,适合学习和日常开发。这个通常就是大多数人需要的包。- 特定功能包:比如
ros-humble-gazebo-ros-pkgs、ros-humble-nav2,需要哪个再单独装,不用一口气全装。
对新手来说,我建议直接装 desktop 版,因为你可以立刻用 turtlesim、rviz2 这些工具验证安装是否成功。命令是:
bash复制sudo apt install ros-humble-desktop -y
sudo apt install ros-dev-tools -y
Jazzy 对应的命令就是 sudo apt install ros-jazzy-desktop -y。注意 ros-dev-tools 这个包名在各发行版里都一样,它包含 colcon、rosdep、ros2bag 等开发配套工具,后面建工作区编译功能包时必须用到,所以建议一并装上。
安装过程会拉大量依赖,耗时取决于网速和机器性能。装完后查看一下安装目录,确认是否成功:
bash复制ls /opt/ros/humble
正常情况下你会看到 setup.bash、setup.zsh、include、lib、share 等目录。看到这些,说明核心包已经落地了。如果 ls /opt/ros 下面什么都没有,或者只有空目录,那就是安装没成功,往下看排查。
3.3 安装过程中最常见的报错与处理
这一节我把安装阶段的高频报错整理成一张表,都是实际遇到过的问题:
| 现象 | 原因 | 处理方法 |
|---|---|---|
Unable to locate package ros-humble-desktop |
ROS2 源没加成功,或 Ubuntu 版本与 ROS2 版本不匹配 | 检查 /etc/apt/sources.list.d/ros2.list 内容,执行 apt update 后再装 |
Package ros-jazzy-desktop has no installation candidate |
当前 Ubuntu 不是 24.04,或源里配置的 codename 不对 | 用 lsb_release -cs 确认系统代号,确保不是 jammy 配 jazzy |
The following signatures couldn't be verified |
GPG key 缺失或失效 | 重新执行 curl 下载 ros.key 到 /usr/share/keyrings/ros-archive-keyring.gpg |
Could not resolve host packages.ros.org |
DNS 解析失败或网络不通 | 检查网络,或把源换成国内镜像源 |
E: Repository ... changed its 'Label' value |
系统源与 ROS2 源的 label 冲突 | 一般不影响,apt update 后观察输出,如果提示则清理 /var/lib/apt/lists 后重试 |
如果执行 sudo apt install ros-humble-desktop 时提示有“unmet dependencies”,大部分原因是某些依赖包的版本和系统当前版本不一致。这时候别急着 apt -f install,先看具体冲突的包名,再决定是升级系统还是降级某个包。稳妥的做法是先 sudo apt upgrade 把系统升到最新,再回来装 ROS2,能解决大部分问题。
4. 环境变量配置:source 机制与多版本共存
4.1 setup.bash 到底做了什么
装完 ROS2 之后你会发现,直接敲 ros2 命令大概率提示 command not found。这是因为 ROS2 的可执行文件不在默认的 PATH 里,需要先 source 一下环境脚本。在终端执行:
bash复制source /opt/ros/humble/setup.bash
这个脚本做的主要事情是设置一系列环境变量,包括 PATH、LD_LIBRARY_PATH、AMENT_PREFIX_PATH、CMAKE_PREFIX_PATH 等。AMENT_PREFIX_PATH 是 ROS2 特有的,它告诉 ament 构建系统去哪找已经安装的功能包。简单理解,setup.bash 就是把 ROS2 整个软件生态“激活”,让当前终端能够找到 ros2、colcon、消息类型等所有必要资源。
如果你用的是 zsh,source 的是 /opt/ros/humble/setup.zsh,bash 用户就用 setup.bash。Windows 上的 ROS2 用 local_setup.bat,这个不是咱们讨论的范围,但原理一样。
另外一个容易被忽略的点:source 只对当前终端生效,新开的终端如果不重新 source,依然找不到 ros2 命令。这也是为什么很多人“明明装好了,重开终端又不行”的原因。
4.2 写入 ~/.bashrc 让环境变量永久生效
为了避免每次都手动 source,最省事的做法是把 source 命令追加到 ~/.bashrc 里:
bash复制echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
这样每次打开终端都会自动执行 source。Jazzy 用户把路径换成 /opt/ros/jazzy/setup.bash 即可。
如果你机器上同时装了多个 ROS2 版本,比如 22.04 上既装了 Humble 又想折腾 Rolling,千万不要在 .bashrc 里同时写两个 source,因为后一个会覆盖前一个的环境变量,最终版本会乱。我更推荐在 .bashrc 里写一个简单的切换函数:
bash复制# ROS2 版本切换
alias ros2_humble='source /opt/ros/humble/setup.bash'
alias ros2_jazzy='source /opt/ros/jazzy/setup.bash'
想用哪个版本,新终端里敲一下对应 alias 即可。多个 ROS2 版本共存时,工作区编译也建议分开,不要混用同一个 install 目录。
4.3 卸载与重装:怎么清理得干净利落
装 ROS2 装到一半失败需要重装的场景很常见,尤其是一开始用了不匹配的源,留下了一堆半成品依赖。卸载 ROS2 最干净的做法是把对应版本的所有包全部移除:
bash复制sudo apt remove ros-humble-* -y
sudo apt autoremove -y
注意 ros-humble-* 这个通配符会匹配所有以 ros-humble- 开头的包,因为 ROS2 的 apt 包名都是这个前缀。autoremove 会清理掉因为安装 ROS2 而带入的孤立依赖,这一步很关键,否则下次重装容易遇到依赖冲突。
卸载后还需要手动清理软件源和残留目录:
bash复制sudo rm -rf /opt/ros/humble
sudo rm /etc/apt/sources.list.d/ros2.list
sudo rm /usr/share/keyrings/ros-archive-keyring.gpg
sudo apt update
再来一遍安装流程,就不会被旧环境干扰。我记得有次帮一个朋友重装,他之前把 ROS2 源写错了路径,apt 一直报 404,清理残留源之后一次就过了。
5. 第一轮验证:turtlesim、rviz2 与故障排查
5.1 跑通 turtlesim:从终端 1 到终端 3
环境变量配置好之后,第一个验证项目是跑 turtlesim 小海龟。打开终端 1,启动海龟仿真器节点:
bash复制ros2 run turtlesim turtlesim_node
这时应该弹出一个蓝色窗口,中间有一只小海龟。如果没有弹窗,可能是显示环境问题,后面我讲排查。接着打开终端 2,启动键盘控制节点:
bash复制ros2 run turtlesim turtle_teleop_key
然后用方向键控制小海龟移动,如果画面能跟着键盘动,说明 ROS2 的核心通信已经正常工作了。这个地方很容易忽略:控制节点启动后,必须把焦点放在终端 2 上,按方向键才有效。很多人说“按了没反应”,其实就是焦点在别的窗口。
再开一个终端 3,可以看看 ROS2 的“世界”里究竟有哪些东西:
bash复制ros2 node list
ros2 topic list
ros2 topic echo /turtle1/pose
node list 会显示 /turtlesim 和 /teleop_turtle 两个节点,topic list 会列出 /turtle1/cmd_vel、/turtle1/pose 等话题。能看到这些输出,说明节点发现、话题通信这些 ROS2 最核心的功能都没问题。
5.2 rviz2 的基本操作与机器人模型可视化
turtlesim 跑通之后,再来验证 rviz2 这个可视化工具。直接执行:
bash复制rviz2
如果没启动,可能是你没装 desktop 版,只装了 ros-base。这种情况下单独补装:
bash复制sudo apt install ros-humble-rviz2 -y
rviz2 启动后会看到一个 3D 视图窗口,左侧是 Display 面板。你可以手动添加 TF、RobotModel、LaserScan 等显示项来可视化机器人模型。比如用 URDF 描述一个机器人并显示,需要先启动 robot_state_publisher 和 joint_state_publisher:
bash复制ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:="$(cat your_robot.urdf)"
ros2 run joint_state_publisher joint_state_publisher
然后在 rviz2 左侧点击 Add -> RobotModel,把 Fixed Frame 改成 base_link 或你的机器人根 frame。能看到机器人模型,说明 URDF 解析、TF 发布、可视化链路都通了。
如果 rviz2 打开后黑屏或者闪退,在虚拟机里最常见的原因是 3D 加速没开。可以在启动前加一个环境变量强制软件渲染:
bash复制LIBGL_ALWAYS_SOFTWARE=1 rviz2
这个办法治标不治本,但能先在功能层面验证 ROS2 是否正常。硬件层面想流畅跑,还是建议物理机加独显,或者虚拟机里开启 3D 加速。
5.3 常见验证故障排查表
验证阶段集中出现的问题,我整理了一个排查表,按“现象 -> 原因 -> 解决”三个维度来写:
| 现象 | 原因 | 解决 |
|---|---|---|
ros2: command not found |
没 source 环境脚本 | 执行 source /opt/ros/humble/setup.bash,并写入 ~/.bashrc |
| turtlesim 窗口弹不出来 | 显示环境变量或 Wayland 问题 | 切换到 Xorg 会话,或检查 echo $DISPLAY |
| 键盘控制没反应 | 终端焦点不在控制节点窗口上 | 点击控制终端后再按方向键 |
| rviz2 黑屏 / 闪退 | 虚拟显卡 3D 加速不足 | 尝试 LIBGL_ALWAYS_SOFTWARE=1 rviz2 |
| 两个终端节点互相发现不了 | ROS_DOMAIN_ID 不一致 | 检查 echo $ROS_DOMAIN_ID,两端保持一致 |
| 使用物理机时话题延迟大 | 网络与实时性配置问题 | 本机调试可用 export ROS_LOCALHOST_ONLY=1 |
ROS_DOMAIN_ID 这里多说一句:ROS2 默认的 domain id 是 0,如果同一局域网里有多个机器人或者多台电脑同时跑 ROS2,它们默认会互相通信。为了隔离,可以设置不同的 ROS_DOMAIN_ID,比如 export ROS_DOMAIN_ID=1。多机协作时这个参数很关键,但单人本地调试时保持默认即可,不用乱改,改了两边不一致反而找不到节点。
6. 安装之后:colcon、Gazebo、Nav2 与生态扩展
6.1 colcon 工作区与版本不匹配时的编译报错排查
安装完成只是开始,实际开发中我们通常要自己创建工作区并用 colcon 编译。colcon 已经包含在 ros-dev-tools 里,如果没装就单独执行:
bash复制sudo apt install python3-colcon-common-extensions -y
建工作区的标准流程是:
bash复制mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build --symlink-install
source install/setup.bash
这里有个非常常见的坑:当你把一份基于 Humble 的工程拿到 Jazzy 环境里用 colcon build 编译时,报错几乎是必然的,最常见的是 Could not find a package configuration file provided by "xxx",或者 C++ 编译时提示某个 api 不存在。这不是 colcon 本身的问题,而是 ROS2 版本升级导致的 API 变更和依赖版本变化。
遇到这种报错,我建议按三步排查:第一步,用 rosdep 检查依赖是否齐全,命令是:
bash复制cd ~/ros2_ws
rosdep install --from-paths src -y --ignore-src
如果 rosdep 提示缺少依赖,先补齐再编译。第二步,确认 package.xml 和 CMakeLists.txt 里的依赖名是否在当前发行版中存在,比如 Humble 里叫 gazebo_ros_pkg 的包,在 Jazzy 里名字和版本可能有变化。第三步,如果编译报的是 API 错误,说明源码本身是为老版本写的,需要把源码升级到新版本,或者最省事的方法——用 Docker 装一个对应 ROS2 版本的镜像,把工程放在容器里编译运行,避免污染宿主机环境。
colcon build --symlink-install 这个参数也值得解释一下:symlink-install 会以软链接方式把源码链接到 install 目录,修改 Python 脚本或 launch 文件后不用重新编译就能生效,Python 开发场景下强烈推荐。
6.2 Gazebo 仿真与 ArduPilot SITL 的连接思路
装了 GUI 和仿真工具后,很多人会想跑 Gazebo 和 ArduPilot 的仿真。在 Humble 或者 Jazzy 里安装 Gazebo 插件包的命令是:
bash复制sudo apt install ros-humble-gazebo-ros-pkgs -y
Jazzy 对应替换成 ros-jazzy-gazebo-ros-pkgs。装好之后,Gazebo 就和 ROS2 通过 gazebo_ros 插件建立了桥接,你可以用 ros2 launch gazebo_ros gazebo.launch.py 启动一个空白世界,再用 ros2 run gazebo_ros spawn_entity.py 等命令往世界里放模型。
至于 ArduPilot 和 ROS2 的配合,大多数人是通过 SITL 仿真来跑飞控逻辑。基本链路是:ArduPilot SITL 启动后通过 MAVLink 输出数据,再用 mavros 作为桥接,把 MAVLink 数据转换成 ROS2 的 topic。Jazzy 下连接 Gazebo 和 ArduPilot 时,常用的做法是让 ArduPilot SITL 连接 Gazebo 的 UDP 端口,同时在地面站或者 mavros 这边遥控、订阅状态。安装 mavros 的命令是:
bash复制sudo apt install ros-humble-mavros ros-humble-mavros-extras -y
Jazzy 替换成 ros-jazzy-mavros ros-jazzy-mavros-extras。如果你折腾的是 Gazebo + ArduPilot 的仿真环境,一定要先把 mavros 和 Gazebo 各自的 topic 搞清楚,特别是 /mavros/state、/mavros/imu/data 这些话题,联调时能少走很多弯路。
6.3 常用配套:Nav2、ros2_control、IMU 消息格式和八叉树地图
安装完基础 ROS2 之后,很多场景还会用到这些配套工具:
第一个是 Nav2,导航框架。安装命令是:
bash复制sudo apt install ros-humble-nav2 ros-humble-nav2-bringup -y
Nav2 之于 ROS2,相当于 ROS1 时代的 move_base 加一层调度壳,负责地图服务、全局路径规划、局部避障、行为树控制等。注意 Nav2 的版本对发行版很敏感,Humble 的工程拉到 Jazzy 上基本要重新调整参数和依赖。
第二个是 ros2_control,机器人硬件控制框架。它把控制器、硬件接口、传动等抽象成统一架构,实际项目里写 robot driver 时几乎绕不开。安装:
bash复制sudo apt install ros-humble-ros2-control ros-humble-ros2-controllers -y
第三是消息格式。很多传感器驱动最后都会发布 sensor_msgs/msg/Imu 类型的消息,字段包括 orientation(四元数姿态)、angular_velocity(角速度)、linear_acceleration(线加速度)以及各自的协方差数组。调试 IMU 数据时常用命令是:
bash复制ros2 topic echo /imu/data
如果收到数据但姿态不变,通常要先检查 TF 树的 frame 是否完整发布,而不是怀疑消息本身有问题。
第四是八叉树地图。做导航避障或者三维建图时,octomap 是常见选择,相关包有 octomap、octomap_server 等,可以通过 sudo apt install ros-humble-octomap* 装全。ROS2 下用 octomap_server 可以把点云转换成语义八叉树地图,配合 Nav2 做代价地图扩展。
还有一些偏研究方向的工具,比如 Fast-LIO2 这类激光惯性里程计算法包,在 Jazzy 上从源码编译时,PCL、Eigen 的版本兼容要格外小心,建议照着官方文档的依赖版本逐个对齐,不要迷信“apt 最新版直接能编过”这种说法。
我自己每次装完一个新环境的固定流程是:先确认版本匹配,再换源,然后一次性装好 desktop 和 dev-tools,接着跑一遍 turtlesim 和 rviz2 验证,最后才往工作区里丢代码。这个过程看起来步骤多,但每一步都踩过对应的坑,省掉任何一环,后面花的时间可能比省下来的还多。尤其是版本匹配这件事,真不是文档上写写而已——我见过太多人在 24.04 上硬装 Humble,折腾一整天最后来找我,十分钟就帮他定位到根因。如果你照着本文装完还有问题,优先检查是不是在某个环节跳过了步骤,别直接怀疑 ROS2 本身。
