尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

零基础ROS入门指南:古月居21讲+环境搭建与仿真实战

发布时间:2026/9/29 4:32:04

资讯中心
01
ARTICLE

零基础ROS入门指南:古月居21讲+环境搭建与仿真实战

零基础ROS入门指南:古月居21讲+环境搭建与仿真实战
1. 为什么我把《ROS入门21讲》当成零基础入门的第一站聊ROS学习这件事我踩过的坑比走过的路还多。最开始那会儿我对着一堆官方文档和英文教程硬啃装环境装到怀疑人生跑个例程报几十行错光roscore能不能起来就折腾了大半天。后来朋友甩给我一套古月居的《ROS入门21讲》说是专门给零基础的人做的我抱着试试看的心态跟了一遍才发现原来入门这件事可以这么顺。所以这篇笔记的核心就是把我跟着这套课程从零到能跑通一个完整ROS小车的全过程、每一个卡点、每一次报错和最终的解决办法全都摊开来讲清楚。ROS这套东西本质上是一套机器人操作系统框架它解决的是让机器人的各个部件——传感器、电机、算法模块——能够互相通信、协同工作的问题。而古月居的《ROS入门21讲》在我看来最大的价值是它把ROS这套庞杂的体系拆成了21个由浅入深的小台阶每一步都只讲一个核心概念不贪多、不跳步。这套内容适合谁我的判断是三类人一是完全没碰过Linux和机器人、只想搞明白ROS到底是怎么运转的纯小白二是已经会用Python或C、但不知道怎么把这些代码接到真实机器人上的人三是学过一点ROS但知识点是散的、想系统串一遍的人。如果你属于这三类里的任意一类那跟着21讲的节奏走一遍基本能把ROS的主干脉络摸清楚。下面我就按我实际学习的顺序把整体思路、环境搭建、核心知识点实操、进阶衔接和踩坑记录完整复盘一遍。1.1 零基础学ROS最容易翻车的三个地方先给大家打个预防针因为我身边十个学ROS的九个都在这三个地方栽过跟头。第一个是环境版本不匹配。ROS和Ubuntu的版本是强绑定的你装错了组合后面所有教程的命令都会报错。我见过太多人拿着Ubuntu 22.04去装Noetic然后对着无法定位软件包发呆一整天。记住一条Ubuntu 20.04配ROS NoeticUbuntu 22.04配ROS 2 Humble这两个组合是当前最主流、资料最全的。第二个是只抄命令不理解概念。ROS里有节点、话题、服务、参数、消息这些名词如果只是机械地复制粘贴rosrun、rostopic这些命令跑通例程也等于没学。我一开始就是这样能跑起来但一让我自己写个发布者就懵了因为我不知道Publisher和Subscriber之间到底是怎么握手的。第三个是一上来就冲实机和机械臂。有朋友买了AR3机械臂环境还没玩明白就想直接做抓取结果卡在驱动和标定上几个月没进展。我的建议是老老实实先在仿真里把基础概念跑熟再上真机。1.2 21讲的知识地图其实是四层递进我把21讲的内容重新梳理了一遍发现它其实是按四层递进的逻辑铺开的理解了这个结构你学起来就不会迷路。层级核心内容对应讲次大概方向学完能达到的状态基础层环境搭建、工作空间、功能包前几讲能装好ROS并跑通第一个例程通信层发布订阅、服务、参数、消息中间大段能自己写节点让两个程序对话工具层Launch、TF、RViz、Gazebo中后段能可视化调试、搭出仿真环境应用层建模、传感器仿真、导航、机械臂后段能拼出一个完整的小车或机械臂Demo这个分层特别关键。很多人学不下去是因为在基础层还没搞扎实的时候就跳到了应用层结果处处是黑盒调不动也改不了。我的经验是每一层都得能自己动手复现一遍尤其是通信层那是ROS的灵魂。1.3 学习前的软硬件准备清单正式开始前把下面这些准备好能省掉后面一半的麻烦。我当时就是边学边补装备来回折腾非常影响节奏。一台能跑虚拟机的电脑内存建议16G起步因为Gazebo仿真很吃资源8G内存跑起来会卡到你想砸键盘。CPU核心越多越好最好有独立显卡仿真渲染会顺滑很多。虚拟机软件加Ubuntu镜像我用的方案是虚拟机里跑Ubuntu。这里提醒一句虚拟机要开3D加速否则Gazebo可能起不来或者黑屏。稳定的网络环境加国内软件镜像源装ROS的软件包体积不小提前把系统的软件源换成国内镜像下载速度能快好几倍。一个趁手的代码编辑器VS Code远程连虚拟机是我的标配写C和Python都舒服还带终端。一个记录本听起来土但ROS的报错太杂了把每次报错和解决办法记下来比事后翻聊天记录强一百倍。提示如果你的电脑配置实在有限也可以考虑用在线仿真环境先感受一下Gazebo和RViz等确认要深入学了再升级硬件。不过在线环境不能保存你的工程长期学习还是本地环境靠谱。2. 环境搭建从系统版本到ROS安装的完整落地环境搭建是劝退率最高的一关我把它单独拎出来讲透。这部分你要是能一次过后面学习体验会好非常多。2.1 Ubuntu和ROS版本到底怎么配对这是所有新手的第一道选择题选错了后面全是坑。ROS的每个发行版都是绑定特定Ubuntu版本的因为底层依赖的库和编译器版本要对得上。我把主流的几组对应关系列出来Ubuntu版本推荐ROS版本生命周期状态适合人群Ubuntu 20.04ROS Noetic长期支持资料最多新手首选教程兼容性最好Ubuntu 22.04ROS 2 Humble长期支持社区活跃想学ROS 2、做新项目的Ubuntu 18.04ROS Melodic已停止维护不建议新装我的建议很直接如果你是纯新手跟着《ROS入门21讲》学首选Ubuntu 20.04加ROS Noetic。原因是这套课程的例程、命令、目录结构基本都是按Noetic这一代来的你照做不会出现对不上的情况。等你把ROS 1的思维建立起来了再迁移到ROS 2 Humble会很轻松因为ROS 2在概念上和ROS 1是一脉相承的只是通信机制换了底层实现。有人会问那我直接上ROS 2 Humble行不行可以但要有个心理准备ROS 1和ROS 2的命令行工具、构建系统、Launch文件格式都不一样你跟着ROS 1的教程学很多命令得自己翻译成ROS 2的写法。所以我更推荐先ROS 1打基础再ROS 2跟趋势的路径。2.2 安装方式选型一键脚本还是手动配置ROS的安装方式主要有三种我全试过给你交个底。第一种是官方推荐的手动配置方式就是先添加软件源密钥再配置源地址然后apt install。这种方式最稳妥、最透明你知道每一步在干什么出问题也好排查。缺点是步骤多新手容易在某一步敲错命令。我第一条命就是挂在这里的密钥添加那一步网络抽风重试了好几次。第二种是社区流传的一键安装脚本。网上比较有名的是鱼香ROS一键安装这类工具它的原理其实很简单就是把你手动要敲的那一长串命令封装成一个脚本自动执行并且帮你把国内镜像源配好、把常见依赖一起装了。对于怕麻烦的新手这确实能省不少事。但我必须说清楚它的风险脚本来源你要确认可靠因为它会以管理员权限改你的系统配置而且用脚本装完之后你最好还是搞清楚它到底做了哪些操作否则后面报错了你不知道从哪查。注意无论用哪种方式装完后一定要用roscore和一个小海龟例程验证能起来才算真的装好了。不要装完就往下学环境没验证过后面所有问题你都会怀疑是不是环境的问题。第三种是Docker容器方式。这个适合有一定基础的人好处是环境隔离、可复现、随时删了重来。缺点是图形界面RViz、Gazebo的显示配置稍微麻烦新手不推荐作为首选。我的实操结论是第一次装跟着官方步骤手动走一遍哪怕慢一点。这一遍你会理解软件源、依赖、环境变量是怎么回事这笔投资很值。等你装第二台、第三台机器的时候再用一键脚本提效。2.3 装完必做的三件验证事装完ROS别急着高兴做完下面三件事再往下走。第一件验证核心命令。打开终端敲roscore如果看到类似started core service的输出说明核心节点管理服务起来了。这个roscore是ROS运行的总管家所有节点通信都得先有它。第二件跑小海龟。这是ROS界的Hello World。你需要开三个终端分别运行roscore、rosrun turtlesim turtlesim_node、rosrun turtlesim turtle_teleop_key。第三个终端里鼠标焦点放上去按方向键屏幕上那只小海龟就会动。这个例程跑通了说明你的话题通信、节点运行、可视化全都正常。第三件检查环境变量。在终端里echo $ROS_PACKAGE_PATH看看输出的路径对不对。这一步是为了确认你的工作空间已经正确加入到ROS的查找路径里后面自己建的功能包能不能被找到全靠这个变量。顺便提一句小海龟的进阶玩法默认只有一只海龟但你可以用rosrun turtlesim里提供的spawn服务生成多只海龟然后再用键盘控制。这个练习特别适合刚学完服务和参数的人能帮你把服务调用这个抽象概念变成看得见的东西。我当时用命令行调了好几次才成功因为要生成海龟得调用/spawn服务并传参这个体感比看文档强多了。3. 21讲核心知识点的实操拆解这一部分是整篇笔记的重头戏我把21讲里信息密度最高、最值得反复练的几个模块拆开讲。3.1 工作空间与功能包一切代码的落脚点ROS里你写的所有代码都必须放在一个叫工作空间workspace的目录结构里。这个概念刚听会有点绕我打个比方工作空间就像一个项目仓库功能包package就是仓库里一个个独立的箱子每个箱子里装着完成某项功能所需的代码、配置和依赖声明。标准的创建工作空间流程是建一个目录在里面建src子目录然后回到工作空间根目录执行编译命令。编译完之后你会看到build和devel两个新目录出现devel里有setup.bash这个关键脚本每次新开终端要用工作空间里的东西都得先source一下这个脚本。这一步是新手遗忘率最高的忘了source就会报找不到功能包然后一头雾水。创建功能包的时机也有讲究。包名不能有大写字母得用下划线或小写字母这是ROS的命名规范违反了编译直接报错。创建时你还要声明这个包依赖哪些东西比如用Python写的节点要依赖rospy用C写的依赖roscpp要自己定义消息的还要加message_generation。这些依赖写漏了编译时会告诉你找不到某个头文件或者模块。实操心得我养成了一个习惯每新建一个工作空间第一件事就是把它写进终端的启动配置里让它自动source。这样就不用每次开终端都手动敲一遍省心又不容易忘。这个小技巧让我少报了很多莫名其妙的错。3.2 发布者与订阅者搞懂ROS的通信心脏如果说ROS有心脏那一定是话题topic通信。发布者Publisher往某个话题上发消息订阅者Subscriber从同一个话题上收消息两者互不认识、完全解耦。这个设计的妙处在于一台摄像头节点只管往/image话题上发图像谁想看谁就订阅摄像头根本不需要知道下游是谁。这种松耦合是机器人系统能灵活组合的根本原因。我跟着课程写的第一个发布者是一个每隔一秒往话题上发一个字符串的简单节点。别小看这个它包含了你必须掌握的所有要素初始化节点、创建发布者句柄、定义消息类型、设置发布频率、组织消息内容、调用发布方法、循环保持运行。写这个节点时有几个细节特别值得说。第一节点名称在同一个ROS网络里不能重复重名会导致老节点被顶掉第一次遇到这个现象的人会一脸懵明明进程还在怎么就不发消息了。第二发布频率的定时器是节拍器你要理解它是周期性触发的而不是循环里睡眠。第三消息类型必须和话题上其他节点一致类型对不上会静默失败收端啥也看不到。订阅者的写法和发布者对称核心是注册一个回调函数。每当有新消息到达话题ROS就会自动调用这个回调把消息作为参数传进来。这里有一个初学者经常困惑的点回调函数不是你主动调的是框架调的所以你不能在回调里写耗时的阻塞操作否则会堵住整个消息处理流程。我一开始就在回调里做了复杂计算结果消息堆积、延迟越来越大找了半天才发现是这里的问题。3.3 服务、参数与Launch让工程真正跑起来的工具**服务service**和话题不一样它是请求—应答模式的同步通信。客户端发一个请求服务端处理完返回结果。什么时候用服务当你要让机器人做一个动作并等它做完的时候。比如让海龟瞬间移动到某个坐标这就是服务而让海龟持续移动这就是话题。我学到这里时才真正理解了ROS为什么要有两套通信机制它们解决的是不同形态的问题。参数服务器是ROS里一个全局的键值存储用来放那些全局配置比如机器人的尺寸、相机分辨率、控制增益。它的好处是同一份代码改个参数就能适配不同硬件不用重新编译。我做过一个练习把小车速度参数放到参数服务器上然后运行时动态改它看着小车的运动速度实时变化这个体感非常好。Launch文件是工程化的关键。当你有十几个节点要同时启动、还要给它们配参数、重命名话题、设置命名空间时开十几个终端一个个敲命令简直是折磨。Launch文件用XML格式把这些启动配置写在一起一条roslaunch命令全搞定。我第一次写Launch文件时最大的收获是理解了启动顺序和参数注入这两件事——它能在节点启动前把参数写到服务器上这个能力在配置复杂系统时太重要了。通信方式模式典型场景一句话记忆话题 Topic异步、多对多、单向流传感器数据、持续控制发出去就完事不管谁收服务 Service同步、请求应答动作触发、状态查询发出请求等回复参数 Parameter全局键值存储配置、调参全系统共享的备忘录动作 Action长任务、带进度反馈导航、机械臂运动长时间任务的分阶段处理3.4 坐标系与TF变换机器人学会定位的前提TF是ROS里我个人认为最抽象、但也是最不可或缺的一块。它的核心任务是维护机器人身上各个部件坐标系之间的相对位置关系并且随时间动态更新。举个小车的例子你就懂了。小车有个底盘坐标系上面装了激光雷达雷达有自己的坐标系还有摄像头、里程计等等。这些坐标系之间的位置关系谁在谁的什么位置、朝向如何必须随时可查这样当雷达检测到前方有障碍系统才能换算到这个障碍相对车身在哪里。TF做的就是这件事。课程里用的小海龟跟随案例特别经典一只海龟追另一只海龟。这个案例把TF的发布海龟自身位置和监听计算与目标海龟的相对关系都用上了。我跟着做完之后突然就理解了为什么机器人导航、机械臂控制都绕不开坐标变换。学TF时最有效的办法是用RViz可视化出来。RViz里能看到所有坐标系的树状结构你能直观看到哪个坐标系挂在哪个下面哪个断了。我遇到过坐标系断开的情况RViz里会提示no transform这时候顺着坐标树的连接到断点基本都能定位到问题——要么是某个节点没起要么是时间戳对不上。这里还有个小坑TF对时间非常敏感如果两个节点的时间源不一致会报外推错误解决办法之一是统一使用仿真时间。3.5 从URDF建模到Gazebo仿真把机器人造出来到这一块学习就开始有成就感了。URDF是一种用XML描述机器人模型的格式你把机器人的连杆link和关节joint一个个写出来就得到了一个数字化的机器人。写URDF最容易出错的地方是关节的坐标系定义。每个连杆的坐标原点在哪、关节的旋转轴是哪个方向、父子关系怎么连这几个参数错一个机器人模型在RViz里就会散架或者扭成奇怪的形状。我建议的入门顺序是先写一个只有一两个连杆的简单模型在RViz里显示正常了再往上加部件。千万不要一上来就把整套机械臂的模型写完再调试那样出了错你根本不知道是哪个关节的问题。URDF写完后下一步是让它动起来这就用到Gazebo。Gazebo是仿真环境它不仅能显示你的机器人还能模拟重力、碰撞、摩擦、传感器数据。你需要给URDF补上惯性和碰撞属性加上驱动插件机器人才能在Gazebo里被控制着动。Gazebo的传感器仿真是我最推荐花时间研究的部分。你可以在仿真里给小车装上激光雷达、摄像头然后这些虚拟传感器会实时输出数据到对应话题上和真实硬件的使用方式一模一样。这意味着你可以在没有硬件的情况下把整个感知、建图、导航的流程全跑通。这个能力对预算有限的学习者来说太关键了。实操心得Gazebo很吃内存和显卡。如果虚拟机里跑起来特别卡可以关掉阴影、降低渲染精度或者干脆用无头模式启动再配合RViz看结果。我一开始不知道这些硬扛着卡顿学了好几天后来调了渲染设置才顺畅。4. 从仿真Demo走向真实项目进阶方向怎么接把21讲的主干学完之后你会面临一个选择往哪个方向深入我把常见的几条路和自己的体验分享一下。4.1 小车自主导航SLAM到路径规划这是ROS最经典的应用方向。整个链路大概是传感器给数据SLAM算法建图并定位导航栈根据目标点规划路径并输出速度指令驱动节点执行。入门建议从仿真小车做自主导航开始。仿真环境里已经给你准备好了传感器和场景你只需要配置好导航参数、在RViz里点一个目标点小车就会自己规划路线过去。这个过程能让你理解代价地图、全局规划、局部规划、恢复行为这几个概念是怎么串起来的。我第一次跑通仿真导航时小车在那个房间场景里绕来绕去最后到达目标点的感觉至今记得很清楚。但别以为跑通就完事了真正的功夫在调参。比如小车老是贴着墙走可能是代价地图的膨胀半径设小了小车在窄通道前犹豫不决可能是局部规划器参数不匹配。这些调参经验没人能直接给你得自己一遍遍试。4.2 机械臂开发从MoveIt到抓取机械臂方向是另一个大热门很多人就是冲着机械臂来的。这块的学习路径和小车不太一样核心工具是MoveIt。MoveIt帮你解决的是运动规划问题给定目标位姿算出一条从当前姿态到目标姿态、且不撞到自己的关节轨迹。你要做的是把机械臂的模型配置好MoveIt就能在RViz里给你演示规划过程和结果。AR3这类桌面级机械臂很适合入门模型和例程社区里都有。真机开发时的第一个大坎是标定。仿真里一切完美到了真机相机和机械臂之间的位置关系、手眼关系都需要标定否则你算出来的抓取位姿永远差那么一截。我的建议是真机调试前先把仿真的抓取流程完全跑通把视觉识别、坐标变换、运动规划的代码逻辑都验证好再上真机这样真机上只需要处理标定和通信的问题难度就降下来了。4.3 图像采集与多机通信这类工程活学到一定阶段你可能会遇到一些具体的工程需求这里挑两个高频的说。一个是相机数据采集。不少人想用工业相机采集图像做数据集接ROS的方案通常是装相机对应的驱动功能包把图像发到话题上再用录制工具把话题数据存成包文件。这里要注意分辨率和帧率对存储速度的影响分辨率开太高、帧率太快硬盘写入跟不上就会丢帧得结合你的硬盘性能做取舍。另一个是多机通信。当你有一台主机负责计算、一台从机装在机器人上负责采集和执行时就需要让它们在一个ROS网络里协同。核心是配置好主机地址、让从机指向主机的节点管理器并且保证两台机器时钟同步。这里坑最多的是网络和环境变量两端的主机名解析、环境变量设置必须一致否则会出现节点能ping通但彼此看不见的怪现象。我调这个问题花了一整个晚上最后发现是两端配置不一致导致的。5. 常见问题与排查技巧实录这一节是我最想分享的部分因为下面每一条都是真金白银的踩坑换来的。5.1 环境与安装类问题速查现象大概率原因解决方向无法定位软件包软件源没配好或版本不匹配检查系统源、确认ROS版本对应关系roscore起不来环境变量没source重新source安装目录和工作空间的setup脚本找不到功能包工作空间没编译或没source重新编译并source devel里的脚本Gazebo启动黑屏卡死显卡渲染问题开3D加速、降低渲染精度、关阴影虚拟机特别卡内存或显存不足加内存、精简仿真场景、用无头模式5.2 编译与运行类问题排查思路编译报错其实不可怕ROS的编译错误信息通常指得很明确。核心排查顺序是先看错误发生在哪个功能包再看缺的是依赖、头文件还是语法问题。九成的编译失败是依赖没声明全尤其是自定义消息相关的依赖很容易漏。运行期的问题更隐蔽。我的排查口诀是三看一查一看节点列表有没有起来二看话题列表有没有数据在流三看终端有没有持续的报错刷屏一查就是查环境变量和配置。比如你发现订阅者收不到消息先看发布者节点在不在再看话题名对不对话题名大小写、前面的斜杠都会影响匹配最后看消息类型对不对。很多时候就是话题名少了个斜杠或者拼错了一个字母。还有一个新手特有的困惑明明运行了却看不到任何输出。这种情况先确认你的节点是不是一直在运行有的节点发一次就退出了再确认有没有把数据打印出来的语句。ROS里最实用的调试手段反而是最土的那几个命令行工具它们能告诉你系统的实时状态比瞎猜强太多。注意遇到问题先别急着改代码先确认信息通路是通的。节点在不在、话题通不通、类型对不对这三步能解决八成的没反应问题。5.3 时间同步、消息类型不一致这类深水坑有几个坑比较深单独拎出来说。时间相关的问题。仿真里如果你用仿真时间而某个节点用的是系统时间两者会打架导致TF报外推错误或者定时器行为异常。解决办法是让全系统统一时间源仿真场景下统一用仿真时间。消息类型不一致。这个话题上A发的是标准消息B订的是自定义消息类型名字相似但底层定义不同收端就静默失败。这类问题不看仔细很难发现因为ROS不会总是明确告诉你类型不匹配。坐标变换断层。前面提过RViz里坐标树断开时不要盲目改代码顺着树找断点通常是某个负责发布变换的节点没启动。参数加载顺序。Launch文件里参数和节点的顺序会影响结果如果你发现节点用的是默认参数而不是你设的值回头检查一下Launch里的顺序和命名空间。5.4 我自己总结的学习避坑心得最后分享几条我认为对零基础的人最有用的经验。第一不要囤教程跟一套就够了。我一开始同时开了三套课程结果每套都学了个开头知识还是散的。选定《ROS入门21讲》这一套一讲一讲老老实实敲、跑、改比泛读十套强。第二每个知识点都要动手改一个参数看变化。比如发布频率从1赫兹改到10赫兹观察接收端的区别把服务改成话题体会两种机制的差异。这种主动扰动能让你真正理解参数的意义而不是照抄。第三善用命令行诊断工具但别只依赖图形界面。RViz、Gazebo直观但排查底层问题时命令行工具给出的信息更本质。两者结合一个看是什么样一个看为什么这样。第四把工程保存好定期备份工作空间。我丢过一次工作空间重装重配花了大半天从那以后我养成了定期打包备份的习惯。虚拟机快照也是个好办法装好环境后先快照一份搞崩了直接回滚。第五遇到报错先读完整信息别只看最后一行。ROS的报错往往在前面几行就告诉了你根因最后一行只是最终表现。我早期总盯着最后一行看走了很多弯路。第六给自己定一个小目标来收尾学习。纯学知识点很容易半途而废我的做法是学完基础后立刻定一个可交付的小项目比如让仿真小车自主导航到指定点并停稳围绕这个目标去补知识动力和方向都会清晰很多。这个目标不用大但它能把你散落的知识点全部串起来也能让你真正体会到ROS作为一套系统框架的威力。这套笔记写下来其实也是我自己把学过的内容重新消化了一遍。ROS入门不难难的是耐心和动手只要你愿意一个例程一个例程地敲下去那些一开始看不懂的概念迟早会变得理所当然。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。