尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

ROS环境彻底卸载与纯净安装指南:从清理到部署完整实践

ROS环境彻底卸载与纯净安装指南:从清理到部署完整实践 1. 项目概述一次彻底的ROS环境重建搞机器人开发尤其是用ROSRobot Operating System的朋友估计都经历过环境崩掉的绝望。不管是版本升级、依赖冲突还是手滑误操作一个不干净的ROS环境就像房间里堆满的杂物新项目根本无从下手。我最近就因为从ROS Noetic迁移到ROS 2 Humble被旧环境残留的“幽灵”依赖折腾得够呛最终决定彻底推倒重来。这个过程远不是sudo apt remove ros-*那么简单它涉及到包管理、环境变量、工作空间源码、甚至系统级配置的深度清理。这篇文章就是我这次“血泪史”的完整复盘和总结。我将详细拆解在Ubuntu系统上如何安全、彻底地卸载一个已有的ROS发行版以ROS Noetic和ROS 2 Humble为例并从头开始安装一个纯净的新环境。无论你是ROS 1的老用户想尝鲜ROS 2还是单纯想解决当前环境“玄学”报错这篇手把手的指南都能帮你避开我踩过的所有坑实现一次真正“亲测有效”的环境重置。我们会从最根本的清理逻辑讲起覆盖所有可能残留的角落再一步步搭建起稳固的新环境。2. ROS卸载的深度解析与“外科手术式”清理很多人认为卸载ROS就是删除软件包这其实是个巨大的误区。一个完整的ROS环境由四层构成APT软件包、用户环境配置、工作空间源码与构建产物、以及潜在的全局配置与缓存。只清理第一层后三层留下的“残骸”就是未来所有问题的根源。2.1 核心清理逻辑与潜在风险为什么不能简单粗暴地sudo apt purge ros-*首先通配符ros-*可能误伤名称中包含“ros”的其他无关软件包导致系统不稳定。其次ROS的核心包如ros-noetic-desktop-full与数百个依赖包形成复杂的网状结构APT在卸载时如果这些依赖包也被其他系统软件需要它们会被保留。这些残留的依赖库版本可能与新ROS版本冲突。更隐蔽的是环境变量。ROS依赖source /opt/ros/distro/setup.bash将大量路径注入到你的终端会话中。卸载软件包后/opt/ros/distro/目录被删除但如果你在~/.bashrc中保留了source命令或者之前source过的工作空间devel/setup.bash或install/local_setup.bash还在那么终端里就会存在指向不存在路径的变量导致任何ros*、roscd等命令报“找不到命令”或“目录不存在”的错误污染你的命令行环境。工作空间catkin或colcon build是另一个重灾区。你编写的所有源码、以及编译生成的build,devel,install目录都独立于APT管理。即使卸载了系统ROS包这些目录依然存在。如果你在新环境中不小心source了旧工作空间的setup文件就会引入旧的、可能不兼容的库和消息定义引发难以调试的链接错误或运行时崩溃。2.2 分步式彻底卸载操作指南基于以上逻辑我们必须进行分层、精确的清理。以下操作假设你当前系统安装的是 ROS Noetic 或 ROS 2 Humble/Humble请根据你的实际情况替换distro为noetic,humble,foxy等。第一步精确移除ROS软件包首先通过APT精确移除ROS核心元包及其相关包而不是使用通配符。# 对于 ROS Noetic sudo apt remove --purge ros-noetic-* # 对于 ROS 2 Humble sudo apt remove --purge ros-humble-*--purge参数会同时删除软件包的配置文件。这条命令会移除所有以ros-distro-开头的包相对安全。执行后APT会列出将被移除的包列表请务必快速浏览一下确认没有误伤关键系统包如python3-rosdep这类工具包可能也会被移除这没关系。第二步清理残留依赖和配置ROS安装时会引入大量依赖。卸载主包后这些依赖可能变成“无人认领”的孤儿包占用空间且可能冲突。我们需要清理它们并修复可能的包数据库问题。# 自动移除不再需要的依赖包 sudo apt autoremove --purge # 清理下载的软件包缓存可选可释放空间 sudo apt clean # 检查并修复损坏的依赖关系 sudo apt --fix-broken install第三步清除环境变量配置这是关键一步确保新开终端时不会自动加载不存在的ROS环境。打开你的Shell配置文件通常是~/.bashrc如果你使用zsh则是~/.zshrc。nano ~/.bashrc仔细检查文件末尾找到与ROS相关的source行。它们通常长这样source /opt/ros/noetic/setup.bash source ~/catkin_ws/devel/setup.bash # 或者对于ROS 2 source /opt/ros/humble/setup.bash source ~/ros2_ws/install/local_setup.bash在这些行的行首添加#符号将其注释掉或者直接删除这些行。# source /opt/ros/noetic/setup.bash # source ~/catkin_ws/devel/setup.bash保存并退出编辑器在nano中按CtrlX然后按Y再按Enter。让当前终端立即生效或者直接关闭终端重新打开source ~/.bashrc第四步核弹级选项——删除工作空间如果你确定不再需要旧项目或者想从一个绝对干净的状态开始可以直接删除整个工作空间目录。此操作不可逆请务必先确认已备份重要源码# 假设你的工作空间在 ~/catkin_ws 或 ~/ros2_ws rm -rf ~/catkin_ws ~/ros2_ws如果你有多个工作空间请一并处理。如果不确定可以先重命名目录作为备份mv ~/catkin_ws ~/catkin_ws_backup第五步清理用户级缓存和配置一些ROS工具会在你的家目录下生成缓存和配置文件例如~/.ros/。这个目录存放着节点日志、参数缓存等。彻底清理可以避免旧缓存干扰。rm -rf ~/.ros/对于ROS 2可能还有~/.ros2/目录如果存在。第六步可选但推荐重置rosdeprosdep是用于安装系统依赖的工具。它的缓存可能包含旧版本的信息。重置它有助于在新安装时获取正确的依赖列表。sudo rm -rf /etc/ros/rosdep/sources.list.d/20-default.list sudo rosdep init # 这一步可能会失败如果提示文件已存在可以忽略 rosdep update重要提示在执行任何删除命令尤其是rm -rf前请反复确认路径。一个在根目录下误打的空格如rm -rf / catkin_ws可能导致灾难性后果。建议先使用ls命令列出目录确认。完成以上所有步骤后你的系统应该已经基本清除了ROS的痕迹。可以通过在终端中输入roscore或ros2等命令来验证系统应该提示“命令未找到”。此时我们便拥有了一个干净的“手术台”可以开始安装新的ROS了。3. ROS安装的精细化部署与验证卸载干净后安装过程反而相对标准。但“标准”不等于可以无脑复制粘贴每一步的选择和验证都决定了最终环境的稳定性。这里我们以在Ubuntu 22.04上安装ROS 2 Humble Hawksbill为例因为这是当前撰写时推荐的LTS长期支持版本。ROS Noetic在Ubuntu 20.04上的安装流程类似主要区别在于软件源和包名。3.1 安装前的系统准备与源配置一个常见的误区是直接添加ROS源而忽略了系统软件源和基础工具的配置。这可能导致后续安装因网络或依赖问题失败。首先确保你的Ubuntu系统软件源是最新的并且启用了“universe”仓库这是许多ROS依赖所在的社区维护仓库。sudo apt update sudo apt upgrade -y sudo apt install software-properties-common -y sudo add-apt-repository universe接下来需要将ROS 2的官方软件源添加到你的系统。这里强烈建议使用国内镜像源以大幅提升下载速度。清华大学和中科大的镜像都是优秀的选择。以下以清华源为例# 设置locale确保正确解析字符 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 LANGen_US.UTF-8 # 添加ROS 2 GPG密钥 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 # 将ROS 2仓库源添加到系统使用清华镜像 echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null注意$(lsb_release -cs)会自动获取你的Ubuntu版本代号如Jammy。确保你安装的ROS 2版本与Ubuntu版本兼容。Humble支持Jammy22.04。3.2 核心软件包安装与差异化选择更新软件源缓存后就可以安装ROS 2了。ROS 2提供了不同规模的套件ros-humble-ros-base仅包含通信库、消息包和命令行工具。适合嵌入式计算或对空间有严格限制的场景。ros-humble-desktop包含ros-base外加GUI工具如Rviz2、rqt和部分教程。适合大多数桌面开发者。ros-humble-desktop-full包含desktop外加机器人仿真库如Gazebo、导航、感知等大量功能包。功能最全但体积也最大。对于初学者和大多数开发者我推荐安装ros-humble-desktop。它提供了必要的开发工具又不会像desktop-full那样引入过多你可能暂时用不到的包减少潜在冲突。sudo apt update sudo apt install ros-humble-desktop安装过程会持续一段时间取决于你的网速需要下载几百MB到上GB的数据。如果中途遇到某个包下载失败网络超时可以重复运行sudo apt install ros-humble-desktopAPT会继续尝试下载未完成的包。3.3 环境配置与持久化生效安装完成后ROS 2的核心文件位于/opt/ros/humble/。要让系统知道如何使用它们必须“激活”环境。source /opt/ros/humble/setup.bash这条命令只在当前终端窗口有效。一旦关闭终端环境就失效了。为了永久生效我们需要将这条命令添加到Shell的启动配置文件中就像我们之前清理旧环境时做的那样。echo source /opt/ros/humble/setup.bash ~/.bashrc这样每次新开终端ROS 2环境都会自动配置好。如果你使用其他Shell如zsh请将~/.bashrc替换为对应的配置文件如~/.zshrc。3.4 安装后必备工具与依赖管理仅有ROS核心还不够我们还需要两个关键工具colcon和rosdep。colcon是ROS 2的构建工具相当于ROS 1的catkin_make。用于编译你的工作空间。sudo apt install python3-colcon-common-extensionsrosdep是一个用于安装ROS包所需系统依赖的利器。它通过读取包内的package.xml文件自动安装所有必要的系统库如OpenCV、PCL等。在编译任何来自社区的ROS包之前都应该先运行rosdep install。sudo apt install python3-rosdep2 # 初始化rosdep如果之前彻底清理过 sudo rosdep init # 更新rosdep的数据库从ROS官方服务器获取依赖规则 rosdep update实操心得rosdep update有时会因为网络问题失败。如果遇到可以尝试修改其源为国内镜像。编辑/etc/ros/rosdep/sources.list.d/20-default.list将其中的raw.githubusercontent.comURL替换为ghproxy.com代理的URL或国内镜像地址。这是一个常见的提速技巧。3.5 安装完整性验证与快速测试安装完成后必须进行验证。一个完整的验证流程应该覆盖核心命令行工具、C和Python客户端库、以及可视化工具。基础命令测试打开一个新的终端确保环境已加载运行ros2 --help你应该能看到一长串可用的ros2子命令列表而不是“命令未找到”。节点通信测试C/PythonROS的核心是进程间通信。我们启动一个“说话”的节点和一个“听话”的节点来测试。终端1启动一个发布字符串消息的节点C实现ros2 run demo_nodes_cpp talker终端2启动一个订阅并打印这些消息的节点Python实现ros2 run demo_nodes_py listener你应该在终端1看到Publishing: Hello World: 计数在终端2看到I heard: [Hello World: 计数]。这证明ROS 2的核心通信机制DDS、C和Python客户端库都工作正常。可视化工具测试关闭上述两个节点按CtrlC。测试Rviz2这是ROS最重要的可视化工具。rviz2如果Rviz2图形界面成功启动说明GUI相关的依赖也已就绪。创建工作空间测试最后测试我们自己的开发流程是否通畅。mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build即使src目录为空colcon build也应该能成功执行并生成build,install,log目录。然后在工作空间内source本地配置source install/local_setup.bash至此一个完整、纯净、可用的ROS 2开发环境已经搭建成功。4. 跨版本迁移与混合环境管理实战有时我们的需求不是简单的卸载重装而是需要在同一台机器上维护多个ROS版本例如同时进行ROS 1 Noetic和ROS 2 Humble的开发或者从ROS 1平滑迁移到ROS 2。这比单一环境管理要复杂得多核心矛盾在于环境变量的隔离。4.1 多版本共存的环境隔离方案目标是在同一用户下根据需要灵活切换ROS 1或ROS 2环境且互不干扰。绝对不要将两个版本的setup.bash同时source进~/.bashrc。方案一手动切换推荐清晰可控不在~/.bashrc中固化任何ROS版本。每次打开终端后根据需要手动source。# 需要ROS 1 Noetic时 source /opt/ros/noetic/setup.bash # 需要ROS 2 Humble时 source /opt/ros/humble/setup.bash为了更方便可以创建别名alias放在~/.bashrc中# 在 ~/.bashrc 末尾添加 alias sros1source /opt/ros/noetic/setup.bash alias sros2source /opt/ros/humble/setup.bash alias sros1wssource ~/catkin_ws/devel/setup.bash alias sros2wssource ~/ros2_ws/install/local_setup.bash这样在终端里输入sros1就切换到ROS 1全局环境输入sros1ws则切换到ROS 1的某个工作空间环境会同时继承全局环境。ROS 2同理。这种方法逻辑清晰不易混淆。方案二使用环境管理脚本或工具对于更复杂的场景可以编写简单的Shell函数来切换环境。例如在~/.bashrc中添加function set_ros1() { # 取消可能存在的其他ROS环境 unset ROS_DISTRO unset ROS_VERSION unset ROS_PACKAGE_PATH # 设置ROS 1环境 source /opt/ros/noetic/setup.bash echo ROS 1 Noetic environment activated. } function set_ros2() { # 取消可能存在的其他ROS环境 unset ROS_DISTRO unset ROS_VERSION # 设置ROS 2环境 source /opt/ros/humble/setup.bash echo ROS 2 Humble environment activated. }使用set_ros1和set_ros2命令来切换。这个函数尝试先清理一些关键环境变量但请注意环境变量的完全清理非常困难因此手动切换方案一在实践中更可靠。核心原则一个终端会话只激活一个ROS发行版的环境。永远不要在同一个终端里先后source两个不同版本的ROS。4.2 ROS 1向ROS 2的迁移策略与桥接工具项目从ROS 1迁移到ROS 2并非一蹴而就尤其是当依赖的某些功能包尚未提供ROS 2版本时。ROS官方提供了ros1_bridge包它可以在同一台机器上运行双向转发ROS 1和ROS 2之间的消息是实现渐进式迁移的关键。安装ros1_bridge 前提是系统中已经同时安装了ROS 1和ROS 2。对于Noetic和Humble# 首先激活ROS 1环境安装必要的包 sros1 sudo apt install ros-noetic-ros1-bridge # 然后激活ROS 2环境安装对应的包 sros2 sudo apt install ros-humble-ros1-bridge使用ros1_bridge进行通信启动ROS 1核心roscore在新的终端启动ROS 2核心ros2 daemon start通常运行ROS 2节点时会自动启动在新的终端激活混合环境并启动桥接器。这一步至关重要必须同时加载ROS 1和ROS 2的环境# 先加载ROS 1再加载ROS 2最后加载ros1_bridge source /opt/ros/noetic/setup.bash source /opt/ros/humble/setup.bash # 编译ros1_bridge需要从源码编译以支持自定义消息 # 假设你的工作空间是 ~/bridge_ws mkdir -p ~/bridge_ws/src cd ~/bridge_ws/src git clone -b humble https://github.com/ros2/ros1_bridge.git cd ~/bridge_ws # 编译时需要指定两个版本的ROS路径 colcon build --symlink-install --packages-select ros1_bridge --cmake-force-configure在编译后的工作空间中启动动态桥接cd ~/bridge_ws source install/local_setup.bash ros2 run ros1_bridge dynamic_bridge此时桥接器会打印出它发现的可桥接的话题。默认情况下它会自动桥接所有在ROS 1和ROS 2中具有相同消息类型和话题名称的话题。迁移路径建议并行运行利用ros1_bridge让新开发的ROS 2组件与已有的ROS 1系统共存并通信。逐模块替换将系统划分为独立模块逐个将ROS 1模块重写或移植为ROS 2模块期间通过桥接保持整体系统运行。最终切换当所有关键功能都有ROS 2实现且经过充分测试后关闭ROS 1部分和桥接全面转向ROS 2。这种混合环境对系统管理要求更高务必做好笔记清晰记录每个终端窗口激活的是哪个环境避免操作混乱。5. 安装与使用过程中的典型问题全记录即便按照指南操作在实际安装和使用ROS时依然会遇到各种各样的问题。下面是我总结的、最高频出现的几个“坑”及其解决方案。5.1 软件源与网络问题排查这是安装失败最常见的原因尤其是在国内网络环境下。问题1sudo apt update时提示GPG error或NO_PUBKEY。Err:5 https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy InRelease The following signatures couldnt be verified because the public key is not available: NO_PUBKEY XXXXXXXXXXXXXXXX原因与解决缺少ROS软件源的GPG密钥或密钥已过期。重新下载并导入密钥# 移除可能存在的旧密钥文件 sudo rm -f /usr/share/keyrings/ros-archive-keyring.gpg # 重新下载密钥 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg # 再次更新 sudo apt update问题2sudo apt install ros-humble-desktop下载速度极慢或超时。原因与解决默认的ROS官方源服务器在国外。我们已经换成了清华源。如果依然慢可以尝试中科大源# 备份原有列表 sudo cp /etc/apt/sources.list.d/ros2.list /etc/apt/sources.list.d/ros2.list.bak # 编辑源列表将 tuna.tsinghua 替换为 mirrors.ustc.edu.cn/ros2 sudo sed -i s|mirrors.tuna.tsinghua.edu.cn/ros2|mirrors.ustc.edu.cn/ros2|g /etc/apt/sources.list.d/ros2.list sudo apt update也可以直接编辑/etc/apt/sources.list.d/ros2.list文件进行修改。问题3rosdep update失败连接raw.githubusercontent.com超时。原因与解决rosdep的默认规则文件托管在GitHub上。解决方法是指定国内镜像或使用代理。方法A修改rosdep源。编辑/etc/ros/rosdep/sources.list.d/20-default.list将所有的https://raw.githubusercontent.com替换为https://ghproxy.com/https://raw.githubusercontent.com。方法B手动下载规则文件。如果修改源无效可以尝试从Gitee等国内镜像手动下载并放置到对应目录但此方法较繁琐。5.2 环境变量冲突与“Command not found”幽灵问题4已经安装了ROS但终端提示ros2: command not found或roscore: command not found。原因与解决根本原因是环境变量没有正确加载。检查~/.bashrc确保source /opt/ros/humble/setup.bash这一行存在且没有被注释。手动source执行source ~/.bashrc或重新打开终端。检查路径确认/opt/ros/humble/bin目录是否存在并且该目录是否在$PATH环境变量中。可以执行echo $PATH | grep ros查看。多版本冲突如果你安装了多个版本确保~/.bashrc里只source了你当前想要的那个版本。用echo $ROS_DISTRO可以查看当前激活的发行版。问题5编译工作空间时找不到ROS包如find_package(roscpp REQUIRED)失败。原因与解决这通常是因为你忘记在编译前sourceROS的全局环境。对于catkin (ROS 1)source /opt/ros/noetic/setup.bash cd ~/catkin_ws catkin_make对于colcon (ROS 2)source /opt/ros/humble/setup.bash cd ~/ros2_ws colcon build务必养成习惯在编译任何ROS工作空间前先确认当前终端已source了正确版本的ROS基础环境。5.3 编译与依赖安装的常见陷阱问题6colcon build或catkin_make编译失败提示找不到头文件或链接库。原因与解决99%的情况是缺少系统依赖。这就是rosdep的用武之地。在工作空间的src目录下确保每个包都有正确的package.xml文件。在工作空间根目录运行rosdep install --from-paths src --ignore-src -r -y--from-paths src从src目录查找包。--ignore-src忽略已经是源码的包即src下的包。-r遇到错误继续安装而不是停止。-y对所有提示回答“yes”。 这个命令会自动安装所有在package.xml中声明但系统缺失的依赖。问题7编译时出现Python版本警告或错误例如Could not find a version that satisfies the requirement...。原因与解决ROS Noetic默认使用Python 3ROS 2 Humble也使用Python 3。但你的系统可能有多个Python版本或者pip指向了错误的版本。确认Python版本python3 --version。使用pip3而不是pip来安装Python包。对于ROS工作空间内的Python包尽量使用rosdep来管理依赖而不是手动pip install。如果必须用pip可以考虑在虚拟环境venv中操作避免污染系统Python环境。问题8Gazebo无法启动或启动后黑屏、模型加载失败。原因与解决Gazebo的依赖复杂且对硬件加速显卡驱动有要求。安装显卡驱动对于NVIDIA显卡务必安装专有驱动。可以通过“软件和更新”-“附加驱动”选项卡选择安装或使用命令行ubuntu-drivers工具。安装完整GazeboROS桌面版通常只安装Gazebo的ROS插件包Gazebo本体可能没装全。可以尝试安装完整版sudo apt install gazebo11 libgazebo11-dev # 对于ROS Noetic # 或 sudo apt install gazebo-fortress libgazebo-fortress-dev # 对于ROS 2 Humble (Gazebo Fortress)环境变量确保~/.bashrc中有export SVGA_VGPU100对于某些VMware虚拟机以及正确的GAZEBO_MODEL_PATH等环境变量设置。5.4 快速问题诊断清单当遇到问题时可以按以下清单自查能解决大部分“玄学”问题问题现象优先检查项常用命令/操作任何ros2/ros1命令未找到1. 是否source ~/.bashrc或重开终端2.~/.bashrc中source路径是否正确3. 是否安装了对应版本的ROS包echo $ROS_DISTRO,which ros2,ls /opt/ros/编译找不到ROS包/头文件1. 编译前是否source了ROS基础环境2.package.xml中依赖是否写对3. 是否用rosdep安装了系统依赖source /opt/ros/distro/setup.bash,rosdep check .节点无法通信1.roscore(ROS 1) 或ros2 daemon是否在运行2. 网络配置多机时是否正确3. 话题/服务名称是否拼写正确ros2 topic list,rostopic list,ping hostnameGazebo/Rviz2 黑屏/闪退1. 显卡驱动是否安装2. 是否启用了3D加速虚拟机3. 相关环境变量如DISPLAY是否正确nvidia-smi,glxinfo | grep render,echo $DISPLAYrosdep update失败1. 网络能否访问GitHub2. 是否修改了20-default.list为国内镜像ping raw.githubusercontent.com, 检查/etc/ros/rosdep/sources.list.d/记住ROS社区的Wiki、问答网站和GitHub Issues是极其宝贵的资源。遇到错误信息直接将其复制到搜索引擎中很大概率能找到解决方案。耐心和细致地阅读错误日志是解决ROS问题的终极法宝。
返回列表