1. 从“搬运”到“系统”:赛项核心与备赛定位
第七届工程训练大赛的智能搬运赛项,我带着队伍完整地走了一遍。赛前,很多人包括我们自己,都把它简单理解为一个“让小车把东西从A点搬到B点”的任务。但真正投入进去,从规则解读、方案设计到现场调试,才发现这个“搬运”二字背后,是一个对机械、电子、控制、算法乃至团队协作的微型工业系统集成能力的全面考察。它远不止是让轮子动起来那么简单,而是要求你构建一个稳定、可靠、能应对复杂现场工况的“智能体”。
这个赛项的魅力也在于此。它没有给你一个现成的平台或套件,从车体结构、驱动方案、传感器选型到核心控制逻辑,全部需要自主设计与实现。这就像给你一堆乐高零件,告诉你最终要搭一座能自动运行的桥梁,至于怎么搭、用什么零件、如何让桥自己走起来,全凭你的本事。因此,备赛的第一步,也是最关键的一步,就是彻底摒弃“做个遥控车加点传感器”的学生思维,转而用“产品经理”和“系统工程师”的视角去审视整个项目。你需要思考的是:我的“产品”(智能搬运系统)在规定的赛场环境下,需要满足哪些功能性指标(如载重、速度、精度)和非功能性指标(如稳定性、鲁棒性、易调试性)?基于这些指标,我如何拆解出机械、硬件、软件三大模块的需求,并确保它们之间能高效协同?
这种思维转变直接决定了后续所有工作的方向与效率。比如,在机械设计时,你就不能只考虑“怎么把电机和轮子装上去”,而要同时考虑重心分布对运动稳定性的影响、结构刚度对循迹精度的影响、以及如何为后续的传感器(如摄像头、激光雷达)安装预留出最优的视野和空间。在硬件选型时,也不能只看参数高低,更要考虑供电系统的负载能力、各模块间的通信带宽与实时性、以及现场强光、电磁干扰等环境因素。软件层面,则要从“单线程顺序执行”升级到“多任务实时调度”的架构思维,确保感知、决策、控制各环节既能独立高效运行,又能通过清晰的数据接口紧密耦合。
2. 机械与硬件:稳定性的基石与性能的边界
机械是智能车的骨骼与肌肉,硬件是神经与感官。这一部分的任何疏漏,都会在软件和算法层面被无限放大,甚至导致整个系统在关键时刻“掉链子”。我们的核心设计原则是:在满足功能与性能的前提下,极致追求结构的简单、可靠与可维护性。
2.1 车体架构:在刚性与轻量化之间寻找平衡
车体架构是整个系统的物理承载平台。我们放弃了市面上常见的玩具车底盘或3D打印的复杂异形结构,选择了基于开源机器人平台(如基于铝合金型材的框架)进行二次开发。原因有三:一是开源平台经过大量项目验证,结构强度和连接可靠性有保障;二是其模块化设计允许我们快速调整尺寸、增减横梁以适应不同任务需求;三是丰富的配件生态(如电机支架、电池托板)能极大缩短机械装配时间。
在具体设计上,我们重点关注了以下几点:
- 低重心与对称布局:将最重的部件(如电池、主控板)尽量布置在车体中心下方,并保证左右重量分布基本对称。这能显著提升高速行驶和急转弯时的稳定性,防止侧翻。我们通过简单的配重块进行了多次实测调整。
- 驱动与转向方案选择:这是争论的焦点。常见方案有差速转向(两轮独立驱动)和阿克曼转向(带转向机构)。我们最终选择了四轮差速驱动(前后各一对驱动轮)。虽然阿克曼转向更接近真实汽车,转弯半径小,但其机械结构复杂,存在转向虚位,且需要额外的转向舵机,增加了控制和调试难度。差速驱动通过左右轮速差实现转向,控制算法统一(都是控制电机转速),结构简单可靠,虽然理论上转弯半径稍大,但通过算法优化(如入弯前减速、弯中内外轮差速控制)完全能满足赛场要求。关键在于,我们要搬运货物,结构越简单,出机械故障的概率就越低。
- 载物机构设计:根据赛题,可能是抓取、铲取或举升。我们的策略是“被动兼容,主动简单”。例如,对于方块搬运,我们设计了一个带有轻度倾角的铲斗,配合车体前进的动能将方块“舀”起来,而非复杂的机械爪。这减少了舵机数量,降低了控制复杂度,提高了动作成功率。所有运动部件都考虑了防卡死设计和磨损余量。
2.2 传感器阵列:感知系统的冗余与互补
感知是智能的起点。赛场环境光照多变,地面反光,还可能存在其他队伍的车辆干扰,因此单一传感器极易失效。我们构建了一个以多线激光雷达(LiDAR)为主,视觉传感器(摄像头)为辅,编码器与IMU(惯性测量单元)为基底的复合感知系统。
- 激光雷达(主传感器):我们选用了一款16线的二维激光雷达。它的核心价值在于提供不受光照影响的、厘米级精度的距离信息。我们主要用它做两件事:一是SLAM(即时定位与地图构建),在赛前建图阶段,让小车在空场地中慢速行走一圈,通过激光雷达数据构建出包含边界、障碍物位置的二维栅格地图;二是实时定位与障碍检测,在运行时,将当前帧的激光点云与已有地图进行匹配(如使用ICP算法或特征匹配),计算出小车在地图中的精确位姿(x, y, 航向角),同时识别出地图中未标注的动态障碍(如其他小车)。
- 摄像头(辅助传感器):主要用于颜色识别、二维码/ArUco码识别等特征任务。例如,赛道上可能有颜色标记的引导线或需要识别的目标物颜色。我们将摄像头数据与激光雷达定位信息进行融合。当激光雷达告诉我们“你在A区域”时,摄像头就在A区域的图像中寻找特定颜色或图案,大大缩小了图像处理的范围,提高了识别速度和准确率。我们使用了OpenCV库进行图像处理,针对赛场光照条件,重点优化了白平衡和颜色阈值分割的算法,使其能适应一定范围的光照变化。
- 编码器与IMU(底层传感器):这是常常被忽视但至关重要的部分。电机编码器提供车轮的转速和里程信息,用于实现精确的速度闭环控制和航迹推算(Odometry)。IMU则提供三轴加速度和角速度,用于补偿车辆在急加速、打滑时编码器产生的误差。通过扩展卡尔曼滤波(EKF)算法,融合激光雷达定位、编码器里程计和IMU数据,我们得到了一个高频(100Hz以上)、稳定、平滑的车辆位姿估计,这是所有上层决策和控制的基础。
注意:传感器安装的物理位置至关重要。激光雷达要尽量抬高,减少车体自身对扫描的遮挡,并确保水平;摄像头要避开强光直射角度,必要时加装遮光罩;所有传感器的线缆必须固定好,防止在震动中脱落或干扰运动部件。
2.3 电控系统:动力与控制的可靠保障
电控系统是心脏和神经中枢。我们的设计遵循“分区供电,数字隔离,通信优先”的原则。
- 动力电源与控制电源分离:使用大容量、高放电倍率的锂电池(如3S或4S锂聚合物电池)单独为驱动电机供电。另一块容量较小的稳压电池(或通过DC-DC降压模块)为控制器、传感器、舵机等逻辑部件供电。这样做避免了电机启停时的大电流波动对敏感电子设备的干扰,极大提高了系统稳定性。
- 主控制器选型:我们选择了性能强劲的嵌入式微控制器(如STM32H7系列)或单板计算机(如Jetson Nano、树莓派4B)。前者实时性极佳,适合做底层电机控制、传感器数据采集和滤波;后者算力强大,适合运行SLAM、视觉识别等复杂算法。我们采用了上下位机架构:下位机(STM32)负责所有实时控制任务(电机PID控制、编码器读取、IMU数据解算);上位机(Jetson Nano)负责算法任务(SLAM、视觉、路径规划)。二者通过高速串口(如UART)或CAN总线进行通信。
- 电机与驱动选型:根据车重、载重和预期速度计算所需扭矩和功率,留出至少1.5倍的余量。我们选择了带减速箱的直流无刷电机,搭配高性能的FOC(磁场定向控制)电调。FOC电调相比传统的方波电调,运行更平稳、噪音小、效率高,能提供更精细的转矩控制,这对于需要精确速度控制的差速转向车辆来说非常重要。
- 布线工艺:所有电源线、电机线使用粗线径的硅胶线,并套上波纹管保护。信号线使用双绞线或屏蔽线。电源接口一律使用XT60等抗震可靠的接插件,杜绝杜邦线直接连接。良好的布线是现场不掉链子的最后一道物理保障。
3. 软件与算法:从感知到执行的智能闭环
软件是系统的灵魂,它将冰冷的硬件转化为有智能的实体。我们的软件架构分为感知、定位、决策、规划、控制五大模块,运行在ROS(机器人操作系统)框架上。ROS提供了节点间通信、消息传递、包管理等强大工具,让模块化开发变得清晰高效。
3.1 定位与建图:搞清楚“我在哪”
这是所有自主移动的基础。我们采用激光SLAM方案。在赛前调试阶段,我们使用Gmapping或Cartographer算法,手动遥控小车在空旷的赛场地图中行走,激光雷达数据实时构建出二维栅格地图(.pgm或.png图像格式,配有一个描述文件.yaml)。这张地图包含了静态障碍物的位置信息。
比赛时,我们使用AMCL(自适应蒙特卡洛定位)算法。AMCL是一种粒子滤波算法,它在我们预先建好的地图中,撒下一大把“粒子”(每个粒子代表一个可能的位置和朝向假设),然后根据当前激光雷达的观测数据,计算每个粒子的权重(观测数据与地图的匹配程度),权重高的粒子存活并繁殖,权重低的粒子被淘汰。经过多次迭代,粒子会聚集在小车真实位置周围,从而实现精准定位。AMCL的优势在于能有效处理机器人“绑架”问题(即被突然移动到别处),且计算量相对可控。
3.2 路径规划:找到“怎么去”的路
知道自己在哪,也知道目标点在哪(由任务决定,如取货点、卸货点坐标),接下来就需要规划一条路径。我们在ROS中使用Nav2导航框架。它提供了完整的导航功能栈。
- 全局规划器:负责从起点到终点规划一条宏观路径。我们常用A*算法或Dijkstra算法。它们在地图的栅格上搜索,考虑静态障碍物,规划出一条最短或近似最短的路径。Nav2默认的
nav2_navfn_planner或更先进的nav2_smac_planner都能很好地完成这个任务。 - 局部规划器:这是关键中的关键。全局路径是一条理想的折线,但小车实际运动时,会遇到地图中未标明的动态障碍(其他车辆),或者由于控制误差偏离了全局路径。局部规划器负责根据实时传感器数据(主要是激光雷达),生成近期(未来几秒内)的线速度和角速度指令,使小车既能跟随全局路径,又能实时避障。我们主要使用TEB(Timed Elastic Band)局部规划器。TEB将路径视为一条由一系列位姿点组成的、有弹性的带子。它通过优化这些位姿点之间的时间和空间关系,生成一条动力学可行的、平滑的轨迹。TEB特别适合像我们这种差速驱动的机器人,它能直接优化出控制指令(v, ω),并且避障反应非常迅速。
- 代价地图:这是规划器决策的依据。它由多层信息融合而成:
static_layer来自静态地图;obstacle_layer来自实时激光雷达数据,标注动态障碍;inflation_layer在障碍物周围生成“膨胀区”,让规划器提前远离障碍,保证安全。合理设置膨胀半径(通常设为机器人半径的1.2-1.5倍)非常重要,太小会撞上,太大会导致在狭窄通道无法通过。
3.3 运动控制:执行“如何走”的指令
规划器输出的速度指令(cmd_vel话题,包含线速度v和角速度ω)需要被精准地转化为左右轮的电机的转速。对于差速驱动模型,转换公式是:v_left = v - (ω * wheel_base / 2)v_right = v + (ω * wheel_base / 2)其中,wheel_base是左右轮之间的轴距。
但这只是开环控制。实际中,由于地面摩擦、电池电压波动、负载不同,电机可能无法达到指定转速。因此,我们必须对每个电机进行PID闭环控制。下位机(STM32)以高频率(如1kHz)运行PID控制循环:
- 读取编码器反馈值,计算当前电机实际转速。
- 与目标转速比较,得到误差e。
- 计算PID输出:
output = Kp * e + Ki * ∫e dt + Kd * de/dt。 - 将输出值(通常是PWM占空比)发送给电调,驱动电机。
PID参数(Kp, Ki, Kd)的整定是个经验活。我们的心得是:先调P(比例),让电机能快速响应但又不振荡;再调D(微分),抑制超调和振荡;最后调I(积分),消除静态误差。在现场,由于地面材质可能变化,我们准备了几组针对不同摩擦系数的PID参数,可以在上位机通过服务调用快速切换。
3.4 任务调度与状态机:让行为有序
智能搬运不是从一个点跑到另一个点就结束,而是一系列有序的动作:出发→识别并驶向取货点→执行取货动作(如铲起)→载货驶向卸货点→执行卸货动作→返回起点或进行下一轮。我们需要一个大脑来协调这些顺序和可能发生的异常(如取货失败、路径被堵)。
我们使用行为树(Behavior Tree)来实现任务调度。与传统的有限状态机相比,行为树更模块化,易于扩展和调试。在ROS中,可以使用BehaviorTree.CPP库。我们将整个任务分解成多个行为节点,例如:
Sequence节点:按顺序执行子节点,所有子节点成功才算成功。Fallback节点:按顺序执行子节点,直到有一个成功为止。Condition节点:检查某个条件(如“是否到达取货点附近?”)。Action节点:执行具体动作(如“向取货点移动”、“执行铲取动作”、“等待2秒”)。
通过将复杂的任务逻辑可视化为树形结构,我们可以清晰地看到机器人的决策流程,并且在某个环节失败时(比如“执行铲取动作”失败),行为树可以自动回退到父节点(如“重试”或“执行恢复流程”),使系统更加健壮。
4. 现场调试与竞赛策略:稳定压倒一切
实验室里跑得再流畅,到了比赛现场都可能变成“薛定谔的车”。现场调试的目标,是将系统从“能工作”优化到“稳定可靠地工作”。
4.1 赛前场地适应性调试
拿到场地后,有限的调试时间极其宝贵,必须分秒必争,有条不紊。
- 第一要务:重建地图。比赛场地和实验室的地形、障碍物摆放绝对不同。进场后,第一时间用建图模式,重新构建一张高精度的赛场地图。建图时小车速度要慢,确保激光雷达数据质量。
- 传感器标定与验证:
- 激光雷达:检查扫描数据是否完整,有无固定盲区。测量几个已知距离的物体,验证测距精度。
- 摄像头:在不同光照位置(赛场上可能的不同位置)测试颜色识别和标签识别。现场调整颜色HSV阈值或曝光参数,并保存为不同的配置文件。
- IMU与编码器:让小车在原地旋转数圈,再回到原点,检查通过IMU和编码器融合计算出的航向角与真实位置误差有多大。这个误差会影响定位精度。
- 核心参数现场微调:
- AMCL定位参数:适当增加粒子数(如从2000增加到5000)以提高定位稳定性,尤其是在特征较少的空旷区域。
- TEB局部规划器参数:这是调试重点。根据赛场实际通道宽度,调整
min_obstacle_dist(最小障碍距离)和inflation_radius(代价地图膨胀半径)。如果小车在转弯时过于“犹豫”或抖动,可以调整max_vel_x(最大线速度)、max_vel_theta(最大角速度)以及acc_lim_x(加速度限制)。我们的黄金法则是:在确保能通过最窄通道的前提下,尽可能限制最高速度。比赛求稳不求快,一次成功的慢速运行远胜于多次失败的冲刺。 - PID参数:如果赛场地面摩擦力与实验室差异很大(如更光滑的环氧地坪),需要重新微调电机PID的速度环参数,主要是P和D值,确保启停平稳,不打滑。
4.2 竞赛中的策略与应急处理
比赛时,心态和策略与技术同等重要。
- 制定保守的任务策略:除非赛制是纯粹竞速,否则优先选择成功率最高的方案。例如,取货时,宁愿让车多花1秒对准,也不要冒险高速冲撞;路径规划时,宁愿绕远一点走宽阔区域,也不要贴着障碍物走。
- 设计完备的异常处理机制:
- 定位丢失:在行为树中设置监控节点。如果AMCL报告的定位协方差突然增大(表示定位不确定度增高),或者长时间收不到有效的
cmd_vel指令(可能规划失败),则触发恢复行为:让小车缓慢停止,原地缓慢旋转(试图重新获取特征匹配),或播放一段预设的“恢复轨迹”。 - 任务失败:例如,铲取动作后,通过传感器(如摄像头看货物是否在铲斗内,或重量传感器)判断取货失败。行为树应能触发重试流程(后退,重新对准,再次尝试),并设置最大重试次数(如3次),超过则放弃该任务,尝试继续后续流程或返回待命区,避免死锁。
- 通信看门狗:在下位机程序中设置软件看门狗,监控与上位机的通信。如果超过一定时间未收到心跳包或控制指令,下位机应自动执行安全停车程序,防止小车失控。
- 定位丢失:在行为树中设置监控节点。如果AMCL报告的定位协方差突然增大(表示定位不确定度增高),或者长时间收不到有效的
- 团队分工与现场协作:明确分工,一人主控电脑(负责启动程序、监控日志),一人手持遥控器(负责紧急接管和手动恢复),一人观察场地和对手(提供策略信息)。使用统一的术语沟通,如“定位飘了”、“规划器卡住了”。所有关键的启动命令、参数修改命令,最好写成脚本,一键执行,避免现场输入错误。
5. 那些“踩过坑”才明白的事
回顾整个备赛历程,有些经验教训是文档里不会写,只有亲身踩过坑才能深刻理解的。
- 供电是万恶之源:超过一半的现场诡异问题,最终都指向供电。电机启动瞬间的电压跌落可能导致主控制器重启;劣质线缆或虚接的接头会产生压降和发热;不同设备共地不良会引入噪声。我们的终极解决方案是:使用高质量的动力电池和BEC(稳压模块),所有电源接口上电前必用万用表测量,关键电路(如主控、雷达)增加磁珠或π型滤波电路,并在软件中增加电压监测告警。
- “差不多”就是“差很多”:机械装配时,觉得轮子有点晃“差不多就行”;标定时,觉得参数差一点“差不多能用”。到了赛场上,这些“差不多”会累积放大,导致循迹跑偏、定位漂移。必须用工程师的严谨来要求每一个细节:轮子要锁紧,同轴度要调,传感器安装角度要用水平仪校准,标定数据要多次测量取平均。
- 日志系统是你的“黑匣子”:一定要在软件中构建完善的日志记录系统。不仅记录INFO、WARN、ERROR,更要把关键数据(如实时位姿、速度指令、传感器原始数据)以较高的频率写入文件或ROS Bag。当出现无法复现的bug时,这些日志是唯一的问题溯源依据。我们曾遇到小车在某个特定角落总是规划失败的问题,就是通过回放ROS Bag,发现那个角落的激光雷达出现了罕见的镜面反射干扰,导致代价地图出现幽灵障碍物。
- 测试,测试,再测试:实验室测试要模拟极端情况:用手挡住激光雷达一部分视野;突然改变光照;在地面撒些碎屑模拟打滑;频繁地手动打断任务。只有经过“虐待式”测试的系统,才有资格上赛场。我们建立了完整的测试清单,每一项都必须通过才能进入下一阶段。
- 文档与代码管理:从第一天起就使用Git进行版本控制,每一次硬件改动、参数调整、代码更新都必须有记录。机械图纸、电路图、接线表、软件参数配置文件,全部整理归档。这不仅是为了团队协作,更是为了在最后紧张的调试阶段,当你想回溯“上周那个跑得很稳的参数是什么”时,能立刻找到答案。
智能搬运赛项,就像一场微缩的工业自动化项目研发。它带给你的远不止一张奖状,而是一套完整的、从问题定义到产品落地的系统工程方法论。当你看到自己设计的机器人,在嘈杂的赛场中,稳定、准确、有条不紊地完成一个个任务时,那种将想法变为现实的成就感,是任何理论课程都无法给予的。这份经历,无论是对于继续深造,还是走向产业界,都是一笔宝贵的财富。