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 的工作就是不断重复以下循环:
- 取指(Fetch):从内存中读取一条指令
- 译码(Decode):解析这条指令要做什么操作
- 执行(Execute):完成这个操作
- 写回(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 它们是怎么协作的
把这四样东西串起来,计算机的工作流程是这样的:
- 程序和数据的”老家”在硬盘里,长期存储
- 你双击运行程序时,程序代码和所需数据从硬盘加载到内存里
- CPU 从内存中逐条读取指令并执行,中间结果存在内存里
- 如果遇到深度学习这类大规模并行计算任务,CPU 会把数据转交给 GPU,GPU 用自己的显存暂存数据,算完再把结果返回给 CPU
- 程序运行结束后,如果要保存结果,数据从内存写回硬盘
所以你会发现,这几个部件构成了一个层次结构:硬盘容量最大但最慢,内存居中,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.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 落差。