“喂,这道题……你做了没?”
林知砚抬起头。昨晚的怒气并未完全消散,心里的隔阂和失望像一层薄冰。但在抬头瞬间,林知砚脸上却漾开一个看起来毫无阴霾的笑容。“这道啊,我刚做完,是有点绕。”她的语气轻快自然,“来,我这儿有草稿,给你讲讲?”
她把自己的代码展示给李萌看,同时笔尖在草稿纸上流畅地移动,声音温和而清晰,每一个步骤都讲得透彻明白。
李萌显然愣住了,预想中的冷脸和无视没有出现,对方笑容的灿烂程度甚至让她产生了一丝恍惚。她赶紧凑过去听,过程中忍不住偷偷瞄了林知砚几眼,似乎想从那张笑脸上找出一点什么,但失败了。
讲完后,李萌表情更加复杂了,讷讷地说了声“谢了”,就迅速回到了自己的座位。不自觉地,她的声音放轻了一些。
林知砚收回目光,继续看自己的题目。她并不是没有脾气的人,她大可以冷淡地回一句“没空”或者“不会”,享受一下这微小的报复快感。但……这又有什么好处呢?
笔尖划过纸面,发出沙沙的轻响。过了一会儿,她伸手按亮手机屏幕,古诗文网的界面短暂地亮起又熄灭。
窗外的知了还在叫,空调维持在27度,再没有人说话。
漫长的期末周结束,暑假终于降临。
没有选择回家,林知砚留在了学校。一个偶然的机会,她在校园论坛上看到了一个名为“启航”的无人机创新项目组的招新帖。帖子要求“有扎实的数学和编程基础,具备良好的团队协作能力,以及……不怕吃苦”。鬼使神差地,她联系了发帖的学长。
意料之外,学长并没有过多盘问,在确认她“会坚持到项目结束”后,就放她进了项目组。
林知砚成为了项目组里唯一的大一的成员。或许这个项目组是真的人手不够。
项目组的工作室设在实验楼一个偏僻的角落,里面堆满了各种型号的无人机原型、电路板、工具以及喝空了的咖啡罐。这里的气氛与寝室截然不同:空气中弥漫着焊锡的微焦气味、电脑风扇的嗡鸣,以及一种近乎灼热的专注。
项目负责人是个博二的学长,姓李,另外还有两个成员,负责硬件的大三学长周毅和专攻算法的大二学姐吴薇。
在这里,林知砚找到了久违的“同类”感。从Complementary Filter到Kalman Filter,从PID参数整定到状态估计,他们热烈地讨论着滤波原理、飞控算法,为一个数学模型的选用争得面红耳赤,也会因为成功实现了一个微小功能模块而击掌欢呼。
林知砚依然记得最初面对庞大代码库时的无措,像站在一片密林外。她只能从最基础的函数看起,像梳理毛线团一样,一点点理清无人机的软件脉络与硬件框架。失败是家常便饭。炸机、代码跑飞、传感器读数诡异得像是随机数生成器。
她经历过无人机在测试中突然抽风,一头栽进草丛;也经历过为了一个诡异的BUG,对着一行行代码枯坐到凌晨,直到眼睛酸涩。
有一次,她第四次烧录完最新的飞控代码后,期待的嗡鸣声仍未响起,实验台上的无人机毫无生气,像一块沉默的砖头。心头猛地一沉,又失败了。她下意识地看向旁边的周毅学长和吴薇学姐。
“没反应?”周学长凑过来,眉头微蹙,但语气里没有半分指责或急躁。他熟练地拿起万用表,“别慌,先测供电模块。”
“STM32启动了吗?Bootloader灯闪不闪?”吴薇学姐的声音从电脑后传来,手指已经在键盘上敲击,调出了调试终端。
“供电正常…主芯片好像还没跑起来。”林知砚看着示波器上平稳的直线,声音有些发干。
“那就是软件的事。从头来,先把所有外部传感器屏蔽,只留最核心的循环。”李学长不知何时也走了过来,沉稳地指挥。
没有抱怨,没有互相推诿。四个人围在一起,像经验老道的外科医生进行会诊。一个模块、一个模块地检查,从时钟配置到GPIO初始化,逐一排除。实验室里只剩下敲击键盘的声音、偶尔交换数据的低语和仪器发出的轻微滴答声。
时间一分一秒过去,就在林知砚陷入对自己代码能力的怀疑和沮丧时,吴薇学姐忽然“咦”了一声。
“找到了!”她指着屏幕上一行被绿色双斜杠封印的代码,“看这里,IMU_Init(),初始化惯性测量单元的函数被注释掉了。主循环等不到传感器准备好的信号,卡死了。”
周学长一拍脑袋:“靠!我想起来了,下午测试滤波器的时候为了方便看原始数据注释的,忘了取消!”
一声轻松的哄笑在实验室里荡开,之前所有的紧张感一扫而空,林知砚提到嗓子眼的心重重落下。李学长笑着摇头:“下次记得加个TODO注释提醒自己。知砚,重新编译烧录一下吧。”
无人机终于伴随着熟悉的嗡鸣平稳离地了。一股由衷的喜悦从林知砚的心口蔓延到全身。
环顾四周,她的队友在对她笑。巨大的、近乎原始的快乐,冲刷掉了所有的疲惫和沮丧。