1. 一个看似简单却暗藏玄机的问题
“Ubuntu 22.04上能装ROS1吗?” 这个问题,乍一看像是一个只需要“能”或“不能”就能回答的判断题。但如果你真的在搜索引擎里敲下这行字,或者去ROS社区提问,得到的答案往往会让你更加困惑。有人会说“可以,但很折腾”,有人会直接建议“别想了,上ROS2吧”,还有人会甩给你一个复杂的、需要自己编译源码的教程链接。对于一个想在最新LTS系统上尝试ROS1的开发者,尤其是新手来说,这种信息混乱的局面足以让人望而却步。
问题的核心在于,ROS1(Robot Operating System 1)作为一个已经进入“遗产”维护阶段的软件框架,其官方支持的生命周期与Ubuntu发行版的更新节奏并不同步。ROS1的最后一个长期支持版本是Noetic Ninjemys,它的官方支持截止到2025年5月,并且明确只支持Ubuntu 20.04 (Focal Fossa)。而Ubuntu 22.04 (Jammy Jellyfish) 发布于2022年4月,在ROS1 Noetic的规划周期之外。因此,从“官方原生支持”的角度看,答案很明确:不行。官方没有为Ubuntu 22.04预编译好的二进制包(.deb文件)。
然而,在软件的世界里,“官方不支持”从来不等同于“技术上不可行”。无数开发者、研究者和爱好者的需求是真实存在的:实验室新采购的机器预装了22.04,不想重装系统;项目依赖的某些库或驱动在22.04上才有新版本;或者就是想在新系统上尝试经典的ROS1生态。正是这些需求,催生了各种“非官方”的解决方案。所以,更准确的回答是:可行,但你需要清楚地知道自己在做什么,并准备好应对一系列兼容性挑战,这绝非一键安装的体验。
本文将彻底拆解在Ubuntu 22.04上安装和使用ROS1的几种路径,深入分析每种方法背后的原理、具体操作步骤、必然会遇到的坑以及如何填平它们。我的目标不是劝退,而是给你一张清晰的“地形图”,让你能基于自己的技术背景和项目需求,做出明智的选择,并成功抵达目的地。
2. 路径抉择:三种安装方案的深度剖析
面对官方支持的缺失,我们主要有三条路可以走:使用社区维护的二进制包、从源代码编译、或者采用容器化技术。每一种方案都代表着不同的复杂度、灵活度和系统侵入度。没有最好的,只有最适合你当前场景的。
2.1 方案一:社区二进制包——最快捷的“非官方”正道
这是最接近原生安装体验的方法。虽然ROS官方没有为22.04提供包,但一些社区成员和机构维护着针对新系统的构建版本。其中最著名的是来自RoboStack频道的ros-noetic-desktop-full包。
原理与风险:社区维护者利用ROS的构建农场(build farm)工具链,在Ubuntu 22.04的环境下重新编译了Noetic的源代码,生成了适用于Jammy的.deb安装包。这省去了用户自己编译的麻烦。但风险在于,其维护完全依赖于社区志愿者的精力,可能不会像官方包那样及时同步所有更新和安全补丁。此外,由于22.04的基础库(如Python 3.10, OpenCV 4.5等)与20.04不同,编译出的二进制包可能与某些预期行为有细微差别。
具体操作步骤:
配置软件源:首先需要将RoboStack的仓库添加到你的APT源列表中。这通过一个
apt-key和添加源文件来完成(请注意,apt-key的方式在最新Debian/Ubuntu中已被弃用,但许多社区源仍在使用)。sudo apt update sudo apt install curl gnupg lsb-release curl -s https://raw.githubusercontent.com/RoboStack/ros-noetic/main/ros-noetic-keyring.gpg | sudo tee /usr/share/keyrings/ros-noetic-archive-keyring.gpg > /dev/null echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-noetic-archive-keyring.gpg] https://robostack.github.io/ros-noetic $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros-noetic.list这里的关键是
$(lsb_release -cs)会自动获取你的系统代号(如jammy),确保添加的是对应你系统的仓库。安装ROS:更新软件列表并安装桌面完整版。
sudo apt update sudo apt install ros-noetic-desktop-full这个过程会下载数百兆的包,并自动处理大部分依赖。
环境配置:和官方安装一样,需要将ROS环境变量添加到你的shell配置文件中。
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc为了使用ROS命令行工具,还需要安装
ros-noetic-rosbash等基础工具包。sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential sudo rosdep init rosdep update
实操心得与避坑指南:
- 网络问题:
rosdep init和update步骤常因网络问题失败。可以尝试修改/etc/hosts文件,添加对raw.githubusercontent.com的IP解析,或使用国内镜像源。 - 验证安装:安装完成后,务必运行
roscore来测试核心服务是否能正常启动。再打开一个新终端,运行rosrun turtlesim turtlesim_node和rosrun turtlesim turtle_teleop_key,看看经典的小乌龟模拟器能否正常工作。这是检验ROS基础功能是否完好的“试金石”。 - 后续更新:通过此方法安装后,可以使用
sudo apt update && sudo apt upgrade来获取社区维护的更新,但频率和稳定性需要观察。
2.2 方案二:从源代码编译——最彻底也最复杂的掌控
如果你需要对ROS本身进行修改,或者希望绝对控制编译选项和依赖版本,从源码编译是唯一的选择。这也是当社区包无法满足需求时的终极解决方案。
为什么选择源码编译?除了上述原因,源码编译还能让你在22.04上构建出理论上与20.04官方二进制包行为最一致的ROS环境,因为你可以严格控制依赖库的版本。但代价是巨大的时间成本和出现编译错误的概率。
核心步骤与关键配置:
系统准备:安装基础编译工具和ROS的一些核心依赖。
sudo apt update sudo apt install python3-rosdep python3-rosinstall-generator python3-wstool build-essential python3-osrf-pycommon sudo rosdep init rosdep update创建工作空间并下载源码:我们使用
wstool来管理多个仓库的源码。mkdir -p ~/ros_noetic_ws/src cd ~/ros_noetic_ws rosinstall_generator desktop_full --rosdistro noetic --deps --tar > noetic-desktop-full.rosinstall wstool init src noetic-desktop-full.rosinstall这一步会下载一个
.rosinstall文件,里面定义了桌面完整版所需的所有软件包仓库地址和版本,然后wstool init会根据这个文件去拉取代码。网络状况不好的话,这个过程可能极其漫长且容易中断。解决依赖:这是源码编译中最容易出错的一环。
rosdep会尝试根据每个包的package.xml文件来安装系统依赖。cd ~/ros_noetic_ws rosdep install --from-paths src --ignore-src -y --os=ubuntu:jammy关键参数解析:
--os=ubuntu:jammy至关重要!它告诉rosdep你现在是jammy系统,而不是noetic默认的focal。rosdep会去查询针对jammy的ROS包依赖规则,如果找不到,它会回退到通用的或者focal的规则,这可能导致依赖安装不准确。编译:使用
catkin_make或更现代的catkin build进行编译。./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release # 或者使用catkin_tools # sudo apt install python3-catkin-tools # catkin build编译过程视机器性能而定,可能需要数小时。期间可能会因为Ubuntu 22.04上某些库版本过高而报错,例如
PCL(点云库)或OpenCV相关的编译错误。
踩坑实录:依赖版本冲突的解决: 我在编译过程中遇到一个典型错误:PROJECT包找不到PCL的某个组件。原因是Ubuntu 22.04的libpcl-dev版本是1.12,而ROS Noetic源码期望的可能是1.10。解决方法不是降级系统包(可能引发其他问题),而是修改ROS包的CMakeLists.txt。需要找到报错包的源码,在其CMakeLists.txt中,将find_package(PCL 1.10 REQUIRED COMPONENTS ...)中的版本要求1.10改为1.12,或者直接移除版本号指定find_package(PCL REQUIRED COMPONENTS ...)。这要求你对CMake和该包有一定了解。这就是源码编译的常态:你不仅是使用者,还是临时的集成工程师。
2.3 方案三:容器化方案——最干净利落的隔离术
如果你追求极致的系统纯净度,或者需要在同一台机器上频繁切换ROS1/ROS2甚至不同版本,那么Docker容器几乎是完美选择。它本质上是为ROS1 Noetic创建一个基于Ubuntu 20.04的微型虚拟环境,与宿主机的22.04完全隔离。
优势与劣势对比:
- 优势:
- 环境纯净:完全复刻官方支持的环境,0兼容性问题。
- 隔离安全:不会污染宿主机系统,玩坏了删掉容器重来就行。
- 可移植性:镜像可以分享,在任何安装Docker的22.04、20.04甚至其他Linux发行版上运行结果一致。
- 多版本共存:可以同时运行ROS Noetic、ROS2 Galactic/Humble的容器,互不干扰。
- 劣势:
- 性能开销:有轻微的性能损耗,对于GUI应用需要额外配置。
- 使用复杂度:需要学习基本的Docker命令,图形和硬件(如摄像头、GPU、USB设备)接入需要额外映射。
- 开发体验:编辑容器内的代码不如直接编辑宿主机文件方便,通常需要挂载卷(volume)。
从拉取镜像到运行可视化节点的全流程:
安装Docker:在Ubuntu 22.04上安装Docker引擎。
sudo apt update sudo apt install docker.io sudo systemctl enable --now docker # 将当前用户加入docker组,避免每次用sudo sudo usermod -aG docker $USER # 退出终端重新登录生效获取ROS镜像:从Docker Hub拉取官方ROS镜像。这里我们选择带有桌面环境的
noetic-desktop-full。docker pull osrf/ros:noetic-desktop-full运行容器并开启GUI:这是关键一步,让容器内的ROS程序能显示窗口。
xhost +local:docker # 允许Docker连接本地X11服务器 docker run -it --rm \ --env="DISPLAY" \ --env="QT_X11_NO_MITSHM=1" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ osrf/ros:noetic-desktop-full \ /bin/bash解释一下参数:
-it交互式终端,--rm退出后自动删除容器,--env传递显示相关的环境变量,--volume将宿主机的X11套接字挂载到容器内。在容器内使用ROS:现在你进入了一个全新的bash终端,其根文件系统是Ubuntu 20.04。按照ROS官方教程初始化环境即可。
source /opt/ros/noetic/setup.bash roscore & rosrun turtlesim turtlesim_node # 此时小乌龟窗口应该会出现在你的宿主机屏幕上!
高级技巧:使用Docker Compose和持久化工作空间: 对于复杂项目,建议使用docker-compose.yml来定义服务,并挂载一个宿主机目录到容器内作为ROS工作空间,这样代码可以持久化并在宿主机上用喜欢的IDE编辑。
version: '3' services: ros-noetic: image: osrf/ros:noetic-desktop-full container_name: my_ros_noetic network_mode: host # 方便与宿主机其他服务通信 environment: - DISPLAY=${DISPLAY} - QT_X11_NO_MITSHM=1 volumes: - /tmp/.X11-unix:/tmp/.X11-unix:rw - ./ros_ws:/home/ros_ws:rw # 将当前目录下的ros_ws挂载到容器 stdin_open: true tty: true command: bash -c "source /opt/ros/noetic/setup.bash && cd /home/ros_ws && /bin/bash"然后使用docker-compose run ros-noetic启动一个交互式容器,你的工作空间就在./ros_ws里。
3. 安装后的核心挑战与系统性解决方案
无论通过哪种方式在22.04上成功安装了ROS1,真正的挑战才刚刚开始。系统底层的差异会像暗礁一样,在你运行具体功能包时逐一浮现。主要集中在Python 3、C++库版本和系统服务这几个层面。
3.1 Python 3.10 兼容性:从语法到模块的全面适配
Ubuntu 22.04 默认使用 Python 3.10,而 ROS Noetic 官方设计是基于 Python 3.8。Python 3.8 到 3.10 有一些不兼容的变更,虽然大部分ROS核心包已做适配,但大量第三方或你自己编写的Python节点可能出问题。
典型问题1:collections模块导入错误这是最常见的问题。在Python 3.10中,collections模块中的一些抽象基类如Iterable,Callable等需要从collections.abc子模块导入。而很多旧的ROS Python代码直接使用from collections import Iterable。
- 错误信息:
ImportError: cannot import name 'Iterable' from 'collections' - 解决方案:修改你的Python脚本,将导入语句改为:
对于大量文件,可以使用# 旧代码 from collections import Iterable, Callable # 新代码 from collections.abc import Iterable, Callablesed命令进行批量替换,但务必谨慎,先备份。find . -name "*.py" -exec sed -i "s/from collections import/from collections.abc import/g" {} \; # 注意:这个命令可能误伤,最好在版本控制下操作,或手动检查关键文件。
典型问题2:typing模块的变化Python 3.9/3.10 对typing模块做了大量优化,引入了list,dict等泛型语法糖。虽然这通常不会导致直接错误,但如果你在代码中使用了较新的typing特性(如在 Noetic 环境中开发,但用到了 3.9+ 的语法),在旧的 Python 3.8 环境下可能会报错。在 22.04 上这反而是优势,但如果你写的代码需要兼容官方 20.04 环境,则需要注意。
系统性排查与测试: 建议为你的ROS项目创建一个基于 Python 3.10 的虚拟环境(如venv),在其中安装catkin的 Python 工具包(catkin_tools等),然后运行你的 Python 节点。这样可以在隔离环境中提前发现所有导入和语法错误。
3.2 系统库版本冲突:以OpenCV和PCL为例
ROS Noetic 官方二进制包链接的是 Ubuntu 20.04 仓库中的库版本,例如 OpenCV 4.2。而 Ubuntu 22.04 默认提供了 OpenCV 4.5(或更高)。如果你的 ROS 包(无论是二进制安装还是源码编译)在运行时动态链接了系统路径下更新的库,可能会遇到 ABI(应用程序二进制接口)不兼容的问题,导致崩溃或诡异的行为。
症状:程序在启动时或执行到特定功能(如图像处理)时,发生段错误(Segmentation fault)或抛出关于符号未找到(undefined symbol)的运行时错误。
诊断方法:使用ldd命令查看可执行文件或共享库的依赖。
ldd /opt/ros/noetic/lib/<package_name>/<node_name> | grep opencv查看输出中libopencv_core.so.4.2链接的是否是系统路径(如/usr/lib/x86_64-linux-gnu/)下的4.5版本。如果存在这种混用,就是风险的源头。
解决方案:
- 优先方案:使用ROS自带的库。确保你的
CMakeLists.txt中,find_package(OpenCV REQUIRED)找到的是ROS环境下的OpenCV(通常路径是/opt/ros/noetic)。在编译时,CMake的find_package会设置链接路径。你可以通过检查编译输出的-I和-L参数来确认。 - 隔离方案:使用LD_LIBRARY_PATH。在启动ROS节点前,通过修改
LD_LIBRARY_PATH环境变量,优先加载ROS自带的库目录。
可以将这行命令写入你的启动脚本(export LD_LIBRARY_PATH=/opt/ros/noetic/lib:$LD_LIBRARY_PATH rosrun your_package your_node.launch文件或 shell 脚本)。 - 终极方案:容器化。如前所述,Docker 容器能彻底根除此类问题,因为它提供了完全一致的库环境。
对于PCL(点云库),问题类似。Ubuntu 22.04 的libpcl-dev是 1.12+,而 Noetic 预期是 1.10。如果源码编译时通过了,但运行时链接了错误版本,同样会崩溃。解决方法同样是确保链接路径的正确性。
3.3 系统服务与守护进程:udev规则与串口权限
机器人开发离不开硬件,USB设备(如激光雷达、IMU、控制器)的接入依赖系统的udev规则和用户组权限。这些配置是系统层面的,与ROS版本无关,但在新系统上设置是必要步骤。
串口权限问题:默认情况下,普通用户无法直接读写串口设备(如/dev/ttyUSB0)。
- 临时解决:每次使用
sudo chmod 666 /dev/ttyUSB0,但设备重插后失效。 - 永久解决:将用户加入
dialout组。
重要:执行此命令后,你需要完全退出当前登录会话(注销并重新登录),或者重启电脑,用户组变更才会生效。仅仅新开一个终端是不够的。sudo usermod -a -G dialout $USER
udev规则配置:为了让设备拥有固定的设备名和权限,需要创建 udev 规则。例如,为特定型号的激光雷达创建规则:
- 找到设备的供应商ID和产品ID:
lsusb命令查看。 - 在
/etc/udev/rules.d/下创建规则文件,如99-sick-lms.rules:
这条规则为特定USB转串口设备设置了权限,并创建了一个固定的符号链接SUBSYSTEM=="tty", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0001", MODE:="0666", SYMLINK+="sick_lms"/dev/sick_lms。 - 重新加载udev规则并触发:
sudo udevadm control --reload-rules && sudo udevadm trigger。 - 重新插拔设备,现在就可以使用
/dev/sick_lms来访问设备,且无需sudo。
这些硬件配置步骤在Ubuntu 22.04上与在20.04上完全一致,但正是在新系统上搭建环境时最容易忽略的一环,导致ROS节点启动后报“无法打开端口”的错误。
4. 实战检验:构建与运行一个经典功能包
理论说得再多,不如亲手跑通一个例子。我们选择在ROS中集成和运行一个经典的SLAM(同步定位与建图)算法包——gmapping,它可以将激光雷达数据转换为地图。这个流程涵盖了创建ROS工作空间、下载源码、解决依赖、编译、运行和调试的完整生命周期,能暴露大部分潜在问题。
4.1 创建工作空间与获取源码
首先,我们创建一个独立的工作空间,与ROS系统路径隔离,这是ROS开发的推荐做法。
# 假设我们采用社区二进制包安装的ROS source /opt/ros/noetic/setup.bash mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src接下来,我们需要获取gmapping的源代码。gmapping是slam_gmapping包的一部分。我们可以直接使用git克隆,或者用wstool(如果工作空间是用它初始化的)。这里用更通用的git:
git clone https://github.com/ros-perception/slam_gmapping.git cd ~/catkin_ws现在,~/catkin_ws/src目录下应该有了slam_gmapping的代码。
4.2 解决依赖与编译过程中的排错
在编译之前,必须解决所有依赖。使用rosdep工具。
cd ~/catkin_ws rosdep install --from-paths src --ignore-src -y注意:如果你在Ubuntu 22.04上,并且rosdep数据库没有正确适配jammy,这一步可能会报错,提示找不到某些包的规则。错误可能类似于:
ERROR: the following packages/stacks could not have their rosdep keys resolved to system dependencies: slam_gmapping: No definition of [gmapping] for OS version [jammy]这是因为rosdep的默认规则文件里,gmapping的键值可能只定义了focal的依赖。解决方法有两种:
- 本地覆盖规则:在
/etc/ros/rosdep/sources.list.d/下创建一个自定义的规则文件,例如20-custom.list,指向一个包含jammy规则的本地YAML文件。但这比较繁琐。 - 手动安装依赖:查看
slam_gmapping包中package.xml文件,找到<run_depend>或<exec_depend>标签。对于gmapping,其核心依赖通常是openslam-gmapping。在Ubuntu 22.04上,你可以尝试安装同名包:
如果找不到,可能需要从源码编译sudo apt install ros-noetic-openslam-gmappingopenslam-gmapping。这正是在22.04上常见的“依赖链断裂”问题。
假设我们解决了依赖,开始编译:
catkin_make # 或者使用catkin build (需先安装 catkin_tools: sudo apt install python3-catkin-tools) # catkin build编译过程可能会顺利,也可能会因为之前提到的Python 3.10语法或库版本问题而失败。例如,如果gmapping的某个Python工具脚本使用了旧的collections导入方式,就会在编译的“生成消息”或“设置步骤”中报错。你需要定位到具体文件并进行修改。
4.3 运行测试与可视化调试
编译成功后,需要刷新工作空间的环境。
source ~/catkin_ws/devel/setup.bash现在,我们可以尝试运行gmapping节点。但gmapping需要激光雷达数据。为了测试,我们通常使用ROS的仿真工具turtlebot3或stage来提供模拟的激光数据。这里以播放一个已有的激光数据包(bag文件)为例,这是一种更简单的测试方法。
- 准备数据:首先,你需要一个记录了激光雷达话题(通常是
/scan)的.bag文件。可以从ROS官网或一些开源数据集下载。 - 启动
gmapping:在一个终端中,启动gmapping节点,并指定正确的参数,比如激光话题名。
默认的启动文件可能假设激光话题是roslaunch gmapping slam_gmapping.launch/scan。如果不对,你需要修改启动文件或通过参数传入:roslaunch gmapping slam_gmapping.launch scan_topic:=/your_scan_topic。 - 播放数据包:在另一个终端,播放bag文件。
rosbag play your_laser_data.bag --clock--clock参数很重要,它发布模拟的时钟信号,很多节点依赖它。 - 查看地图:再打开一个终端,启动
rviz,这是ROS的可视化工具。
在rvizrviz中,添加一个Map显示类型,将其Topic设置为/map。随着bag文件的播放,你应该能看到地图被逐渐构建出来。
调试实战:
- 问题:
rviz中看不到地图,或者地图是空的。 - 排查思路:
- 检查话题:在终端运行
rostopic list,确保有/scan(激光数据)和/map(地图数据)话题。如果没有/map,说明gmapping节点没有成功发布。 - 检查节点状态:
rosnode list查看节点是否存活,rosnode info /slam_gmapping查看节点详情和订阅发布的话题。 - 查看日志:
roslaunch的输出、各个终端的输出,以及roscore的日志中是否有错误信息。常见的错误包括:激光话题名不匹配、坐标系(tf)变换树不完整、激光数据格式不正确等。 - 检查
tf:gmapping需要知道激光雷达相对于机器人基座(base_link)的位置关系。运行rosrun tf view_frames可以生成当前tf树的PDF,查看是否有缺失的链接。如果使用bag文件,需要确保bag里包含了必要的tf变换信息,或者通过static_transform_publisher发布静态变换。
- 检查话题:在终端运行
通过这样一个完整流程,你不仅验证了ROS1在22.04上的基本功能,还实战演练了从源码到运行的全过程,遇到的每一个错误和解决过程,都是对系统兼容性理解的加深。
5. 长期维护与迁移建议
在Ubuntu 22.04上运行ROS1,不是一个一劳永逸的安装动作,而是一个需要持续维护的状态。你需要为未来的系统更新、ROS包更新以及最终的迁移做好准备。
5.1 系统升级与ROS的脆弱平衡
Ubuntu 22.04本身会通过常规更新推送安全补丁和软件包更新。大多数更新是安全的,但偶尔会有库的次版本升级(例如从OpenCV 4.5.4升级到4.5.5)。对于通过社区二进制包安装的ROS,只要社区维护者及时跟进重建,通常问题不大。但对于源码编译的ROS,或者那些链接了系统库的ROS包,任何底层库的ABI变化都可能导致运行时崩溃。
维护策略:
- 谨慎进行系统更新:在更新系统前(特别是执行
sudo apt upgrade),最好先查看将要更新的包列表(sudo apt list --upgradable)。如果看到关键的底层库(如libstdc++,libgcc,libopencv*,libpcl*)有更新,需要提高警惕。 - 创建系统快照:如果使用虚拟机或支持系统快照的环境(如VirtualBox、VMware),在进行重大系统更新前创建一个快照。如果更新导致ROS环境崩溃,可以快速回滚。
- 隔离测试环境:对于生产或重要的开发环境,可以考虑使用Docker容器。宿主机系统可以自由升级,只要Docker守护进程兼容,容器内的ROS环境完全不受影响。
5.2 向ROS2迁移的必然性与路径规划
必须清醒认识到,ROS1已进入维护阶段,社区的发展重心和绝大多数新特性都在ROS2上。Ubuntu 22.04有官方原生支持的ROS2发行版:Humble Hawksbill(支持到2027年)和Jammy对应的Rolling。长期来看,向ROS2迁移是必然选择。
迁移不是替换,而是重构:ROS2并非ROS1的简单升级,它在架构(去中心化、实时性)、通信机制(DDS)、构建系统(ament/colcon)等方面有根本性变化。迁移一个项目意味着代码的重写或大量修改。
渐进式迁移路径建议:
- 评估与学习:首先,用一个小型、非核心的项目尝试ROS2。在Ubuntu 22.04上安装ROS2 Humble (
sudo apt install ros-humble-desktop),熟悉其基本概念、命令行工具和API。 - 识别桥梁工具:
- ros1_bridge:这是一个功能强大的包,可以在同一网络内,让ROS1和ROS2的节点相互通信(发布/订阅话题,调用/提供服务)。你可以在22.04上同时运行ROS1 Noetic(通过本文方法)和ROS2 Humble,然后用
ros1_bridge连接它们。这允许你将系统的一部分逐步迁移到ROS2,而另一部分暂时保留在ROS1。 - 迁移指南:ROS官方提供了详细的迁移指南,从概念对比到代码逐行修改示例。
- ros1_bridge:这是一个功能强大的包,可以在同一网络内,让ROS1和ROS2的节点相互通信(发布/订阅话题,调用/提供服务)。你可以在22.04上同时运行ROS1 Noetic(通过本文方法)和ROS2 Humble,然后用
- 制定项目迁移计划:对于大型项目,不要试图一次性全部迁移。可以按功能模块拆分,先迁移数据流简单、依赖少的模块,利用
ros1_bridge与原系统交互,逐步扩大ROS2模块的范围,最终完全取代ROS1。
在22.04上并存的优势:正因为Ubuntu 22.04是ROS2 Humble的官方支持平台,同时又可以通过非官方手段运行ROS1,它实际上成为了一个理想的过渡环境。你可以在这个系统上同时搭建和测试ROS1与ROS2的组件,进行直接的对比和桥接实验,为最终迁移积累宝贵的经验。
回过头来看最初的问题,“Ubuntu 22.04安装和使用ROS1可行吗?” 答案已经非常清晰:技术上完全可行,但这是一条需要付出额外努力、具备一定排错能力、并且清楚知晓其过渡性质的路径。对于初学者,如果条件允许,从Ubuntu 20.04开始学习ROS1仍然是阻力最小的选择。但对于已经身处22.04环境,且有明确需求或探索精神的开发者,本文提供的三种路径和全方位的避坑指南,足以让你搭建起一个可用的、甚至稳定的ROS1开发环境。最关键的是,在这个过程中培养出的问题解决能力和对系统更深的理解,其价值远超一次简单的安装。最终,所有的这些努力都应该指向一个目标:高效地完成你的机器人项目,并为拥抱ROS2的未来做好准备。