1. 项目概述:从赛题到实战的航迹规划挑战
刚拿到“2023深圳杯(东三省)数学建模C题”这个题目时,很多队伍的第一反应可能是“无人机”、“避障”、“规划”这些关键词,感觉像是一个经典的路径优化问题。但当你真正深入进去,会发现这道题的精髓远不止于此。它本质上是一个多智能体协同决策在高动态复杂环境下的综合应用问题。题目要求我们为多架无人机设计航迹,使其在三维空间中从各自的起点飞抵终点,期间不仅要避开静态的障碍物(如山体、建筑物),还要处理无人机之间的动态防碰撞,同时优化整体飞行时间或能耗等指标。这听起来像是电影里的场景,但实际上,它紧密贴合了当下物流配送、集群表演、区域巡查等领域的核心需求。
我参加过不少数学建模竞赛,也指导过队伍,深知这类题目的难点不在于某个单一的算法,而在于如何将实际问题抽象成可计算的模型,以及如何将多个约束和目标有机地整合。对于新手队而言,容易陷入两个极端:要么被“协同”、“避障”、“三维”这些词吓住,觉得无从下手;要么就想当然地套用A*或Dijkstra算法,最后发现模型根本处理不了动态交互和复杂约束。这道题的价值在于,它逼着你去思考系统层面的逻辑,而不仅仅是单个点的移动。
所以,这篇内容,我想从一个有过实战和指导经验的视角,来拆解这道题的解题思路。我不会给你一个“标准答案”——数学建模本身就没有唯一解。但我会带你走一遍从问题分析、模型构建、算法选型到求解验证的完整思考过程,分享其中可以复用的策略、容易踩的坑,以及一些能让论文脱颖而出的实用技巧。无论你是正在备赛的学生,还是对多智能体路径规划感兴趣的爱好者,希望这些从实战中沉淀下来的思路能给你带来实实在在的启发。
2. 核心问题拆解与建模思路
面对一个复杂问题,最忌讳的就是一上来就埋头搞算法。第一步永远是把大问题拆解成一个个可以量化、可以处理的小问题。对于这道C题,我们可以将其核心挑战分解为四个层次。
2.1 环境与约束的数学化表述
这是所有工作的基石。题目中的“三维空间”、“障碍物”、“无人机”都需要用数学语言描述。
首先,是空间建模。通常我们将任务空域建模为一个三维笛卡尔坐标系下的长方体区域。设区域范围为[X_min, X_max],[Y_min, Y_max],[Z_min, Z_max]。所有无人机的航迹点(x, y, z)都必须位于此区域内。
其次,是障碍物建模。这是第一个关键点。障碍物通常被简化为规则几何体(如圆柱体、长方体、球体)以方便计算。例如,一个圆柱形障碍物可以用其底面圆心(x_o, y_o)、半径R和高度H来定义。那么,对于任意航迹点(x, y, z),其避障约束可以表述为:
(x - x_o)^2 + (y - y_o)^2 >= R^2 或 z >= H即,无人机要么在水平距离上远离圆柱,要么在高度上飞越它。对于长方体障碍物,则可以用一系列平面不等式来定义其外部空间。这里的一个常见陷阱是建模过于简单,比如只考虑二维投影避障,忽略了无人机的实际体积和爬升/下降率限制。更严谨的做法是将无人机本身也视为一个具有半径r_u的安全球体,那么避障约束就需要加上这个安全余量,即要求无人机球体与障碍物球体/柱体无交集。
最后,是无人机自身动力学约束。无人机不是质点,它的转弯、爬升能力有限。这需要引入运动学约束:
- 最大转弯角约束:相邻航迹段之间的方向变化角不能超过一个最大值
φ_max。 - 最大爬升/下滑角约束:相邻航迹点之间的高度差与水平距离之比不能超过一个最大值
γ_max。 - 速度范围约束:无人机的飞行速度需在一个区间
[v_min, v_max]内,可能为恒定值或可变。 - 起点与终点约束:每架无人机有给定的起始点
S_i和终止点T_i,通常要求位置和速度(或航向)匹配。
2.2 协同与防碰撞的核心逻辑
“协同”并不意味着所有无人机要有统一的全局大脑,而是指它们的行为需要满足彼此不冲突的全局约束。防碰撞是协同最核心的体现。这里有两种主要的建模思路:
思路一:基于时空图的联合规划。这是最直接但也最复杂的方法。我们将时间维度引入,把问题转化为在“时空”(三维空间+一维时间)中为每个无人机寻找一条四维轨迹(x(t), y(t), z(t))。那么,两架无人机i和j的防碰撞约束可以写为:
∀ t, distance( UAV_i(t), UAV_j(t) ) >= D_safe其中D_safe是安全距离。这种方法理论上是完备的,但搜索空间巨大,直接求解非常困难,通常需要复杂的优化算法。
思路二:基于优先级的分步规划与冲突消解。这是更实用、更常见的思路,尤其适合数学建模竞赛的时间尺度。其核心步骤是:
- 单机初始规划:先忽略其他无人机,为每一架无人机单独规划一条从起点到终点、仅考虑静态障碍物的最优或次优路径(例如使用A*、RRT等算法)。
- 冲突检测:分析所有无人机的初始路径,找出在哪些时间点、哪些空间位置上会发生距离小于
D_safe的冲突。 - 冲突消解:为发生冲突的无人机引入新的约束,让其中一架或几架采取“避让”策略。避让策略可以是:
- 空间避让:让一架无人机绕行。
- 时间避让:让一架无人机在某个航路点等待(引入延迟)。
- 速度调节:让一架无人机加速或减速以错开相遇时间。
- 迭代优化:重复冲突检测与消解步骤,直到所有冲突被解决。
注意:在采用优先级法时,优先级的设定策略直接影响最终方案的效果和公平性。常见的策略有:按任务紧急程度、按路径长短(让路径短的先飞)、按冲突复杂度等。在论文中,你需要明确阐述并论证你的优先级设定规则。
2.3 优化目标的权衡与选择
规划出的航迹不能只是“可行”的,还应该是“好”的。这就需要定义优化目标。常见的目标有:
- 总耗时最短:最小化最后一架无人机到达终点的时间。这强调整体效率。
- 总航程最短:最小化所有无人机飞行距离的总和。这有助于节省能源。
- 加权综合成本:将时间、距离、风险(如贴近障碍物的程度)等因素加权求和。
在多目标下,往往不存在一个绝对最优解,而是一组“帕累托最优”解。在竞赛中,一个讨巧的做法是确定一个主目标(如总耗时),将其他目标转化为约束。例如,限定每架无人机的最大飞行距离,然后在满足此约束下最小化总耗时。
3. 算法工具箱:从传统到智能的选型策略
模型建立后,就需要选择合适的算法来求解。没有放之四海而皆准的“银弹”算法,选型取决于你对问题规模、精度和计算时间的权衡。
3.1 图搜索算法:可靠的基础方案
对于单机在离散化网格环境中的路径规划,图搜索算法是基石。
- A算法*:在已知终点的情况下,它是非常高效的最佳优先搜索算法。其核心在于估价函数
f(n) = g(n) + h(n),其中g(n)是从起点到节点n的实际代价,h(n)是从节点n到终点的预估代价(启发函数)。关键技巧在于启发函数h(n)的设计。在三维空间中,欧几里得距离sqrt(dx^2+dy^2+dz^2)是最常用的可采纳启发函数(即不会高估实际代价),能有效引导搜索方向。 - Dijkstra 算法:当没有合适的启发信息或需要计算起点到所有点的最短路径时使用。它比A*更稳定,但搜索范围通常更大。
实操心得:在实现时,将三维空间离散化为立方体网格(体素),每个网格节点代表一个潜在航迹点。障碍物占据的网格被标记为不可通行。A*算法在这种表示法下运行效率很高。但要注意,网格分辨率的选择是个平衡:分辨率太高,路径精度高,但搜索节点数爆炸;分辨率太低,可能找不到安全路径或路径粗糙。一个实用的技巧是采用多分辨率搜索:先用粗网格快速找到一条大致路径,然后在粗路径附近用细网格进行精细化修正。
3.2 采样型算法:应对高维复杂空间
当空间连续或障碍物形状非常不规则时,基于采样的算法更具优势。
- 快速随机扩展树(RRT):非常适合高维空间的路径规划。它通过随机采样和向最近树节点扩展的方式快速探索空间,能概率完备地找到一条可行路径(如果存在)。RRT是其渐进最优的变种*,通过“重布线”和“父节点重选”操作,能逐渐优化路径成本。
- 概率路图(PRM):分为学习阶段和查询阶段。先在空间中随机撒点(并剔除落在障碍物内的点),连接邻近点形成路图,然后在路图上用A*等算法搜索路径。适合多查询场景(即同一地图下多个起终点对)。
对于本题,RRT系列算法在三维空间中有天然优势。你可以为每架无人机独立运行RRT来生成初始路径。一个重要的改进是将其发展为多智能体RRT(MA-RRT),即在为当前无人机扩展树时,不仅检测静态障碍物,也将其他无人机的已知规划路径视为动态障碍物进行碰撞检测,从而实现一定程度的协同。
3.3 优化算法:精细打磨与全局协同
当我们需要处理复杂约束(如动力学约束、防碰撞约束)并寻找高质量解时,优化算法是利器。
- 非线性规划(NLP):将问题直接建模为带有约束的非线性优化问题。例如,将每架无人机的轨迹用一系列参数(如样条曲线的控制点)表示,将目标函数(总时间)和约束(避障、防碰撞、动力学)都表示为这些参数的函数,然后调用求解器(如IPOPT、SNOPT)求解。这种方法能得到非常光滑、精确的轨迹,但对初值敏感,且计算量大。
- 遗传算法(GA)、粒子群算法(PSO)等智能优化算法:这类算法适用于搜索空间巨大、非凸、存在多个局部最优解的问题。它们通过种群进化来寻找全局较优解,对目标函数和约束的形式要求宽松(可以通过罚函数法处理约束)。在本题中,可以将所有无人机的航迹点编码为一个长染色体(个体),通过交叉、变异等操作进行进化。其优势是全局搜索能力强,易于并行;劣势是收敛速度慢,参数调优需要经验,且不能保证最优性。
避坑指南:很多队伍喜欢直接用智能算法,但往往效果不佳。一个重要原因是编码设计不合理。例如,直接编码每个航迹点的三维坐标,会导致搜索空间过大。更好的做法是编码关键航路点(Waypoints),然后用直线或曲线(如B样条)连接,这样能大幅减少变量维度。同时,罚函数系数的设置至关重要,需要多次试验来平衡约束违反成本与路径成本。
4. 一个可行的混合策略框架与实践步骤
基于以上分析,我推荐一个结合了图搜索、优化和规则策略的分层混合框架,这种框架结构清晰,易于实现和解释,在数学建模竞赛中很受青睐。
4.1 第一阶段:单机离线最优路径生成
目标:为每架无人机UAV_i生成一条从S_i到T_i的、仅考虑静态障碍物的“参考路径”。步骤:
- 环境离散化:将三维任务空间按选定的分辨率(如10米)划分为网格。
- 障碍物映射:将所有静态障碍物映射到网格,标记被占据的网格为障碍。
- 运行改进A*算法:
- 代价函数
g(n)可以考虑距离、高度变化(爬升耗能)等因素。 - 启发函数
h(n)使用三维欧氏距离。 - 在节点扩展时,检查是否符合最大转弯角和爬升角约束,不符合的邻居节点直接剔除。
- 代价函数
- 路径后处理:A*输出的路径是网格中心的折线。可以使用三阶B样条曲线对其进行平滑处理,使其符合无人机的连续运动特性,并计算平滑后路径上各点的时间戳(假设匀速飞行)。
输出:得到N条平滑的初始参考轨迹RefTraj_i(t)。
4.2 第二阶段:基于时空窗口的冲突检测与消解
目标:检测并消除多机轨迹间的冲突。步骤:
- 时空轨迹离散化:将每条
RefTraj_i(t)按固定时间间隔Δt(如0.1秒)采样,得到一系列时空点(x, y, z, t)。 - 冲突检测:双重循环遍历所有无人机对
(i, j)和所有时间点t_k。计算在t_k时刻两架无人机的空间距离d_ij(t_k)。如果d_ij(t_k) < D_safe,则记录一个冲突<i, j, t_k, location>。 - 冲突消解策略:
- 优先级排序:按照“路径总长度越短,优先级越高”的规则为无人机排序。理由是让飞行距离短的尽快通过,减少对后续交通的阻塞。
- 局部重规划:对于检测到的一个冲突,保持高优先级无人机
UAV_h的轨迹不变。对低优先级无人机UAV_l,在冲突时间点t_c附近划定一个局部时空窗口(例如[t_c-δt, t_c+δt])。在这个窗口内,为UAV_l重新规划一条局部路径,起点和终点需与原轨迹在窗口两端衔接。这个局部重规划可以再次使用A*算法,但此时的地图包含了静态障碍物和UAV_h在该时间窗口内占据的空间(视为临时动态障碍)。 - 速度调整:对于轻微冲突,也可以尝试微调
UAV_l在冲突点之前一段航程上的飞行速度(加速或减速),以错开相遇时间。这可以建模为一个一维优化问题。
- 迭代循环:应用消解策略后,更新
UAV_l的轨迹。由于轨迹改变可能引发新的冲突(与第三架飞机),因此需要回到步骤2,进行新一轮的冲突检测,直到所有冲突消除或达到最大迭代次数。
4.3 第三阶段:全局轨迹优化与评估
目标:对消解冲突后的轨迹进行整体优化和性能评估。步骤:
- 平滑性再优化:冲突消解可能引入急转弯或速度突变。可以使用非线性最小二乘优化,以各无人机轨迹的控制点为变量,在满足避障、防碰撞硬约束的前提下,最小化轨迹的加速度变化率(加加速度),从而获得更平滑、更节能的轨迹。
- 性能指标计算:计算最终方案的关键指标,包括:
- 任务完成时间:
T_total = max( UAV_i.arrival_time ) - 总飞行距离:
S_total = Σ( UAV_i.trajectory_length ) - 安全边际:统计整个过程中,所有无人机两两之间最小距离的均值与方差,评估方案的安全鲁棒性。
- 能量消耗估算:一个简化的模型可以是
E_total ∝ Σ( UAV_i.trajectory_length ) + β * Σ( UAV_i.total_climb ),其中β是爬升权重系数。
- 任务完成时间:
5. 仿真实现、论文写作与常见问题
有了清晰的思路和框架,接下来就是将其实现并写成一篇优秀的数模论文。
5.1 仿真验证:从MATLAB/Python开始
对于竞赛,使用MATLAB或Python进行仿真验证是完全可行且高效的。
- MATLAB:优势在于强大的数学工具箱和绘图功能。Robotics System Toolbox提供了路径规划(如
pathPlannerRRT)和轨迹优化的函数。你可以用plot3和surf函数直观展示三维空间、障碍物和无人机轨迹动画。 - Python:生态丰富,库更现代。推荐组合:
numpy,scipy:数值计算和优化。matplotlib(配合mpl_toolkits.mplot3d):三维绘图。networkx:实现图搜索算法。casadi或cvxpy:用于更高级的非线性优化建模。
一个简单的冲突检测代码示例(Python思想):
def detect_conflicts(trajectories, safe_distance): """ trajectories: 字典,key为无人机ID,value为轨迹点列表 [(x,y,z,t), ...] """ conflicts = [] ids = list(trajectories.keys()) for i in range(len(ids)): for j in range(i+1, len(ids)): traj_i = trajectories[ids[i]] traj_j = trajectories[ids[j]] # 简单假设轨迹已按时间对齐或可插值 for pt_i, pt_j in zip(traj_i, traj_j): dist = np.linalg.norm(np.array(pt_i[:3]) - np.array(pt_j[:3])) if dist < safe_distance: conflicts.append({ 'uav1': ids[i], 'uav2': ids[j], 'time': pt_i[3], 'distance': dist }) return conflicts5.2 论文写作要点:如何清晰表达你的思想
数模论文是展示你工作的唯一窗口,其重要性不亚于模型本身。
- 摘要:用一段话概括问题、你的方法、模型、算法、主要结果和结论。避免细节,突出创新点和最终指标(如“将总任务时间降低了XX%”)。
- 问题重述与分析:不要照抄题目。用自己的语言提炼核心问题、目标和约束,并给出整体解决思路的框图。
- 模型假设:列出清晰合理的假设。例如:“假设无人机为质点”、“假设障碍物形状已知且固定”、“忽略风的影响”等。合理的假设能简化问题,体现你的思考。
- 模型建立:这是核心。分小节阐述环境模型、无人机运动学模型、避障约束数学模型、防碰撞约束数学模型、目标函数。公式要编号,变量要说明。
- 算法设计:详细说明你采用的算法流程,最好配以流程图(如使用Visio或draw.io绘制)。解释关键步骤(如A*的启发函数设计、冲突消解规则)的缘由。
- 仿真与结果分析:
- 参数设置:明确给出所有参数值(空间大小、障碍物位置尺寸、无人机速度、安全距离等)。可以设计一个清晰的表格。
- 场景设计:至少设计2-3个有代表性的测试场景(如障碍物稀疏/密集,无人机数量少/多)。
- 结果展示:提供三维轨迹图、时间-位置曲线图、性能指标对比表。用图表说话。
- 分析讨论:分析结果,说明你的方案为何有效。可以进行灵敏度分析(如改变安全距离,观察任务时间的变化)。
- 模型评价与推广:客观评价模型的优点(如高效、鲁棒)和局限性(如假设简化),并提出可能的改进方向(如考虑不确定性、加入通信延迟模型)。
5.3 常见问题与排查技巧
问题1:算法运行时间太长,无法在比赛时间内得到结果。
- 排查:检查是否是搜索空间过大(网格太细)、冲突检测循环嵌套过多、优化算法陷入局部循环。
- 技巧:采用“先粗后精”策略;对冲突检测进行空间分区加速(如只检测空间上邻近的无人机对);为智能优化算法设置合理的最大迭代次数或收敛阈值。
问题2:规划出的路径紧贴障碍物飞行,看似最优但不安全。
- 排查:代价函数中只考虑了距离,未考虑安全裕度。
- 技巧:在代价函数中增加一项“风险代价”,例如与最近障碍物距离的倒数或负相关函数。或者在障碍物周围设置一个更大的“膨胀层”(Inflation Layer),在规划时就将膨胀层视为障碍。
问题3:冲突消解后,产生了新的、更复杂的冲突(链式反应)。
- 排查:使用了简单的“一对一”局部重规划,未考虑调整对第三者的影响。
- 技巧:采用更全局的消解策略,如基于“冲突图”的搜索。或者,在每次迭代中,不只解决一个冲突,而是解决当前检测到的所有冲突中“最严重”的一个(例如距离最小的),然后重新检测全局。
问题4:轨迹不平滑,无人机无法实际跟踪。
- 排查:直接使用了网格折线路径,未考虑动力学约束。
- 技巧:务必加入路径平滑步骤(如B样条拟合)。在平滑后,需要反向检查平滑后的轨迹是否仍然满足避障约束(采样检查),如果不满足,则需要调整平滑参数或重新规划。
这道“无人机协同避障航迹规划”赛题,是一个绝佳的将理论算法应用于复杂实际问题的练兵场。它没有标准答案,但有一条清晰的进阶路径:从准确的数学建模开始,选择与问题规模匹配的算法组合,构建一个分层、迭代的求解框架,最后通过严谨的仿真和清晰的论文来展示你的完整思考。过程中最大的收获,可能不是某个算法的代码实现,而是那种将模糊的现实需求层层分解、转化为可计算、可优化模型的系统思维能力。这种能力,无论是在未来的学术研究还是工程实践中,都至关重要。