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都是耍流氓。对于硬件理解越加深入,排查问题时越能对症下药。

算法学习路径

首先,先把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话题数据的一种文件