LOADING

加载过慢请开启缓存 浏览器默认开启

doc_for_fresh_man

1. 算法入门

本文将会持续更新到本句话被删除

1.1 先认识什么是算法组

其实对于“算法组”而言,叫他算法组是不太恰当的。但是如果叫他“视觉组”,那么其误解就更大了。首先,我们来认识什么是算法组。以及在robocon当中,算法组大体上需要完成什么任务。
以目前的RC趋势而言,自动机器人的重要性是逐年增加的。对于自动机器人,他需要进行复杂的感知,决策,控制。因此,应运而生专精于上位机的算法组。传统rm队伍当中,算法组一般叫做“视觉组”,视觉组主要负责装甲板自瞄,烧饼导航规划,雷达算法等。但是由于rc差异化更大,以及潜在需求更加多样,私以为视觉组这个名称对于实际任务已经不太妥当,因此我认为目前嵌入式linux任务统称为算法组更为合适。
在rc中,不仅只有视觉识别,导航规划,还有运动控制算法(足式多见),部分方案也有以上位机控制为主。在目前robotic到智能硬件,上下位机之间任务差距也在逐渐缩小。尤其是运动控制算法,已经基本上迁移到上位机进行。一方面是因为单片机成本逐渐增加(stm32系列都在涨价),另一方面运控基本普及的强化学习算法基本上直接输出电机控制参数,因此在使用强化学习的队伍中已经很少见单片机控制了。
接下来,由于笔者本人技术栈限制,本文将不会涉及运控方面的内容,想了解运控方面内容请移步loco wiki继续阅读,loco wiki由Lain维护。
(文章最底下有个音乐播放器,可以边听歌边读哦)

1.2 算法组的任务

上面提到,算法组将会主要负责视觉识别,导航规划内容。本文也将会从比赛角度,尽量不涉及专业数学计算对上位机任务进行解读。
以下是本文可能涉及的部分内容:

  • 电脑硬件
  • 可能使用的传感器
  • 串口通信协议
  • 视觉识别
  • 导航规划
  • 运动控制(参考loco wiki)
    首先我们将会从计算机基本原理进行解读。对于一些专业化内容,本文将会援引外部链接,不会进行详细解读。

2. 计算机硬件组成

这一节只讲四样东西:CPU、内存、硬盘、GPU,以及它们之间是怎么协作的。理解了这四样,你对计算机硬件就有了基本的认知。

2.1 CPU

CPU(中央处理器,Central Processing Unit) 是计算机的核心芯片,负责执行指令。所谓指令,就是告诉 CPU 该做什么的一串二进制数字,比如做一次加法、读取一个数据、把结果写回去。

CPU 的工作就是不断重复以下循环:

  1. 取指(Fetch):从内存中读取一条指令
  2. 译码(Decode):解析这条指令要做什么操作
  3. 执行(Execute):完成这个操作
  4. 写回(Write Back):把运算结果存回寄存器或内存

这个循环称为指令周期,CPU 一秒钟能完成几十亿次。所有程序,无论是你写的 Python 脚本还是原神,最终都会被编译成这种最基础的指令,被 CPU 一条条地执行。

CPU 有几个关键参数:

  • 核心数(Core):CPU 内部独立的运算单元,每个核心可以同时执行一个指令流。多核心意味着可以真正并行处理多个任务。比如 4 核 CPU 可以同时跑视觉识别、导航规划、串口通信,互不干扰
  • 主频(Clock Speed):CPU 的工作频率,单位是 GHz。3.0GHz 表示每秒执行 30 亿次时钟周期。主频越高,单条指令执行越快

2.2 内存

内存(RAM,Random Access Memory,随机存取存储器) 是 CPU 直接访问的存储空间。程序要运行,必须先从硬盘加载到内存里,因为 CPU 只能直接读写内存,不能直接读写硬盘。

内存有两个重要特点:

  • 断电即丢失:内存是易失性存储,关机后数据就没了,所以写文档要记得保存到硬盘
  • 速度快但容量小:读取速度远快于硬盘,但容量通常只有 8GB~64GB

在算法组的场景下,内存大小直接决定了能处理的图像分辨率和并发任务数。跑深度学习模型时,模型参数要全部加载到内存(如果用 GPU 跑则是加载到显存)里,不够就会直接报错。

2.3 硬盘

硬盘是永久存储数据的设备,断电不丢。主要分两类:

机械硬盘(HDD,Hard Disk Drive):内部有物理磁盘在高速旋转,通过磁头读写数据。容量大、价格便宜,但读取速度慢(约 100~200MB/s),而且有机械结构,怕震动。比赛机器人的上位机一般不用 HDD,因为机器人运动时的震动可能导致磁头划伤磁盘导致硬盘报废。但是由于价格美丽,经常有人会将其作为数据存储使用。

固态硬盘(SSD,Solid State Drive):没有机械结构,纯电子存储(本质是闪存芯片)。速度快(约 500~7000MB/s),抗震动,但价格更贵。现在笔记本基本都用 SSD。

2.4 GPU

GPU(图形处理器,Graphics Processing Unit) 最初是为了渲染 3D 画面发明的,但后来人们发现它的架构特别适合做并行计算–也就是同时执行大量简单的运算。

CPU 和 GPU 的设计取向不同。CPU 的核心少但每个核心都很强,擅长处理复杂的逻辑判断和串行任务;GPU 的核心多但每个核心都比较简单,擅长同时处理大量结构相同的运算。

深度学习本质上就是海量的矩阵乘法运算,正好是 GPU 擅长的场景。所以训练神经网络、跑模型推理时,GPU 是必需品。

GPU 有一个关键参数:显存(VRAM,Video RAM),也就是 GPU 专用的内存。模型越大、图像分辨率越高,需要的显存越大。跑 YOLOv8神经网络视觉识别模型 通常需要 2GB 以上。

2.5 它们是怎么协作的

把这四样东西串起来,计算机的工作流程是这样的:

  1. 程序和数据的”老家”在硬盘里,长期存储
  2. 你双击运行程序时,程序代码和所需数据从硬盘加载到内存里
  3. CPU 从内存中逐条读取指令并执行,中间结果存在内存里
  4. 如果遇到深度学习这类大规模并行计算任务,CPU 会把数据转交给 GPU,GPU 用自己的显存暂存数据,算完再把结果返回给 CPU
  5. 程序运行结束后,如果要保存结果,数据从内存写回硬盘

所以你会发现,这几个部件构成了一个层次结构:硬盘容量最大但最慢,内存居中,CPU 缓存最快但最小。数据从慢的逐级搬运到快的,CPU 才能高效工作。这也是为什么程序需要”加载”才能运行,为什么内存不够会卡顿,为什么有 GPU 跑深度学习会快很多。

2.7 关于CUDA技术

上一节说到 GPU 擅长并行计算,但 GPU 原本是为了画图设计的,直接用图形 API 来做通用计算非常不方便。为了让开发者能用类似写 C 语言的方式来调用 GPU,NVIDIA 推出了 CUDA(Compute Unified Device Architecture,统一计算设备架构)。

简单来说,CUDA 是 NVIDIA 提供的一套软件平台和编程模型,让你可以写代码直接控制 GPU 做通用计算,而不仅仅是画图。你在写 PyTorch、TensorFlow 时,底层调用的就是 CUDA。

这里有一个前提:CUDA 只支持 NVIDIA 的 GPU。如果你买的是 AMD 显卡或者 Intel 核显,是无法使用 CUDA 的,只能走 OpenCL 或 ROCm 等替代方案,但这些方案在深度学习生态中的支持远不如 CUDA 完善。这也是为什么算法组选电脑时首选 NVIDIA 显卡。

不过截止本文攥写时,Rocm已经被不少人验证其性能并不弱于cuda。

2.8 算法组如何挑选电脑

首先说一个暴论:MacBook绝对是算法组的最佳选择(笑)。
首先,mac有以下优点:

  • 类linux操作逻辑,也支持ros2
  • 续航优秀,重量较轻
  • 性能相对于续航,重量而言较高
  • 工具链齐全,写电控也没问题。
    至于缺点,贵是我的缺点不是他的(x)

但是在MacBook大幅涨价的现在,MacBook neo的性价比都已经不如8845笔记本。在这个现状下,最优选基本上是带有4060显卡的上一代笔记本了。

挑选电脑的第一原则:轻。不要买你接受不了天天端着跑的电脑,不然调车会比较享福。
第二:尽量选择可加装内存硬盘的电脑,不然在你没有额外存储设备的情况下,你的存储会爆炸的。
第三:别碰那个不能说的品牌,homo系统啥都干不了。
第四:最好不要对二手有歧视,别人调好的人妻说不定更温柔,不要有处女情结。

综上,目前市场行情下个人最推荐梯度:

  • 第一:MacBook Air系列二手,华硕天选,拯救者7000系列
  • 第二:MacBook neo系列二手,机械革命,天选和拯救者二手机
  • 第三:MacBook neo和Air系列新机,机械革命二手机,其他品牌新机
    由于大部分家长确实不太接受二手电脑,上述顺序自行剔除二手机即可。若家里人非得买那个品牌,首先尝试劝说能否购买荣耀笔记本,若还是不能则选择win11系统的旧款电脑。真买了也别着急认栽,也别拆封直接转手,然后自行购入AMD7840 CPU的笔记本。

2.9 电脑到手该做什么

首先,需要确认是否是新机或者无故障暗病的二手机。全程录制开箱视频,不要着急充电。首先我们来进行新机开箱:
新机就不要学网上花里胡哨的,首先检查快递盒有无严重变形,然后拆封后看电脑包装是否八角尖尖,查看封条贴纸是否有拆封痕迹(是否有胶痕就能看出来)。若正常,拆封进入下一步。首先拿出电脑,检查外壳磕碰,屏幕是否有落灰。若正常,继续下一步。接下来,打开电脑,正常没充电过按下开机键时是没反应的,如果开机了趁着还没激活,申请退换货吧。在运输模式下,未充电应该是不能开机的。在这一步正常后,插电开机进入系统,若正常为激活界面,直接照着电脑走流程即可,其余不用操作。进入系统后右键底下任务栏空白处,找到任务管理器,性能页面,检查存储,内存,cpu,显卡是否是自己购买的型号。若都正确,则安全下车。
对于二手机:录制开箱视频,然后下载图吧工具箱,使用甜甜圈和cpuz进行跑分测试,若在误差范围内,安全下车。二手机建议在老二道贩子处购买,价格适当,也没那么多个人卖家的扯皮,确保安全。

然后,现在你已经进入系统了,首先下载一个图吧工具箱,然后先进入系统设置搜索BitLocker,关闭它。如果不关,你电脑哪天不开机了就只能重装系统了。接下来,进入图吧工具箱,打开diskgenuis,把一个盘分一个卷,乱七八糟的分卷统统不要,不然以后空余空间这里一点那里一点,会非常难受。届时你就像个无能的丈夫一样看着空间一点一点被吞你啥都干不了。好了,现在你想干嘛都行,先去下个steam开始打游戏吧,玩爽了记得回来把这个文档读完。

3. 算法前期准备

3.1 环境搭建

首先,目前很多算法都是基于ubuntu构建的,因此先尽量尝试拥有一个安全的ubuntu环境。ubuntu是一个linux操作系统,它基于debian发行版,提供了一个安全、稳定、易用的环境。关于Ubuntu系统介绍援引以上视频,本文不做过多介绍。总之,Ubuntu系统将会是很多ROS开发的硬性要求,根据电脑自己的情况可以考虑虚拟机,WSL或者双系统。个人最推荐双系统,有两块物理硬盘的同学可以酌情考虑自行搜索教程安装双系统。其次就是WSL,直接运行在windows下的子系统,但是在一些环境兼容性上可能会有问题。接着就是虚拟机,性能损耗会大点,但是十分安全,不怕带着win系统一起炸了。
目前ubuntu版本选择多样,个人建议Ubuntu22.04和24.04,性能较高的算法都是基于这两个版本的兼容性。尤其是ubuntu22.04,截止本文攥写时兼容性最佳。

安装完ubuntu,接着就需要准备好你的python环境了。python是一个解释型语言,它有丰富的库和工具,可以快速开发出各种应用。目前很多导航和建图算法都是基于python的,因此需要先准备好python环境。近几年最常用的版本是3.10-3.12,建议安装一个3.10版本的python。部分ubuntu版本自带python,可以直接使用,但是要注意版本检查。

接下来,需要安装ros2环境了。这里推荐小鱼的一键安装脚本wget http://fishros.com/install -O fishros && . fishros跟着脚本一步到位即可。

按需自行根据教程安装conda或者直接使用venv(建议),他会创建虚拟环境,防止你库下太多主环境爆炸。同时虚拟环境也像一个杯子,里面需要的东西随时可以端走,十分方便。

Ubuntu系统可能缺失PIP(一种python包管理工具),需要手动安装。

sudo apt update
sudo apt install python3-pip

即可安装pip。

3.2 部分基本素养介绍

算法最重要的就是编程,编程并不是开个shell再开个记事本就能完成的。虽然确实有人纯靠VIM就能编写一个C语言项目,但是能达到这个水平的人绝对不会来读这个文档。
对于算法,C语言基础和python基础都是必须的。python不建议作为第一门语言学习,虽然他可以培养很好的格式习惯(python对缩进格式有严格要求)但是它并不能很好的培养你的代码习惯。具体原因学习到一定程度就能理解。因此这里建议先学习C语言,再学习python。C语言学习无须精通,可以学会基础语法格式,如何调用库,如何封装自己的库即可。python同理。接下来很多语法细节通过开源代码或者一些教程网站如菜鸟教程,还有bilibili等渠道自行学习即可。

其次,就是对于系统架构的把控。这个功能和这个功能是否该放在一个文件下?main文件该放什么?这些都需要根据具体的情况来判断。如果是一个简单的算法,那么main文件就可以直接放所有代码。但是如果是一个复杂的算法,那么就需要将代码拆分成多个文件,每个文件负责一个功能。甚至在我的开源项目中,你就可以看到我把文件分为了HAL(硬件抽象层)和基础功能层。在26赛季的R2上位机代码中,GUI执行更是直接将UI,动作组,执行层解耦实现灵活变更。对于系统架构优化清晰,不论是在agent进行vibecoding时还是自己进行古法编程时都是有利的。ai编程不会帮你把控系统架构,因此只能靠自己进行把控。关于ai编程,本文最后会提到。

正视ai编程,ai是一个很好用的高效率工具而不是洪水猛兽。但是在进行ai编程时需要注意盯好思考过程和代码修改。全流程一定要注意把关好,否则高低要给你整点大活。而AI编程最需要的,则是你的表达能力。如何准确,简洁,直接的说出你的需求。事实上,和其他人沟通最高效的语句反而是最优的promote。语言表达能力,组织架构能力都是ai时代ai编程很重要的一环。至于ai思考的时候你能做什么,那就见仁见智了。

除去软件部分,传感器,硬件也是需要了解的。算法常见的传感器,例如相机根据调用方式分类有USB相机,工业相机(需要使用专门SDK),还有激光雷达(需要使用专门驱动),IMU(需要使用专门SDK)等可以直接读取的传感器。当然,关节电机的力矩,3508的电流等也可以近似作为力传感器。后面将会对部分我所了解的传感器做专门介绍。

既然已经进入机器人开发,对于机器人整体也是需要有所认知的。机械,电控,硬件,算法在机器人系统中起到什么角色,各自开发都做了什么,了解这些将会更加有利于整体合作流程。机器人是脱离不开硬件的,任何sim不谈real都是耍流氓。对于硬件理解越加深入,排查问题时越能对症下药。

3.3算法学习路径

首先,先把C艹或者python学清楚。尽管本人真的十分不推荐先学python,但是不可否认在AI coding趋势下C艹语言各种复杂的api可以依靠AI进行处理,甚至可以让python调用C艹语言的库。而python的大部分高性能的库更是主要由c语言编写的。并且实际在ROS开发中跨语言是很常见的事。C语言个人建议在bilibili或者菜鸟教程中,尝试跟进部分小项目进行学习。这样快速掌握C语言语法基础后,再开始准备python的学习。尽管python有很多语法和c有较大差距,但是c语言的大部分编程习惯很容易迁移到py中。接下来在学习py的时候,只需要注意最核心的一件事——py和c的区别。
c语言就像很多教材教的那样,作为一个高级语言是需要编译为计算机语言的。在很多教材中,通常会用翻译的例子。c语言的运行过程就像是邮件,需要翻译为计算机能看懂的语言后运行。而py则是解释器语言,解释器逐行翻译py给计算机执行。这也带来一个问题,第一就是由于python需要运行解释器,因此py的运行速度普遍比c慢很多,部分简单项目甚至能达到十倍级的速度差。而c虽然经常因为语法问题被人吐槽诸多,但是其高性能和高速扩张时期的红利使其长时间内也难以被取代。具体需要使用哪种语言,可以通过任务区别进行选择。
对两种基础编程语言有概念后,就该继续学习如何成为调包侠了。首先尝试学习ROS的相关库,以及ros有一些很方便的用法,然后就可以尝试调用rosbag进行数据回放。rosbag是记录了ros话题数据的一种文件,可以在硬件设备不足的情况下进行算法的调试和学习工作。

3.4算法组建议时间安排

基础的语言基础建议花上两个月好好沉淀一下。毕竟人不是只能打比赛,还是需要管好课内成绩。一不小心开了无敌模式那就往死里干吧

  • 大一八月,建议自行安装好vscode,尝试学习python和c艹语言的基础语法。顺便,好好享受最后的暑假。
  • 大一九月,开始了解纳新安排,学习纳新课程,直到十月都不需要额外学习新的内容。
  • 大一十月,可以尝试自行安装双系统了。比较建议的是双系统+WSL的配置,WSL相对方便,而双系统才能提供较好的开发环境。
  • 大一十一月,着手准备校内赛。一般而言校内赛难度不会很高,但是也是一个小小的完成项目的机会。
  • 大一十二月,此时可以接触到学长代码了,不要去读代码,让AI对代码进行总结架构,然后去了解各个模块的内容。对于AI如何使用后文会提及。
  • 大一次年一月到七月,可以开始辅助学长备赛同时,尝试学习opencv和pytorch,熟悉常用的slam算法,熟悉这两项将会是后续开发的基础。
  • 接下来你是大二了,该敲定选用的算法方案了。到这里你应该就有自己的备赛节奏了。

4. 基础传感器知识

本文章最重要的饺子醋

4.0 传感器选型与设计

本小节作者:MTFTau-5

有关于传感器在比赛机器人的应用这里提出几点冗余设计愚见,算是给实习和比赛做一个暂时的总结。

传感器的使用是重要的,但是也是最容易出问题的——调好的参数或者做好的处理换一个环境可能就会因为空气问题或者其他的什么问题部分甚至全部失效,冗余设计是为了在部分传感器失效的情况下可以部分完成甚至平替之前的任务。学术一点那就是冗余的核心是抗失效,而不是堆数据量或堆精度。

暑假的智驾算法的传感器冗余设计我们使用四路鱼眼,六路针眼加一个lidar和8个补盲相机做处理,当然针眼和鱼眼还有补盲本身都在重复对近场信息的扫描与获取采样罢了,理论上一个鱼眼就能应付上面的工作量,但是不仅仅是为了增加模型的稳定性,更是为了防止传感器炸掉导致的突发问题,多一个传感器提供信息这无疑是一个重要的保险措施。

在模型层面,这里值得注意的点是融合与冗余是两个正交的概念。如果做的是类似于EKF,图优化什么的定位这种根本算不上彻底的冗余设计,你的传感器相互没有解耦,你这个只能说是增加了数据量与局部精确度罢了,重要的是是否在失效的时候可以解耦。比如用 χ² 一致性检验或协方差隔离来识别野值,一旦判定某路传感器失效,就把它的量测从滤波器中剔除,系统降级继续运行。航空航天导航中的联邦滤波器(federated filter)就是”多 IMU + GNSS 先融合提精度、再靠故障隔离保冗余”的典型案例,系统是否具备失效检测和降级重构的能力是冗余设计是否成熟的主要指标。

另一种思路是多路并行:用多个独立算法各自输出结果,最后做仲裁或投票。这种方式故障域隔离清晰,但代价是算力开销成倍增加,且多路输出不一致时,仲裁逻辑本身可能成为新的单点故障。因此实际工程上更常见的是分层冗余:传感器级冗余 + 故障检测 + 支持降级的融合器,而非简单的全并行。

在模型结构上,解耦设计确实有利于冗余。这里点名表扬一下 SparseE2E,其前后端解耦的编码器-头部耦合结构十分出色,值得借鉴;FUTR3D 也是很好的参考架构。需要说明的是,这类工作的”解耦”主要指模块化设计,其带来的模态级 dropout 鲁棒性是副产品而非主要贡献——但这种结构天然便于实现传感器失效时的模态降级,可以从中汲取灵感。(这也是我们实习公司算法的主要借鉴对象,成果很好)

在传感器选型层面,没必要追求高价与精确度。在经费紧张的情况下只能去发挥主观能动性了,传感器冗余设计也可以通过多路处理与融合输出等去平抑噪声,这里已经是老生常谈的东西了,就不再展开了。

4.1 图像传感器

图像传感器,大部分都是相机,比如常用的USB免驱相机,帧率和分辨率以及各种图像参数不方便调整,但是稳定性很高。其次就是需要使用专业SDK的工业相机,经典的就是海康威视的工业相机,从帧率和参数可调上都是深入开发的最佳选择。
相机一般由多个部分组成,包括传感器,镜头,外围电路。传感器分为堆栈式和背照式,堆栈式读出速度较快,不容易触发明显果冻效应
相机传感器是逐行扫描的:曝光时从第一行开始逐行读出,这种曝光方式称为卷帘快门(Rolling Shutter)。因为每一行的曝光时刻有先后,当画面中存在高速运动的物体时,先曝光和后曝光的行拍到的位置不同,物体就会出现倾斜、扭曲,这就是常说的果冻效应(Jello Effect)。与之对应的是全局快门(Global Shutter),所有像素在同一时刻曝光,高速运动场景下画面不会变形,很多工业高速相机采用的就是全局快门。

要理解这些现象,需要从传感器的硬件原理说起。图像传感器的核心是一块感光芯片,最常见的是 CMOS(Complementary Metal Oxide Semiconductor,互补金属氧化物半导体) 传感器。芯片表面排列着密密麻麻的感光单元,也就是像素(Pixel)。每个像素本质上是一个光电二极管:光线照射后,光子被转换为电子并积累起来,积累的电荷量就代表这一点的亮度;随后电荷经过放大和 ADC(模数转换)变成数字信号,再按行读出,最终组合成一幅完整的图像。分辨率指的就是像素阵列的大小,比如 1920×1080 表示水平 1920 个像素、垂直 1080 个像素。

根据内部结构,CMOS 传感器还可以分为前照式、背照式和堆栈式:

  • 前照式(FSI,Front-Side Illuminated):电路层位于感光层上方,光线必须穿过电路层才能到达感光二极管,进光效率有损失,暗光下噪点较多
  • 背照式(BSI,Back-Side Illuminated):把感光层翻转放到上方,光线直接照射感光二极管,进光效率大幅提升,暗光表现更好
  • 堆栈式(Stacked):在背照式的基础上,把图像处理电路堆叠到感光芯片的下方,读出速度更快,果冻效应更轻,还能集成缓存等电路

因此在选型时,堆栈式或背照式传感器通常是优先考虑的方向。

除了芯片结构,传感器尺寸同样重要。常见尺寸有 1/3”、1/2.5”、1/1.8”、1” 等,尺寸越大,同等分辨率下单像素面积越大,单个像素能接收的光子越多,噪点越少、动态范围越好。这也是为什么同样的分辨率,大底相机的画质明显更好。

曝光参数方面,图像亮度主要由三个量决定:快门时间(曝光时间)、增益(ISO) 和 光圈。快门时间越长进光越多,但运动物体更容易模糊;增益提高可以提亮画面,但会放大噪点;光圈由镜头控制,决定进光口径。在算法组的场景下,比赛场地光线变化大,通常需要根据环境动态调整曝光时间与增益,保证图像不过曝、不欠曝,识别算法才有稳定的输入。

最后是镜头。镜头决定相机的视场角与成像质量:焦距越短,视场越广,能看到更大的范围,但远处的物体在图像里更小;焦距越长,视场越窄,等效于”拉近”。镜头的畸变也是需要注意的,普通的广角镜头存在桶形畸变,画面边缘的直线会向外弯曲,如果要做像素坐标和物理坐标的映射,一般需要先做相机标定来矫正畸变。

4.2 IMU 传感器

本小节作者:uwvwko-zzz

IMU(惯性测量单元)是机器人上最常用的传感器之一,用来测量载体自身的角速度和加速度,进而解算出姿态和运动状态。可以说,只要是会动的东西——无人机、平衡车、四足机器人、人形机器人——上面几乎都有一颗 IMU。

IMU 一般由加速度计和陀螺仪组成,两者各三个轴,合称 6 轴;再加上三轴磁力计就是 9 轴(俗称 AHRS 参考系统)。加速度计感受比力(静止时能读到重力大小和方向),陀螺仪感受角速度,两者互补:陀螺仪短期精度高但会漂移,加速度计长期不漂但动态响应差、振动干扰大,所以工程上几乎总是用互补滤波或卡尔曼滤波把两者融合起来,得到稳定的姿态角。

从芯片原理上讲,消费级 IMU 基本都是 MEMS(微机电系统)工艺:在硅片上刻蚀出微米级的悬浮机械结构。加速度计的核心是一个由弹性梁支撑的检测质量块,加速度使质量块相对基座发生位移,带动梳齿状电极的极距/正对面积变化,通过差分电容检测把机械位移转成电信号;陀螺仪则利用科氏效应工作,先驱动质量块沿某个方向做持续微振动,芯片一旦旋转,质量块就会受到垂直于振动方向的科氏力,引起检测模态的位移,同样由电容变化读出,其大小正比于角速度。单芯片内还集成了温度传感器(用于温漂补偿)和 ADC,直接输出数字量。MEMS 器件体积小、集成度高、耐冲击、便宜,但相比光纤、激光陀螺噪声和零偏大得多,这是消费级 IMU 必须做滤波和标定的根本原因。

入门最经典的是 MPU6050,便宜、资料多,I2C 接口直接读原始数据,适合第一次写驱动和理解数据处理流程,但它的噪声和温漂比较大,并且鉴于其作为初代六轴芯片早已停产,不建议用在任何正式设计上,只适合学习。做机器人项目常用 BMI088 和 ICM 系列(如 ICM-42688),噪声密度低、支持 SPI 高采样率。如果不想自己写姿态解算,也可以直接买维特智能 WT901/达妙imu 这类成品模块,通过封装好的串口/ros2模块直接输出欧拉角和四元数,上手快。

使用 IMU 时要重点关注三个参数:量程、噪声密度和零偏稳定性。量程按应用选,平衡车 ±2g 够用,无人机会摔会翻滚,一般选 ±16g、±2000°/s;噪声决定了姿态解算的最终精度;零偏(bias)则是温漂的主要来源,高精度场合要做全温标定。使用前必须做静止校准:陀螺仪去零偏,加速度计校水平。安装上也有讲究,IMU 要尽量刚性固定在机体上、远离电机和振动源,实在避不开就加软垫减振,否则陀螺仪会被振出虚假角速度,这是四足机器人和无人机上非常常见的坑。

数据读取方面,I2C 适合低速场合(400kHz 下 100~200Hz 够用),SPI 适合高采样率(1kHz 以上,飞控和腿部姿态估计常用);输出的是原始值,要乘以分辨率转换系数才得到物理单位。拿到数据后,典型处理流程是:校准去零偏 → 低通或陷波滤波去振动 → 与其他传感器(编码器里程计、相机、激光)做融合。

在上位机上使用 IMU 一般有三条路线。最底层的是直读裸芯片:按寄存器手册通过 I2C/SPI 读出原始值,乘以分辨率系数得到物理量,再自己写 Mahony/Madgwick 或 EKF 做姿态解算,适合吃透原理;成品模块走串口更省事,模块内部已经解算好姿态,通过 USB 转 TTL(CH340/CP2102)按固定协议帧输出,例如维特智能的 0x55 帧头系列,每帧携带欧拉角/角速度/加速度等字段,上位机用 pyserial 按”帧头 + 长度 + 数据 + 校验和”解析字节流即可;ROS2 中则把解析封装成节点,将数据填入 sensor_msgs/Imu 发布到 /imu/data 话题,轴向定义要对齐 REP 103/REP 145,并且要在收到数据的当下打时间戳(而不是用处理或转发时刻),否则下游 EKF 融合的时序会错乱。之后交给 robot_localization 的 EKF 节点,IMU 提供姿态和角速度,编码器提供速度,最终输出稳定的 odom→base_link 里程计。达妙、维特这类成品模块官方一般都提供 ROS2 驱动包,拿来即用。

以上方案主要用于导航定位。而在四足机器人强化学习部署中,IMU 的用法不太一样:它不再服务于 EKF 里程计,而是直接为策略模型提供本体状态观测。典型流程是:策略在 Isaac Gym/Isaac Lab 中训练时,观测里就包含机体系角速度和投影重力向量(即重力单位向量旋转到机体坐标系下的表示,训练日志里的 proj_gravity,它隐含了机体的俯仰和横滚姿态);部署到实机时,IMU 以足够高的频率(通常 200Hz 以上)输出角速度和四元数,上位机用四元数把世界系重力向量旋转到机体系得到投影重力向量,再经过和训练时一致的缩放与截断,拼进 obs 送入网络推理,控制频率一般 50Hz。这套链路对延迟非常敏感——IMU 采样到关节指令下发每多 10ms,机器人在快速步态下就多一点打滑和摔跤的倾向,所以实机上往往绕开 ROS 话题,直接在控制进程里读 IMU。另外要注意观测一致性:训练时通常对角速度和投影重力加了噪声做 domain randomization,如果实机 IMU 噪声特性差异过大,需要重新标定或调大训练噪声,否则会出现仿真里能跑、实机上抖动甚至站不稳的 sim2real 落差。

4.3 激光雷达(LiDAR)

激光雷达(LiDAR,Light Detection and Ranging)是机器人感知距离的主力传感器。和相机”被动感光”不同,激光雷达主动发射激光:激光器发出脉冲,遇到物体反射回来,接收器测量光从发出到返回的时间差,乘以光速再除以 2 就得到距离。因为光速恒定,这种 TOF(Time of Flight,飞行时间)测距 精度很高,而且不依赖环境光照——漆黑的夜晚、逆光、炫光环境下相机可能直接导致数据不可用,而激光雷达照样稳定输出。

激光雷达输出的是一帧点云(Point Cloud):每个点包含三维坐标(x,y,z)和一个反射强度(intensity),强度值反映了物体表面的反射率。一帧点云就相当于告诉你”这周围哪里有障碍物、分别在哪个方向、多远”,非常适合建图、定位和避障。不过由于没有rgb信息,通常而言激光雷达难以分辨物体种类。但是结合点云语义分割也是可以识别出一些特定特征的。

按扫描机构的不同,激光雷达主要分为机械式旋转激光雷达和固态/半固态激光雷达两大类。下面用两款最经典的雷达说明结构差异。

VLP-16(机械式,重复线扫描的代表)

VLP-16 是 Velodyne 的经典 16 线机械雷达,早期自动驾驶和 SLAM 研究几乎人手一台。它的结构非常直观:16 对激光收发器竖直排列在电机底座上,每对收发器对应一个固定的垂直仰角,从 -15° 到 +15° 均匀分布(垂直视场 30°,相邻两线夹角 2°)。工作时电机带动整组收发器绕竖直轴高速旋转,一边转一边发射激光,于是扫出水平 360° 的点云。值得一提的是vlp并没有使用滑环达到交换数据和电源,而是使用电磁感应进行数据交换。这也使得其使用寿命几乎不受零件老化影响。

关键参数:点率 300,000 点/秒;水平角分辨率取决于转速,10Hz 转速下约 0.2°;量程约 100m。电机每转一圈,16 条激光就扫出 16 圈”圆环”,而且这个扫描图案每一圈、每一帧都一模一样,这就是重复线扫描(Repetitive Scanning)。

Mid-360(棱镜式,非重复扫描的代表)

Mid-360 是 Livox 的混合固态雷达,内部没有旋转电机,靠的是 Risley 棱镜:四线激光穿过两个以不同角速度旋转的楔形棱镜,出射方向被连续折射改变,光斑在视场内走出李萨如(Lissajous)花瓣形轨迹。三个棱镜模组围成一圈,拼接出水平 360°、垂直 -7°~+52°(共 59°)的视场;点率 200,000 点/秒,量程约 70m,近处盲区只有 10cm。

棱镜式雷达的扫描轨迹每一时刻都在变化,每一帧的图案都不重复,这就是非重复扫描(Non-Repetitive Scanning)。随着扫描时间增加,视场内的覆盖越来越密、盲区越来越少,官方描述就是”每帧扫描轨迹均不重复,随着扫描时长增加,视野盲区逐渐减少”。具体积分时间对应扫描率可以在官网查询。

重复线扫描 vs 非重复线扫描

对比项 重复线扫描(VLP-16) 非重复线扫描(Mid-360)
扫描轨迹 每帧固定:16 条圆环 每帧不同:花瓣形轨迹持续填充视场
帧间一致性 高,帧与帧图案完全相同 低,轨迹时刻在变
视场覆盖 线与线之间有固定间隙,细长物(电线、杆子)可能漏检 随时间累积覆盖趋于完整,细小物体识别更好
近距盲区 旋转机构体积大,盲区较大 棱镜式结构紧凑,Mid-360 盲区仅 10cm
运动畸变校正 相对简单,逐线时间戳固定 更困难,轨迹不规则
SLAM 算法 经典算法直接可用(ALOAM、LIO-SAM、NDT 等) 需要专门适配(FAST-LIO、LIO-Livox、Point-LIO)
典型场景 室外大范围建图、自动驾驶 室内/近距导航、移动机器人、手持扫描

一句话总结:重复线扫描”稳”——帧间关系好、算法成熟;非重复线扫描”密”——覆盖全、细节好,但算法要专门适配。

实战层面,算法组做导航时:室外场地建图可以选 VLP-16 这类机械雷达,走经典的 LOAM 系算法;室内或近距避障更推荐 Mid-360,配合 FAST-LIO 系列(FAST-LIO2 官方就有 Livox 适配)。点云处理用 PCL,ROS2 下用 livox_ros_driver2 驱动直接输出 sensor_msgs/PointCloud2,接进自己的导航栈即可。

4.4 接触式传感器

以上提到的传感器,都是不需要和探测物体产生接触的,并且有部分直接支持和上位机通信,这一小节中介绍的一些传感器大部分都不支持与上位机直接通信,因此在后续的一些章节将会介绍具体用法,这里只介绍传感器用途和原理。

关节电机

关节电机(Joint Motor)是一种用于控制机器人运动的电机,通常用于机器人人的关节处。关节电机的输出力可以控制机器人的运动,也因此关节电机本身就是个丰富的传感器,包括位置检测,力矩检测,速度检测等都可以实现。

气压计(Barometer)

一般接入气路当中,用于测量环境压力。

微动开关(Microswitch)

用于检测物体是否触摸到传感器,通常用于触发事件。例如在2026MTI的R2夹爪原定就是使用微动开关进行检测的。

霍尔传感器(Hall Sensor)

霍尔传感器是一种用于检测磁场的传感器,通常用于检测转动副的位置。霍尔传感器的输出信号是模拟信号,需要通过模数转换(ADC)转换为数字信号。进阶用法也可以检测到速度。

5. 嵌入式软硬件基础

你可能会疑惑,为什么需要嵌入式基础?这不是算法文档吗?事实上,算法拥有一定的嵌软能力甚至是个加分项。毕竟甚至有一部分算法可以在单片机上运行,而且算法基础也基本适用于单片机,因此单片机基础也是值得花上一点时间来玩的。
目前主流的单片机有两个方向,一个是以stm为代表的arm单片机,在几乎所有比赛队伍中都是arm单片机较为常见。另一种则是以esp32为代表的riscv单片机,其实也只有esp用的比较多。arm指令集由于较为精简,其处理器低功耗和实时性都较为优秀,开发工具链成熟,是目前使用较多的单片机。而riscv则是今年兴起的单片机,主力就是esp32.esp系列由于较高的性能加上自带射频控制器,能够简单的就调用wifi和蓝牙,也因此成为个人爱好者和部分智能家居青睐的芯片。
按照目前的趋势来看,arm单片机仍然是主流,而riscv单片机则是在快速成长中。因此个人建议按照喜欢的功能去选择即可。本文将会尽量少涉及技术细节,以防止在学习过程中造成阻碍。
首先,单片机都有各自成熟的开发工具链,例如stm32的keil,esp32的vscode等。当然也不乏第三方工具链,比如stm32也可以选择通过插件在vscode中编译烧录,而esp32还有arduinoIDE高度硬件抽象化和platformIO插件进行开发的选择。在一些简单项目中,也不必要使用上位机进行开发。很多时候mcu其实足以处理各种工作。尤其是一些在边缘计算运行视觉和神经网络的平台。具体该如何取舍需要根据项目抉择。
对于单片机的学习路径,个人推荐是找感兴趣的开源项目进行复刻,然后深入修改项目。在修改项目过程中即可学习相关技术细节。在后续需要一些传感器验证的时候,拥有嵌软开发能力可以极大的方便验证甚至完成开发。
同理,在硬件中,也需要寻找开源项目,了解芯片,电路选型,电路走线等等基础内容。事实上很多技术栈不用很深入,只需要有一定基础就已经可以独立完成很多东西了。能够独自快速完成全链路测试,才能更好的排查问题而不是甩锅。

6. 如何使用ai编程

本文章第二重要的饺子醋

6.1 选择合适的ai编程工具

首先,需要明白一件事,AI编程不是洪水猛兽,vibe coding是大势所趋。比起古法编程,vibecoding更加快速,而且就大学时期能接触到的工作而言ai已经能够做的足够优秀。更重要的是ai编程的环境下该如何去学习使用ai编程工具。
首先,个人根据ai参与的编程深度将ai coding分为两类。其一就是copilot,在这里ai更像是一个辅助工具,在你需要的时候进行代码提示,或者完成部分核心功能。但是在copilot中agent仍然是辅助作用,项目整体还是以人为主。其二就是vibe coding,在vibe时人将不会关注代码细节,而是把握整体架构。vibe coding中,代码结果质量将会七成取决于人,三成取决于agent和ai模型。因此,选择好模型做对应工作也是近年ai较为有趣的研究方向。其中最经典的例子便是豆包和其他多模态模型。豆包虽然经常被调侃唐包,但是其多模态能力母庸质疑。而大部分模型所谓多模态不过都是OCR或者提取特征点,远达不到豆包的效果。遗憾的是,豆包的智商不足以支撑其拥有多模态后进行进一步的理解。
选择好合适的工具进行现阶段的工作。对于新生,个人更建议接触copilot程度的ai编程以快速提高自己的水平。在copilot模式下,你可以对ai代码进行更高效的审查和跟踪。清楚ai动了什么,自己哪里写的东西是怎么被ai优化掉的。尤其是ai可以快速的解决环境适配导致的问题,对于初学者而言确实是不小的福音。***比起把时间浪费在配环境,不如好好琢磨算法上的精进点。***在使用copilot时,推荐的工具是vscode,trae这种AI IDE,他们提供了高效的ai协作和强大的拓展功能。trae也可以自己添加自定义模型进行使用。
在使用AI IDE时,需要主意好约束工作空间,以及对工作空间文件进行分类整理。否则ai写着写着史山就出来了。同时需要主意好上下文管理,不一定需要一股脑读完整个工作空间,那样是白花token的。
接下来简单介绍关于vibe coding。vibe coding直接翻译是氛围编程,也就是你可以通过与ai对话以达到项目的效果。氛围编程听起来比copilot简单,实际上对基础要求及其扎实。ai的特点是只会优先排查上下文中出现的问题,对于新的问题不一定会注意到。因此在vibe coding更需要你对软件架构有着深入的理解。尤其是当ai被追踪到危险操作或者错误修改正确代码时,你要是没盯着,c盘搞不好就清空了。
对于vibe coding,常用的工具除了上述AI IDE以外,目前用的比较多的就是codex,claude code的CLI客户端,以及前段时间杀出重围的deepseek harness。值得一提的是本博客的服务器已经全权托管deepseek harness上。这里本人十分推荐最初接触deepseek harness作为第一个vibecoding工具使用。由于deepseek常年的低价api以及超高的性能水准,性价比口碑一直不错。而且deepseek harness作为flash后训练环境,拥有极好的适配度,可以达到很不错的编程效果,减少因为agent导致的项目问题。

6.2 学会和AI,或者和别人说话

小学语文我们都学过,中文基本语法主谓宾。最简洁的语言结构,恰巧是和AI沟通的最佳方式。“你应该像这样,设计一个贪吃蛇游戏,好玩还美观,还能保存得分记录。”和“请你以扁平化风格,用python制作一个贪吃蛇游戏,要求游戏可以记录玩家得分并且进行排名,玩家名称由玩家自定义。进入游戏后主菜单可以选择开始游戏或者查看计分板,玩家失败后可以选择保存或者放弃得分,请你自行调试直到功能完善。”这两句话,对于ai而言就是完全不同的。后者指令明确,可以制作出更加符合描述的软件。越简洁,详细的描述越能够发挥ai的高效工作。简洁的是只保留必要的形容词,详细的是每一个你需要控制住的细节。事实上,优秀的AI提示词恰巧也是团队沟通中最高效的话语。

🔔 订阅本文更新

使用评论区账号登录后一键订阅,文章更新第一时间邮件通知

歌单