拓冰建站拓冰建站
首页 / 资讯中心 / 正文

用Ubuntu 20.04 + ROS Noetic跑通小乌龟:从环境搭建到SLAM入门

用Ubuntu20.04装ROS Noetic这件事放在SLAM学习路径里有很特殊的位置它是几乎所有激光SLAM、视觉SLAM算法包能够跑起来的地基。很多人一上来就急着编译ORB-SLAM3或者跑LIO-SAM结果卡在环境问题上一周都出不来回头一看连ROS的话题通信机制都没捋清楚。这篇实操记录面向的是刚走完Linux基础、准备正式踏入SLAM大门的读者我会把从零安装ROS Noetic到跑通“小乌龟”程序的全过程拆开讲清楚包括每一步为什么要这么做、踩过哪些坑、以及跑通小乌龟之后怎么往SLAM方向继续深入。我自己是从Ubuntu16.04Kinetic一路用过来的到20.04Noetic这个组合最大的感受是Noetic是ROS 1的最后一个长期支持版本也是当前大量教材、开源SLAM项目默认的运行环境。选它相当于给自己争取了一个非常稳妥的学习窗口期至少未来两三年内你看到的《视觉SLAM十四讲》、各种turtlebot3仿真教程、Cartographer源码解析都能在这个环境里直接复现。1. 环境准备为什么是Ubuntu20.04搭配Noetic而不是最新版很多新手会问同一个问题为什么不用最新的Ubuntu版本为什么不用ROS 2这个问题值得在动手之前先说清楚因为它决定了你后面能不能顺利跟着教程走。1.1 版本匹配关系与系统选型逻辑ROS每个版本都对应一个官方支持的Ubuntu发行版Noetic对应的是Ubuntu Focal Fossa20.04这是ROS 1系列的最后一个版本官方支持到2025年。ROS 2的Humble对应Ubuntu 22.04最新的一些版本则对应Ubuntu 24.04。对于SLAM入门来说选择20.04Noetic而不是追新版本核心原因有两个第一你即将接触的绝大多数教材、开源项目和课程都是基于ROS 1写的。高翔博士的《视觉SLAM十四讲》第二版代码默认环境就是Ubuntu18.04/20.04配ROS Melodic/Noetic各种经典的2D激光SLAM方案gmapping、hector、cartographer在老版本上的资料也是最多的。用Noetic意味着你搜到的问题解决方案基本都能直接用不会因为版本差异而反复折腾。第二ROS 1的架构更简单直接适合建立心智模型。ROS 1是一种中心化的通信架构一个master节点管理所有话题和服务ROS 2换成了DDS分布式通信引入了发现机制、QoS策略等一堆概念。在学习SLAM算法的阶段你更需要把注意力放在传感器数据处理、位姿估计这些核心问题上而不是一上来就被通信中间件本身的复杂性劝退。如果你已经是双系统熟练用户建议直接在物理机上装Ubuntu20.04。如果只是学习验证虚拟机也是可以的但要注意网络模式必须选“桥接模式”而不是NAT模式否则后面ROS节点之间通信可能出现诡异的问题。关于这一点后面的踩坑章节我会详细展开。1.2 换源与系统更新安装ROS前的标准动作在安装ROS之前先把系统软件源换成国内镜像这几乎是所有国内用户的标准操作。原因很简单ROS的安装过程需要从Ubuntu官方源拉取大量依赖包如果不换源下载速度会让人怀疑人生。打开终端依次执行# 备份原始软件源配置 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 使用sed命令将源地址替换为清华镜像 sudo sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list # 更新软件包列表并升级系统 sudo apt update sudo apt upgrade -y这里有一个实操细节系统自带的软件更新器可能会提示部分软件无法更新尤其是涉及内核和显卡驱动时不要盲目全选升级。SLAM学习对内核版本没有特殊要求但如果你的电脑里有NVIDIA显卡并打算后面跑视觉SLAM或者ORB-SLAM3的GPU加速版建议在系统安装阶段就把显卡驱动装好。我见过不少人在Ubuntu里装完ROS之后再去折腾驱动结果把系统搞崩溃重装非常浪费时间。如果是在虚拟机上学习则跳过显卡驱动这一步虚拟机的图形性能足够跑turtlesim和Rviz这些轻量级工具。2. 三种安装方式与选型我为什么推荐手动装一遍ROS Noetic的安装方式大致有三种官方源全手动安装、国内镜像源半手动安装、一键脚本自动化安装。下面逐一说明差异和适用场景。2.1 官方源全手动安装适合彻底理解ROS结构这也是ROS Wiki上最经典的安装步骤# 1. 添加ROS软件源 sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list # 2. 添加密钥 sudo apt install curl -y curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - # 3. 更新索引 sudo apt update # 4. 安装ROS Noetic完整版 sudo apt install ros-noetic-desktop-full -yros-noetic-desktop-full包含了你入门阶段需要的几乎所有东西核心通信库、tf坐标变换、Rviz可视化、Gazebo仿真、各种常用功能包。如果你硬盘空间充足直接选这个版本准没错。如果你只想快速跑最小环境也可以用ros-noetic-ros-base加单个功能包的方式但我不建议新手这么干因为后面随时可能缺依赖。这种方式的问题是从GitHub拉取密钥文件时在不同网络环境下可能会失败。密钥添加失败后执行apt update会提示NO_PUBKEY错误这就是下面踩坑章节要解决的问题。2.2 国内镜像源半手动安装最推荐的方式在官方步骤的基础上把软件源和密钥都换成国内镜像能省去大半的等待时间。以清华源为例# 添加ROS软件源清华镜像 sudo sh -c echo deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-noetic.list # 添加密钥从ROS官方地址获取也可以放到任意能访问的机器上下载后拷贝 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install ros-noetic-desktop-full -y如果你是在虚拟机里练习网络环境正常的情况下这种方式从执行到安装完成大约只需要20到30分钟。安装完ROS本体之后还需要初始化rosdep这一步是给后续编译源码时自动安装依赖用的sudo rosdep init rosdep updaterosdep在后面的SLAM学习中会频繁用到比如你克隆了一个GitHub上的算法包通常需要先跑rosdep install --from-paths src --ignore-src -r -y来自动安装缺失依赖。国内网络环境下这一步可能会失败我在踩坑章节会给一个排除方案。2.3 自动化一键脚本效率高但建议理解底层逻辑后再用目前在国内ROS圈子里流传很广的“鱼香ROS一键安装”确实能节省大量时间它本质是一个自动化脚本帮你完成了从换源、添加密钥、安装ROS、初始化rosdep到配置环境变量的完整流程。对于纯小白或者赶时间复现项目的人来说这个工具很实用。但我在实际带人的过程中越来越倾向于让新手先手动装一遍哪怕多花点时间。原因在于脚本帮你把坑都填平了同时也让你失去了看见坑的机会。你如果不知道/etc/apt/sources.list.d/里发生了什么不知道~/.bashrc里加了哪一行那后面遇到环境问题就会非常被动。我的建议是如果你已经手动装过一次后续要频繁折腾新机器完全可以直接用一键脚本如果这是你的第一次老老实实手敲命令报错了再查、再解决这个过程本身就是宝贵的入门训练。2.4 环境初始化source命令到底干了什么安装完成后还需要把ROS的环境变量加载到当前终端。这一步很多教程一笔带过但它实际上决定了你能不能直接运行roscoreecho source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrcsetup.bash这个文件做的事情用一句话总结就是把ROS相关的可执行文件路径、库文件路径、环境变量如ROS_MASTER_URI、ROS_PACKAGE_PATH全部注入当前终端会话。这就是为什么新开一个终端窗口后如果不执行source ~/.bashrc输入roscore会提示找不到命令。另外还要source一下你工作空间的setup.bash。当你在自己的catkin_ws里编译完功能包后需要执行source ~/catkin_ws/devel/setup.bash这会覆盖ROS默认的ROS_PACKAGE_PATH把你自己写的包加进去。这也是很多新手在编译完自定义包后运行rosrun提示找不到包的常见原因。3. 跑通小乌龟这其实是理解ROS通信机制的第一课小乌龟程序turtlesim看起来是个简单到不行的演示但它背后展示的正是ROS最核心的通信骨架。弄懂这个小程序你就掌握了ROS编程的50%的门道。3.1 小乌龟程序背后的运行架构小乌龟程序的完整运行依赖三个独立节点roscore名称服务节点负责管理其他节点的注册与互相发现turtlesim_node小乌龟仿真器节点创建仿真窗口并不断订阅速度指令话题turtle_teleop_key键盘遥控节点读取你的按键输入并把速度指令发布到话题上它们三者通过话题Topic进行通信这里的数据流是单向的turtle_teleop_key向/turtle1/cmd_vel话题发布速度消息turtlesim_node订阅这个话题进行移动。这就是ROS的发布-订阅模型消息内容使用一种叫做msg的标准化格式进行定义节点对节点本身完全解耦。简单打个比方这就像电台广播。收音机订阅者不知道也不关心广播站在哪里它只需要调到正确频率话题名就能收到内容广播站发布者也不知道有多少人在听只是不断地把内容发出去。SLAM中几乎所有传感器数据的流动都是这个模式激光雷达发布/scan话题IMU发布/imu/data话题SLAM算法作为订阅者默默接收并处理。3.2 三个经典终端操作与常用诊断命令安装完成ROS之后依次打开三个终端窗口分别执行# 终端1启动ROS主节点 roscore # 终端2启动小乌龟仿真器 rosrun turtlesim turtlesim_node # 终端3启动键盘控制 rosrun turtlesim turtle_teleop_key执行完后屏幕上会出现一个带有小乌龟的窗口此时使用键盘的上下左右方向键或IJKL键即可控制乌龟运动。但跑动起来只是第一步我更建议大家用命令行工具实际观察一下话题流动的过程这会让你对上面的架构有切身的体感# 查看当前所有活跃节点 rosnode list # 查看当前所有活跃话题 rostopic list # 打印/turtle1/cmd_vel话题上的实时消息 rostopic echo /turtle1/cmd_vel # 查看具体节点之间的通信连接 rosnode info /turtlesim我特别推荐你试一下rqt_graph它可以把节点和话题的通信关系用图的形式画出来。执行rqt_graph后你能直观地看到/teleop_turtle和/turtlesim两个节点之间通过一根线连在一起上面标注着话题名/turtle1/cmd_vel。这种直观感受是看多少文档都替代不了的。这里有一个我强烈建议养成的“坏习惯”每学一个新工具先想想它内部是怎么通信的。比如你后来接触Rviz、Gazebo、Cartographer都可以打开rqt_graph看一看节点之间的消息流向这会让你对系统整体架构有超出同龄人的理解。3.3 用话题与服务控制乌龟动手玩转消息通信如果你觉得键盘控制太简单可以试试直接用命令行发布消息理解一下“发布者”这个角色的本质# 给乌龟发一个线速度和角速度指令 rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist \ {linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {z: 1.8}}这个命令表示以10Hz的频率不断向/turtle1/cmd_vel发布消息乌龟会一边向前走一边转圈轨迹很好看。想停下来就按下CtrlC终止发布。你还可以调用ROS的服务机制Service来生成新的乌龟# 调用/spawn服务在坐标(x5.0, y5.0)处生成一只名为turtle2的新乌龟 rosservice call /spawn {x: 5.0, y: 5.0, theta: 0.0, name: turtle2}话题是一个“发出去就不管”的通信方式适用于持续性的数据流服务则是一种请求-响应的通信方式适用于一次性任务。SLAM中既会用到话题激光数据、位姿轨迹也会用到服务地图保存、定位初始化小乌龟这个案例等于把这两种通信机制都演示了一遍。4. 安装与运行中的九个坑与完整排查思路以下问题都是我实际安装过程中遇到过或者身边同学反复踩过的按出现频率排序。4.1 公钥失效或无法添加密钥现象执行sudo apt update时报The following signatures couldnt be verified because the public key is not available: NO_PUBKEY F42ED6FBAB17C654。排查思路报错信息已经给出了缺失公钥的ID即F42ED6FBAB17C654。这个公钥对应ROS官方源的签名密钥。解决方式就是重新导入这个公钥sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F42ED6FBAB17C654如果keyserver.ubuntu.com连不上可以更换其他公钥服务器重试比如hkp://pgp.mit.edu:80。4.2 rosdep update反复失败现象执行sudo rosdep init时提示无法下载rosdistro仓库或者rosdep update时卡住、超时。排查思路rosdep依赖从GitHub原始仓库获取依赖描述文件这是国内网络环境下的高频失败点。通用解决思路是把ros/rosdistro仓库下载或镜像到本地然后在rosdep的源码配置里把URL指向本地路径。具体操作不展开搜索“rosdep init 失败”能找到大量可用的脚本。我的建议是不要在这里浪费超过30分钟因为rosdep主要是给源码编译用的初期跑turtlesim不依赖它。你可以先跳过等真正需要编译功能包时再解决。4.3 虚拟机内无法输入roscore命令现象明明已经安装完成新打开终端后roscore提示command not found。排查思路这几乎都是source没有生效。先检查~/.bashrc的最后是否有一行source /opt/ros/noetic/setup.bash确保你在当前终端执行了source ~/.bashrc。如果依然不行手动执行一次source /opt/ros/noetic/setup.bash再试。另外确认你使用的是bash而不是zsh如果你配置了oh-my-zsh要在~/.zshrc里增加同样的source行。4.4 turtlesim窗口无响应或键盘控制无效现象小乌龟窗口能出现但按方向键完全没反应。排查思路分三种情况。第一种焦点不在终端窗口上点击一下终端让键盘事件被teleop节点捕获第二种roscore没启动或者节点之间没连上用rostopic list查看是否有/turtle1/cmd_vel话题第三种你按的是小键盘部分版本不支持用方向键或者IJKL代替。4.5 虚拟机的网络模式导致跨机通信失败现象在虚拟机里跑turtlesim一切正常但进行ROS主从机配置时从机始终连不上主机。排查思路问题通常出在虚拟机的网络模式。NAT模式下虚拟机共享宿主机IP对外通信其他设备无法通过局域网IP直接访问这台虚拟机。改成桥接模式后虚拟机就等于路由器下一个独立设备有自己独立的局域网IP这时才能正常进行ROS跨机通信。4.6 软件包安装到一半中断现象执行sudo apt install ros-noetic-desktop-full过程中网络断开或磁盘空间不足导致dpkg出现异常状态。排查思路先手动修复包管理器再重新安装sudo dpkg --configure -a sudo apt --fix-broken install sudo apt install ros-noetic-desktop-full -y4.7pip安装的rospkg与系统ROS冲突现象当你使用Python3编写ROS节点时提示ModuleNotFoundError: No module named rospkg。排查思路Noetic已经原生支持Python3但默认不包含rospkg你需要手动安装Python3的ROS依赖sudo apt install python3-rospkg python3-catkin-pkg python3-rosdep不要在虚拟环境里用pip install rospkg容易把系统Python环境搞坏。4.8 中文字体与显示异常现象rviz或turtlesim窗口显示乱码、字体发虚。排查思路安装中文字体sudo apt install fonts-wqy-zenhei fonts-wqy-microhei同时检查系统设置里的“图形界面缩放”虚拟机里建议设置为100%否则会出现鼠标偏移和窗口渲染异常。4.9 新开终端无法自动加载环境现象每次新开终端都必须手动执行source /opt/ros/noetic/setup.bash否则报错。排查思路这说明~/.bashrc里的source行没有生效。检查是否被不小心注释掉了或者.bashrc文件存在语法错误。执行tail -n 20 ~/.bashrc查看最后几行内容。5. 跑通小乌龟之后从turtlesim到SLAM的衔接路径小乌龟不是终点它是一座桥。当你理解了话题、服务、节点、消息这四个核心概念其实已经具备了学习SLAM的基础通信知识。接下来最关键的一步是把这套知识迁移到真实传感器数据处理上。5.1 turtlesim与SLAM系统的结构类比你仔细观察一下小乌龟程序的结构再去看任何一个开源SLAM系统的节点图会发现它们在拓扑结构上有惊人的相似性小乌龟里的turtle_teleop_key节点相当于SLAM里的传感器驱动节点雷达驱动、相机驱动/turtle1/cmd_vel话题相当于SLAM里的/scan激光话题或/image_raw图像话题turtlesim_node节点相当于SLAM算法核心gmapping、cartographer、ORB-SLAM这也是为什么ROS社区会选择用turtlesim作为教学案例的原因它把一切传感器、算法细节都剥掉只留下通信骨架本身。5.2 我建议你的后续学习路径跑通小乌龟之后很多人会陷入“不知道接下来该干啥”的迷茫。我按自己的学习经验给出一条经过验证的路径第一步用turtlebot3_gazebo在仿真环境里跑起来一台带激光雷达的机器人参考TurtleBot3官方文档这个阶段你能看到/scan话题的真实数据流并能在Rviz里实时看到激光点云。第二步跑通gmapping建图这是在仿真环境里通过键盘控制机器人移动同时用gmapping算法在线构建一张二维栅格地图。这个过程的本质是你用一个虚拟激光雷达发布/scan和/tfgmapping节点订阅后输出/map话题。第三步把gmapping换成cartographer或ORB-SLAM3对比不同算法之间的差异。从仿真到真机从2D激光到3D视觉SLAM的技术版图会逐渐在你面前展开。每一步都需要用到我们前面讲的通信知识rostopic查看数据、rqt_graph观察节点关系、roslaunch管理多个节点。可以说小乌龟学得越扎实后续越顺畅。5.3 给初学者的第二周练习清单如果按方法论来规划学完小乌龟后的第二周可以这样安排第1天用rostopic pub和rostopic echo对着turtlesim做自主控制练习加深对话题的理解第2天用Python写一个发布节点和一个订阅节点自己实现一个“让乌龟走正方形”的小程序第3天把节点封装到功能包里掌握catkin创建功能包的标准流程练习catkin_create_pkg和CMakeLists.txt的修改第4天用launch文件一次性启动三个节点掌握roslaunch的语法第5天安装turtlebot3仿真环境在Gazebo里把机器人模型加载出来第6天用键盘控制turtlebot3在仿真环境中移动订阅/scan话题观察数据第7天跑通gmapping建图得到第一张自己“亲手”构建的地图这套练习做完你会非常自然地从turtlesim过渡到SLAM正题后面的Cartographer也好ORB-SLAM3也罢都只是在这个基础上堆算法细节而已。跑通小乌龟的那个晚上我盯着自己的第一只“海龟”在屏幕上画圈脑子里冒出来的是“原来计算机这么听话”这种很原始的感动。后来用gmapping建出第一张栅格地图用ORB-SLAM3在真实视频上跑出稀疏点云虽然每一次上手的复杂度都在增加但底层的敬畏感始终没变——所有复杂的SLAM系统最终都可以拆解成一个个发布和订阅数据的小节点。先把小乌龟这台“手术台”上的通信机制吃透你解剖后面任何一只猛兽都不会慌。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门