ARTICLE DETAIL

资讯详情

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

ROS安装避坑:版本对应、源配置与软件包定位排查

ROS安装避坑:版本对应、源配置与软件包定位排查 1. 先把 ROS 版本关系理清楚后面能少走一半弯路装 ROS 这件事难的不是敲几条 apt 命令而是敲之前那几步判断。我见过太多人卡在E: Unable to locate package ros-noetic-desktop-full上折腾一下午最后发现问题根本不在网络上而是他的系统是 Ubuntu 22.04却非要装 Noetic。ROS 和 Ubuntu 是强绑定的发行版对不上官方源里压根没有这个包apt 当然定位不到。所以在动手之前花五分钟把版本关系、安装路线、以及我要拿它干什么想清楚比后面反复重装省事得多。这篇内容会从版本选型一路讲到定位不到软件包的完整排查链路无论你是刚入门想跑通小海龟的新手还是已经要接机械臂、做标定、跑 Gazebo 仿真的老手都能直接抄作业。1.1 ROS 1 和 ROS 2 到底该选哪个这是所有新手遇到的第一个岔路口而且这个问题没有标准答案只有看你的硬件和资料。ROS 1 的最后一个版本是 Noetic只支持 Ubuntu 20.04社区资料极其丰富网上你搜到的绝大多数机械臂教程、小车教程、标定教程都是基于它的。缺点也很明显它已经停止新功能开发通信依赖中心化的 Master 节点对多机、多进程、实时性的支持比较勉强。如果你的实验室有一台五年前的工控机或者你手里的机械臂、相机、底盘驱动包只有 catkin 版本那就老老实实装 Noetic别折腾。ROS 2 则是另一条路。它去掉了 Master 节点用 DDS 做发现和通信支持 QoS、生命周期管理、多机天然协同Ubuntu 22.04 对应 HumbleUbuntu 24.04 对应 Jazzy。现在买的新硬件、新传感器厂商给的驱动基本都优先出 ROS 2 版本。但代价是生态还在补很多老教程的代码拿过来直接编不过roscpp要换成rclcpplaunch 文件从 XML 变成 Python参数系统从动态重配置换成了声明式。我个人的建议很直接做课程作业、用老设备、需要海量现成教程兜底选 ROS 1 Noetic做新产品、要跑 micro-ROS、要做多机协同或者长期维护的项目直接上 ROS 2 Humble 起步别再犹豫。1.2 Ubuntu 版本与 ROS 发行版对照表这张表建议直接存书签。很多人定位不到软件包的第一原因就是这张表没对上。Ubuntu 版本代号ROS 1ROS 218.04bionicMelodic无官方20.04focalNoetic长期支持Foxy / Galactic22.04jammy无官方Humble长期支持24.04noble无官方Jazzy表里无官方三个字很关键。Ubuntu 22.04 上装 Noetic你会看到源加了、apt update也不报错但apt install ros-noetic-xxx永远是 Unable to locate package因为packages.ros.org上根本没有为 jammy 构建的 Noetic 包。同理Ubuntu 24.04 上装 Humble 也是白费力气。有人会想那我手动加 focal 的源不就行了我劝你别试混用不同 Ubuntu 代号的三方源轻则依赖冲突装不上重则把系统的 libc、libstdc 升级到不兼容的版本把桌面环境搞崩重装系统的代价远大于换个发行版。提示如果系统版本和你要的 ROS 版本就是凑不到一起正确做法是装虚拟机、双系统或者用 Docker 跑对应 Ubuntu 镜像。硬凑源是最贵的一条路。1.3 安装方式的三条路线与取舍现在主流就三条路官方 apt 源、社区一键安装脚本、Docker 镜像。官方 apt 源是最干净的每一步你都知道自己在干什么出问题也最好排查缺点是中间要处理密钥、rosdep 初始化这些容易卡住的环节。社区一键安装脚本把换源、装密钥、rosdep 初始化全部打包成一个命令对新手极其友好尤其在国内网络环境不稳定的情况下能省不少事代价是你对系统做了什么改动不太清楚脚本出问题时不好定位而且脚本本身的版本可能滞后于最新发行版。Docker 则是隔离性最好的方案一台机器同时放 Noetic 和 Humble 两套环境毫不冲突配合图形转发还能跑 Gazebo 和 rviz缺点是串口设备、USB 相机、网口设备的透传要额外配置调试实时性也不如裸机。我的实际做法是主力开发机用官方 apt 源裸装一套方便接真实硬件同时准备一份 Docker 环境做版本隔离和实验。这样既能保证硬件驱动调试顺畅又能在需要验证新版本时不污染主系统。下面的实操我会以官方源为主线讲中间穿插一键脚本的角色和注意事项。2. 从零装一遍Ubuntu 20.04 ROS Noetic 完整实操这一节我们走一遍最正统的流程。别小看它后面讲的所有定位不到软件包的排查逻辑都建立在你能正确复现这套流程的基础上。理解了每一步在干什么出问题的时候你才能定位到是源没写对还是密钥没导入还是缓存没刷新。2.1 动手前必须确认的三件事第一件事确认系统版本和架构命令是lsb_release -a和dpkg --print-architecture。前者告诉你 Ubuntu 代号是不是 focal后者告诉你是不是 amd64。如果你是 arm64 的开发板官方源的部分包是没有构建的这时候你要么用厂商提供的镜像要么接受只能用部分功能。第二件事确认时间和时区正确date一下时间偏差太大会导致 apt 校验 GPG 签名失败报一堆签名无效的错看起来像源坏了其实只是时间不对。第三件事确认网络能访问软件源。这里不需要什么特殊手段只要ping packages.ros.org有响应、apt update能从系统自带的镜像站拉到包就说明基础网络没问题。注意检查一下/etc/apt/sources.list.d/目录里有没有历史遗留的 ROS 源文件。很多人第一次装失败了第二次又加一遍结果同一个源写了两份一份是旧的、一份是新的apt 会同时读冲突报错。装之前先ls一眼把可疑文件删掉是个好习惯。2.2 换源、装密钥、加软件源的正确姿势第一步先把系统自带的 apt 源处理好保证sudo apt update sudo apt upgrade能顺利跑完不会因为某个源不可达而中断。这个过程不需要展开能正常更新就行它决定了你后面装 curl、gnupg 这些工具的顺畅程度。接下来是关键的三步。第一步设置软件源sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list注意后半段$(lsb_release -sc)是动态取当前系统代号这样写出来的源文件里是focal而不是手打的字符串能避免打错字。有人图省事直接手写focal一旦换了系统就忘了改这就是后面定位不到包的一个隐蔽原因。第二步导入签名密钥。老教程里流行sudo apt-key add -这个方式在新版本系统上已经不被推荐而且很多教程给的密钥地址已经失效导入失败后 apt 会直接拒绝整个源症状就是apt update报 NO_PUBKEY 然后后续所有ros-xxx包都定位不到。更稳妥的写法是把密钥文件直接放到 keyring 目录sudo apt install -y curl gnupg lsb-release sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \ -o /usr/share/keyrings/ros-archive-keyring.gpg然后把源文件写成显式引用这个 keyring 的形式这样即使系统里有多个 ROS 相关源也不会互相干扰echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] \ http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main \ | sudo tee /etc/apt/sources.list.d/ros-latest.list /dev/null第三步刷新索引sudo apt update。这一步的输出值得逐行看重点看两个东西——有没有Err开头的行以及有没有NO_PUBKEY或signature verification failed。如果这两类都没有源就是健康的。如果某一行是Skipped也别慌多半是并行下载时的一个瞬时行为重跑一次即可。2.3 正式安装与 rosdep 初始化环境健康之后就可以装了。Noetic 提供了几个档位的安装包选哪个取决于你要做什么# 完整桌面版包含 rviz、Gazebo 插件、仿真工具推荐新手 sudo apt install ros-noetic-desktop-full # 只有核心库和基础工具不含 GUI sudo apt install ros-noetic-ros-base # 最小化只有通信和构建系统 sudo apt install ros-noetic-ros-coredesktop-full体积大约两三个 G装的过程中如果卡在某个包上不动不要急着重开 apt先看是不是磁盘空间不够——df -h看一眼/和/usr的剩余空间。我遇到过好几次装到一半报错最后发现是根分区只剩 500M。装完之后是rosdep初始化这也是定位不到软件包最集中的雷区sudo rosdep init rosdep updaterosdep的作用是把包名翻译成系统依赖。比如你的package.xml里写了dependlibopencv-dev/dependrosdep 干的事就是查表把opencv这个 rosdep key 映射到libopencv-dev这个 apt 包名。这一步失败后面编译工作空间时就会看到Cannot locate rosdep definition for [xxx]注意这跟E: Unable to locate package是两码事一个是 rosdep 查不到映射一个是 apt 查不到包排查路径完全不同后面第 4 节会详细拆。rosdep init常见失败原因是/etc/ros/rosdep/sources.list.d/20-default.list已存在报 ERROR: default sources list file already exists。这其实是好事说明以前初始化过了直接跑rosdep update就行。如果rosdep update因为拉取远程文件超时而失败最简单的办法是改用社区维护的国内镜像方案或者直接使用把镜像配置打包好的 rosdep 替代命令社区里常说的 rosdepc 就是干这个的它的原理不神秘就是把20-default.list里的地址换成可稳定访问的镜像地址其他逻辑完全一样。2.4 环境变量写进 shell 配置并验证装完不配环境变量等于白装——你会发现roscore命令不存在。echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc这里有个容易忽略的细节setup.bash和setup.zsh是分开的如果你用 zsh写 bash 那个是不生效的。另外如果你以后有多个工作空间的devel/setup.bash要叠加 source顺序很重要后 source 的会覆盖前面的环境变量所以顺序应该是底层 ROS → 各依赖工作空间 → 你自己的主工作空间。验证三连echo $ROS_DISTRO # 期望输出 noetic which roscore # 期望输出 /opt/ros/noetic/bin/roscore env | grep ROS # 能看到 ROS_MASTER_URI、ROS_VERSION 等env | grep ROS里应该有ROS_VERSION1、ROS_PYTHON_VERSION3、ROS_MASTER_URIhttp://localhost:11311这几项。如果ROS_MASTER_URI的 IP 不是本机地址说明你以前的配置文件里有残留这会在跑主从机时造成莫名其妙的通信失败。2.5 装完先跑三个小例子确认环境没问题第一个例子小海龟。开三个终端# 终端 1 roscore # 终端 2 rosrun turtlesim turtlesim_node # 终端 3 rosrun turtlesim turtle_teleop_key键盘方向键能控制乌龟动说明核心通信、话题、消息、节点管理一整套链路都是通的。顺便解决一个热词里的常见需求——想要多只海龟怎么办turtlesim_node默认节点名是turtlesim直接再跑一个会顶掉前一个。正确做法是用命名空间重映射rosrun turtlesim turtlesim_node __name:turtle2 /turtle2/cmd_vel:/turtle1/cmd_vel这样两只乌龟会听同一个控制话题键盘一按两只一起走。理解__name:和/topic:这两个重映射语法对你以后跑多机、多实例仿真非常有用。第二个例子确认构建系统能跑通。新建一个工作空间mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make只要编译完成且没有Could not find package之类的错误说明 CMake、catkin、Python 环境都对上了。第三个例子跑一次rosdep检查cd ~/catkin_ws rosdep check --from-paths src --ignore-src -r这一步会遍历你工作空间里所有包的依赖声明列出哪些没装。刚建的空工作空间应该输出 All system dependencies have been satisfied。如果这里报错说明 rosdep 的数据库有问题趁现在还没有业务代码赶紧修别拖到写了几千行才发现。3. Ubuntu 22.04 装 ROS 2 Humble 的差异点在哪很多人是从 Noetic 转过来的习惯性地照搬老命令结果第一步就卡住。Humble 虽然还是 apt 装但源、密钥、工具链的写法都有变化这里单独拆一节讲清楚。3.1 软件源和密钥的写法变了ROS 2 的源路径是ros2/ubuntu而不是ros/ubuntu这是个一字之差但致命的区别sudo apt install -y software-properties-common curl sudo add-apt-repository universe -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注意这里取系统代号用的是. /etc/os-release echo $UBUNTU_CODENAME而不是lsb_release -sc。两种方式在大多数情况下结果一致但有些精简安装的镜像里lsb_release命令可能没有用os-release文件更保险。另外add-apt-repository universe这步不能省ROS 2 依赖了不少 universe 仓库里的包缺了它后面会出现一堆依赖无法满足的连锁报错。3.2 ros-dev-tools 和 colcon 这套工具链ROS 2 的安装包分层# 桌面版含 rviz2、demo 节点 sudo apt install ros-humble-desktop # 开发工具含 colcon、rosdep、各种代码检查工具 sudo apt install ros-dev-toolsros-dev-tools是个易被忽略的包它把colcon、rosdep、ros2cli插件、格式化工具一次装齐。很多人装完desktop发现没有colcon命令就是漏了这一步。装完之后环境变量同样要写进去echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrcROS 2 的验证方式换了ros2 run demo_nodes_cpp talker ros2 run demo_nodes_py listener一个终端发布、一个终端订阅能看到消息流动就说明 DDS 通信正常。如果两个节点互相看不见八成是ROS_DOMAIN_ID不一致或者组播被网络环境挡住了这时候可以在两端同时指定export ROS_DOMAIN_ID42再试。3.3 一键安装脚本值不值得用社区里有不少把换源 装密钥 装 ROS 配 rosdep打包成一条命令的脚本俗称一键安装。它的价值在于两件事一是自动选择国内可访问的软件源镜像二是把rosdep update那套容易超时的初始化过程处理掉。对于刚接触 Linux 不久、不想在命令行里反复试错的人来说这确实能省下大量时间。但我建议你在用之前想清楚两点。第一脚本会往你的系统里写源文件、改镜像地址装完之后你应该自己去看一眼/etc/apt/sources.list.d/里多了什么知道系统现在依赖哪些源。第二脚本对发行版的支持是有时效的新版本发布后可能要过一段时间才更新这时候用官方源手动装反而更稳。我自己的习惯是先用脚本把依赖环境快速铺好跑通一次验证链路真正的开发环境还是按官方文档手动装一遍心里有数。4. 定位不到软件包的六类根因一次讲透前面铺垫够了接下来是重头戏。同样一句定位不到软件包背后至少对应六种完全不同的原因而且很多人的第一反应是换个源试试其实方向完全错了。4.1 先分清是 apt 定位不到还是 rosdep 定位不到这是最关键的一步分诊。如果你看到的是E: Unable to locate package ros-noetic-xxx这是apt在报错意思是它翻遍了当前配置的所有软件源索引没找到叫这个名字的包。原因在源和包名层面。如果你看到的是ERROR: the following packages/stacks could not have their rosdep keys resolved: Cannot locate rosdep definition for [xxx]这是rosdep在报错意思是它认识你要装的东西是个依赖但在它的映射数据库里找不到对应的系统包名。原因在 rosdep 的数据库和你的package.xml声明层面。还有一种编译时报Could not find a package configuration file provided by xxx这是CMake层面的意思是它找不到那个包的Config.cmake通常是因为你忘了 source 对应的环境或者那个包确实没装。三种错、三条路不要用同一套方法去修。4.2 apt 报 Unable to locate package 的六种原因与排查表现象真实原因验证命令处理方式所有 ros-xxx 都找不到ROS 源根本没加成功ls /etc/apt/sources.list.d/重新写源文件并apt update所有 ros-xxx 都找不到系统代号与 ROS 版本不匹配lsb_release -sc换系统或换 ROS 版本别硬凑只有部分包找不到包不在官方源属于第三方apt-cache search xxx加对应第三方源或源码编译只有部分包找不到包名拼错下划线和连字符混用对照官方索引核对改成正确包名昨天还能装今天不行源索引缓存过期或被写坏sudo apt update看报错清缓存重新索引提示 NO_PUBKEY密钥没导入或已过期apt-key list或看 apt 输出重新导入密钥先说第一种也是最常见的。判断方法很简单apt-cache search ros-noetic | head。如果一条都搜不到说明源索引里根本没有 ROS 的内容问题出在源文件本身。检查三件事文件是不是放在/etc/apt/sources.list.d/下且以.list结尾、apt update时那一行有没有报 error、以及$(lsb_release -sc)展开出来的代号是否正确。我见过有人把源写进了/etc/apt/sources.list却把原来的内容覆盖掉了结果系统自带的源全没了apt update只从 ROS 源拉那当然什么都装不了。第二种就是前面反复强调的版本不匹配。第三种很典型比如你想装 Gazebo 相关的 ROS 包、想装某款相机的驱动包它们要么在别的源里要么根本没进 apt源码编译才是正路。4.3 包名规则ros-发行版-包名 与下划线转连字符这个坑我踩过值得单独讲。ROS 的 apt 包名有一套严格的命名转换规则ROS 1ros-noetic-package其中 package 名里的下划线要换成连字符ROS 2ros-humble-package同样下划线换连字符举例来说包源码里叫gazebo_ros_pkgsapt 里就是ros-noetic-gazebo-ros-pkgs源码里叫teleop_twist_keyboardapt 里是ros-noetic-teleop-twist-keyboard。很多人直接apt install ros-noetic-teleop_twist_keyboard然后报 Unable to locate package其实是自己名字写错了。提示实在记不住包名最靠谱的办法是去 ROS 官方的包索引网站上搜关键词或者直接用apt-cache search模糊匹配。比如不确定标定包叫什么就apt-cache search camera-calibration一次就能看到准确名称。4.4 那些本来就不在官方源里的包有一类定位不到是正常现象不是你的环境坏了。典型的有Gazebo 相关包。gazebo_ros_pkgs在 ROS 1 里确实可以通过 apt 装但如果你要的是 Gazebo 本体或者较新的版本就需要额外加 OSRF 的源。而 Gazebo 和 ROS 的版本还有对应关系Humble 时代 Gazebo Classic 和新的 Ignition/Gazebo Sim 并存装错了版本会出现包在但接口对不上的更头疼的情况。热词里获取 gazebo ros pkgs 包的诉求本质就是这件事。micro-ROS 相关。跑 ESP32 上的 micro-ROS你需要的 agent 和客户端库不一定在官方源索引里早期版本基本靠源码编译后来部分发行版进了官方源但名字可能不叫你想的那个。稳妥做法是先apt-cache search micro-ros确认索引里到底有什么没有就走源码编译。厂商硬件驱动。海康工业相机的驱动就是典型。厂商给的是 MVS SDK 的 deb 包加一个 ROS 驱动源码仓库SDK 可以 apt 装前提是你加了厂商的源或手动 dpkg但 ROS 驱动包通常只有 GitHub 源码需要catkin_make自己编。你要是在 apt 里搜ros-noetic-hikrobot-camera搜不到这不是你的问题本来就没有。同样的道理适用于大多数国产机械臂比如 AR3 这类、专用底盘、专用传感器它们的 ROS 包基本都是源码形式分发。5. 排查修复实操从三分钟自检到兜底安装理论讲完来一套可以照着敲的流程。5.1 三分钟自检清单遇到定位不到软件包先把下面这几条跑一遍基本能锁定九成问题# 1. 系统代号对不对 lsb_release -sc # 2. 当前 ROS 版本环境变量 echo $ROS_DISTRO # 3. 源文件列表 ls -l /etc/apt/sources.list.d/ # 4. 源索引里到底有没有 ROS 的包 apt-cache search ros-$ROS_DISTRO | wc -l # 5. 单独查你要装的那个包 apt-cache policy ros-$ROS_DISTRO-desktop-full第 4 步的输出数字是关键。如果结果是 0说明源索引里完全没有这个发行版的包问题一定在源或版本匹配上不用再往下试。如果是几百上千说明源是好的那问题就在具体的包名或者这个包本身不在官方源里。第 5 步的apt-cache policy更好用它会直接告诉你找到候选版本 x.x.x还是无法定位软件包。5.2 源被写坏、缓存脏了怎么救有几类问题是缓存和数据损坏造成的处理方式如下# 清理 apt 缓存里的包文件 sudo apt clean # 删除失效的列表缓存 sudo rm -rf /var/lib/apt/lists/* # 重新生成索引 sudo apt update清空/var/lib/apt/lists/是有点暴力的做法但它能解决很多源明明改了但 apt 还在用旧数据的诡异现象。执行完之后apt update会重新下载所有源的索引第一次会慢一点正常。如果是源文件写重复了打开/etc/apt/sources.list.d/逐个检查把指向同一个地址的旧文件删掉只保留一份。特别注意那些名字叫ros-latest.list和ros.list同时存在的机器八成是两次安装留下的。如果是密钥问题看apt update输出里的NO_PUBKEY XXXXXXXXXXXXXXXX说明这个源的公钥没在系统里。处理方式是重新下载密钥文件到/usr/share/keyrings/并确认源文件里的signed-by路径指向它。这一步出错的一个隐蔽原因是signed-by写在方括号里格式是[archamd64 signed-by/path/to/key.gpg]中间不能有多余的引号我见过因为多写了一个引号导致整行被 apt 忽略的情况。5.3 rosdep update 走不通的替代方案rosdep update本质是从几个远程地址拉取 YAML 格式的映射数据库缓存到~/.ros/rosdep/下。网络不稳的时候会卡在Querying rosdistro这一步。几个可落地的替代方案方案一改用镜像配置。打开/etc/ros/rosdep/sources.list.d/20-default.list把里面的地址换成可稳定访问的镜像地址然后rosdep update。这个文件里通常有四行分别指向 rosdistro 索引、base 规则、python 规则和 release 规则改的时候要保持路径结构一致。方案二使用社区打包好的 rosdep 替代命令。社区里有一类工具专门做这件事把镜像地址和缓存机制都封装好了命令用法跟原生 rosdep 几乎一样维护者会随着上游更新调整地址。对于不想手动改配置文件的人来说这是性价比最高的选择。方案三离线分发缓存。如果你的开发环境是内网隔离的可以在能上网的机器上跑完rosdep update然后把~/.ros/rosdep/整个目录拷贝到内网机器的对应位置。这个技巧在实验室和企业内网里非常实用一次配置所有机器都能用。5.4 兜底手动下载 deb 与源码编译当某个包在源里确实找不到而你又有硬性需求时还有两条兜底路。第一条是手动下载 deb 并本地安装# 在能联网的机器上只下载不安装 apt-get download ros-noetic-xxx # 拷贝到目标机器后安装 sudo dpkg -i ros-noetic-xxx_*.deb # 如果缺依赖用这个命令自动补齐 sudo apt-get install -f这里要注意apt-get download只下载不解析依赖所以你得自己把依赖链凑齐。用dpkg -i装完之后立刻sudo apt-get install -f让 apt 尝试自动补依赖能省不少手工活。另外跨大版本使用 deb 包风险很高比如把 focal 的包装到 jammy 上libc 版本对不上直接报一堆符号未定义这种时候就老老实实编译源码。第二条是源码编译。ROS 生态里大部分包都有源码仓库标准流程是cd ~/catkin_ws/src git clone 仓库地址 cd .. rosdep install --from-paths src --ignore-src -r -y catkin_make source devel/setup.bashrosdep install这一步会把你源码包的依赖尽量装齐是源码编译前最省事的一步。如果它报Cannot locate rosdep definition说明这个包作者用了一个 rosdep 数据库里没有的 key这时候就去看它的package.xml手工把对应的系统依赖装上跳过 rosdep 这一步。这是我处理国产硬件驱动包时最常用的方法。6. 常见问题速查与踩坑心得6.1 问题速查表报错关键词大概率原因快速处理Unable to locate package源没加好或版本不匹配查apt-cache search ros-$ROS_DISTRONO_PUBKEY密钥缺失或过期重新导入 keyringdefault sources list file already existsrosdep 已初始化过跳过 init直接 updateCannot locate rosdep definitionrosdep 数据库缺映射改镜像源或手工装依赖Could not find package configuration file没 source 环境source /opt/ros/xxx/setup.bash依赖无法满足universe 仓库没开add-apt-repository universe装完命令找不到环境变量没写进 rc 文件检查用的是 bash 还是 zsh两个节点互相看不见域 ID 或网络问题统一ROS_DOMAIN_ID6.2 我踩过的几个坑第一个坑是搜索关键词污染。你搜ROS 安装的时候会搜到大量路由器固件的配置教程——那套同名系统的界面和命令跟机器人 ROS 没有任何关系新手很容易点进去看半天越看越糊涂。判断方法很简单提到无线中继、PPPoE、防火墙规则的页面跟机器人无关提到话题、节点、rviz、catkin 的才是你要的。这件事听起来像玩笑但确实浪费过我一个小时。第二个坑是主从机通信。装完之后想把笔记本和机器人主机连起来很多人只设了ROS_MASTER_URI却忘了设本机地址结果在 rviz 里能看到话题列表但看不到数据。原因是节点广播自己的地址时用了错误的网卡。正确做法是在两端都显式指定export ROS_MASTER_URIhttp://主机IP:11311 export ROS_IP本机IP注意ROS_IP和ROS_HOSTNAME不要同时设置两个都设会互相打架导致连接时好时坏。有多张网卡有线 无线的机器尤其容易出这个问题。第三个坑是相机和机械臂的标定。标定包camera_calibration在desktop-full里是有的但如果你装的是ros-base就必须单独apt install ros-noetic-camera-calibration。很多人装完 base 版本跑标定的时候提示找不到包第一反应是源坏了其实只是安装档位不够。另外标定用的棋盘格打印出来之后一定要用尺子量每个格子的实际边长再填进参数里我见过用 A4 纸张缩放打印导致格子尺寸差了几毫米标定出来的内参偏差很明显。6.3 多版本共存与环境隔离如果你既要维护老的 Noetic 项目又要做新的 Humble 开发有两种隔离策略。轻量级的是 Docker一个镜像跑一套 ROS通过挂载工作目录共享代码图形界面通过转发显示到宿主机。这种方式的优势是零污染缺点是接 USB 相机、串口设备时要加--device参数网络模式也要选 host 才能保证 DDS 发现正常。重量级的是虚拟机加双系统。虚拟机的图形性能对 Gazebo 这种仿真场景来说偏弱如果只是写代码、跑单元测试还够用但要跑带物理引擎的小车导航仿真就比较吃力。另一种做法是在同一台机器上装两个 Ubuntu用 GRUB 切换硬件访问完全原生代价是每次切换要重启。我自己的方案是主系统装 Humble因为新项目的占比越来越高老的 Noetic 项目全部放进 Docker 容器里顺便把依赖版本固定下来避免哪天系统升级把老项目搞挂。这个思路我觉得比一个系统里硬塞两个 ROS要安全得多因为两套 ROS 会往~/.bashrc里写不同的 source 语句环境变量互相覆盖是很多诡异问题的来源。真想在一个系统里共存至少也要用脚本在需要的时候手动 source别让它们同时生效。至于装完之后往哪个方向走我的经验是别急着上复杂的机械臂项目。先用小海龟把话题、服务、参数、tf 这几个基础概念摸熟再跑一次简单的 URDF 模型在 rviz 里显示出来然后接 Gazebo 让它动起来最后才轮到真实硬件和标定。这个顺序走下来你遇到报错时脑子里能迅速判断出问题在哪一层——是环境没配对还是依赖缺了还是纯粹硬件没连上。这套判断力比记住多少条安装命令重要得多。
返回列表