机器人路径规划优化实战:从A*到RRT*与DWA
1. 为什么路径规划是机器人入门绕不开的坎我第一次接触机器人路径规划是在一门人工智能大作业里。题目要求让一个带轮子的小机器人在已知地图里从起点走到终点不能撞墙路径尽量短运行时间尽量短。当时脑子里第一反应是这不就是最短路径吗上课讲过Dijkstra可真上手就发现完全不是那么回事地图是栅格化的机器人有体积不能贴着墙走拐弯要平滑避障要考虑动态障碍物算法跑得再快电机也有响应延迟。这些工程问题叠加在一起才真正理解了为什么路径规划会作为人工智能课程里的核心章节存在。这篇内容就是围绕我第一次完整做完机器人路径规划优化项目的过程来讲的包含原理拆解、代码实现、仿真调试和最后在实体机器人上的验证。适合三类人看一是正在做人工智能大作业、毕业设计的学生二是刚入门ROS和SLAM想搞明白导航原理的开发者三是想用MATLAB或Python做算法验证、但不想被晦涩论文劝退的爱好者。路径规划本质上解决的是这样一个问题在状态空间里找一条从起始状态到目标状态的可行轨迹并在可行基础上优化某个指标——最短路径、最省时间、最平滑、能耗最低或者综合加权。这个问题的难点不在于找一条路而在于在有限计算资源下快速找一条足够好且能应对环境变化的路。我这次项目选了两条技术路线做对比一条是经典图搜索算法A*在栅格地图上跑全局路径规划另一条是采样类算法RRT快速随机搜索树用于带约束场景下的路径搜索。然后在这两者基础上做优化路径平滑、启发函数权重调整、动态避障策略以及MATLAB优化工具箱在参数调优里的实际用法。下面按技术模块把过程展开每一步都会讲清楚为什么这么做而不是只贴代码。2. 环境建模与问题定义栅格地图是这一切的地基2.1 栅格地图的构建方法路径规划的第一步不是写算法而是把物理世界转成算法能理解的数据结构。机器人导航里最常用的表示方式就是栅格地图Grid Map把环境切分成一个个小格子每个格子标记为可通行或不可通行。格子越细地图越精确但计算量也成倍上涨这两者的平衡是你第一个要做的工程决策。我这次用的是MATLAB环境下的binaryOccupancyMap二进制占据栅格地图地图尺寸设定为50米乘50米栅格分辨率0.5米也就是100乘100的网格。0.5米的分辨率对应一个轮胎直径约30厘米的小型移动机器人是够用的单个格子能容纳机器人本体不用额外做膨胀处理。如果你用的是更大底盘保险做法是把机器人最大外接圆半径换算成栅格数然后对障碍物做膨胀——这个后面会讲。构建地图时我手动设定了十余个矩形和圆形障碍物模拟室内仓库的货架和立柱。实际上更推荐用MATLAB的mapClutter函数自动生成随机障碍物场景方便做多组对照实验。代码大概是这样% 构建地图 map binaryOccupancyMap(50, 50, 2); % 50m x 50m分辨率0.5m % 手动添加矩形障碍物 for i 1:5 x 5 i*6; y 10; [xGrid, yGrid] meshgrid(x:x2, y:y5); setOccupancy(map, [xGrid(:) yGrid(:)], 1); end这里有两个容易被忽略的细节。第一setOccupancy的坐标是按世界坐标系来的不是栅格序号初学者最容易在这搞混。第二障碍物不要贴着地图边界设置要给机器人留出至少一个栅格的通行余量否则路径搜索会在边界处出现诡异的绕行。2.2 为什么必须做障碍物膨胀障碍物膨胀Inflation是新手做完第一个路径规划Demo后几乎必然会遇到的问题路径确实是最短的但路径贴着墙走机器人实际开过去会蹭墙因为算法是拿质点算的路径而机器人有体积。膨胀的思路是把每个障碍物格子的影响范围扩大扩大半径等于机器人底盘半径加上一个安全余量。在MATLAB里可以直接调inflate函数inflate(map, 0.6); % 机器人半径0.5m外加0.1m安全距离膨胀半径设多少非常讲究。设小了不安全设大了路径会过度绕行甚至在窄通道里直接找不到路。我的建议是先用机器人半径做一次膨胀仿真跑通后逐步减小安全余量直到路径不再擦碰障碍物为止。这个方法土但比理论计算可靠得多因为真实机器人的底盘形状、转向方式都会影响实际安全距离。2.3 搜索空间与邻域选择栅格地图确定后路径规划就变成了图搜索问题。每个可通行的栅格是图的节点相邻栅格之间的连线是边。这里有个性能关键点邻域怎么定义。四邻域上下左右生成的路径只有水平垂直段转折生硬路径总长偏大八邻域加上四个对角线路径更自然但代价是每个节点的扩展量翻倍。我在项目里先用八邻域跑通因为实现简单、效果直观。但要注意八邻域对角线移动的长度是√2倍栅格大小在启发函数里需要区别计算否则会破坏A*算法的最优性。如果做更高阶的优化还可以考虑跳点搜索JPSJump Point Search。JPS利用栅格地图的对称性压缩了A的扩展节点数在规则障碍物场景下能提速一个数量级。我后面在动态避障实验里用JPS替代了部分A真机测试时CPU占用明显降低。3. A*算法的实现细节与优化方向3.1 从Dijkstra到A*启发式搜索为什么快说到A*必须先理解它的前身Dijkstra。Dijkstra算法以起点为中心均匀向外扩展保证找到的路径是最短的但代价是探索了大量无关节点。A*的改进在于引入启发式函数h(n)预估当前节点到目标点的代价让搜索方向有倾向性地朝目标点推进。A的评价函数是f(n)g(n)h(n)g(n)是从起点到当前节点的实际代价值h(n)是当前节点到目标点的估计代价值。关键在于h(n)的设计。h(n)越小A扩展的节点越多越接近Dijkstrah(n)越大搜索越激进速度快了但可能错过最优解。理论保证最优解的条件是h(n)必须满足可采纳性admissible即h(n)不能超过真实代价值。我实测下来的数据很有参考价值同一张100×100栅格地图Dijkstra扩展了约4200个节点A*用欧几里得距离做启发函数扩展了约1600个节点而如果用曼哈顿距离做启发函数扩展了约1200个节点。注意这里说的是基于节点计数实际运行时间提升更明显尤其在地图规模变大后。原因在于曼哈顿距离在四邻域或八邻域栅格地图中更贴合真实移动代价模式。3.2 核心数据结构Open表和Closed表A*的实现核心是维护两张表Open表存放待评估节点Closed表存放已评估节点。每次迭代从Open表里取f值最小的节点进行扩展。这意味着Open表的数据结构直接影响算法性能如果用普通数组存储每次取最小值都要遍历全表复杂度O(n)用二叉堆优先队列能做到O(log n)。MATLAB里我用PriorityQueue实现Open表Python环境则直接用heapq。这里有个实际调试教训不要只在节点入队时记录f值还要在节点出队时检查一遍因为节点可能在入队后被找到更短路径需要在堆里更新优先级。标准做法是维护一个节点-当前最小g值的映射表出队时如果发现当前记录的g值比映射表里的大说明这个条目已过期直接跳过。% A*核心循环伪代码 while ~isEmpty(openSet) current extractMin(openSet); % 取f值最小节点 if current goal return reconstructPath(cameFrom, current); end % 检查过期节点 if gScore(current) bestG(current) continue; end for neighbor in getNeighbors(current) tentativeG gScore(current) dist(current, neighbor); if tentativeG gScore(neighbor) cameFrom(neighbor) current; gScore(neighbor) tentativeG; fScore(neighbor) gScore(neighbor) h(neighbor); addToOpenSet(openSet, neighbor); end end end3.3 用MATLAB优化工具箱整定启发函数权重A的启发函数权重是路径长度和搜索速度之间的杠杆。标准A权重为1保持最优性加权A*Weighted A*把f(n)改成g(n)w*h(n)w大于1时搜索更快但路径可能变长。这个w取多少是典型的参数优化问题。我这次项目中尝试了MATLAB优化工具箱Optimization Toolbox去做自动整定而不是手动试值。思路是把权重w当作待优化变量目标函数是路径综合代价——路径总长度、转弯次数、搜索耗时的加权和用fminsearch或ga遗传算法求解。核心代码如下% 定义目标函数输入w输出路径代价 function cost pathCost(w) % 用加权A*搜索路径 path weightedAStar(map, start, goal, w); if isempty(path) cost 1e6; % 找不到路径给个大惩罚值 return; end pathLen sum(vecnorm(diff(path), 2, 2)); % 路径总长 turns countTurns(path); % 转弯次数 cost pathLen 0.3 * turns; % 权重手动指定 end % 遗传算法寻优 options optimoptions(ga, Display, iter, PopulationSize, 20); [wOpt, fval] ga(pathCost, 1, [], [], [], [], 1, 5, [], options);说明一下我这里目标函数中转弯项的权重0.3是拍脑袋定的。如果你有更精确的能耗模型应该根据实际单位距离能耗和单位转弯能耗的比例来定。这次实测下来w在1.5到2.0之间最划算搜索节点数比标准A*少30%到40%路径长度只增加3%到5%。w超过3以后路径质量下降明显会出现为了快而绕远路的情况。3.4 路径平滑三次样条插值A*输出的路径本质是一系列栅格中心点连线转折处存在尖角。如果直接把转折点发给底层运动控制机器人会在每个拐角处急停再转向不仅慢还会加剧电机磨损。我做平滑处理用的是三次样条插值cubic spline在MATLAB里一行csape或smoothdata就能处理。平滑有个大坑直接对A*路径点做样条插值插值曲线可能穿过障碍物。因为在拐角处曲线向外侧甩出一段弧线。解决办法是让路径点和障碍物之间保留至少一个栅格的间距或者对平滑后的路径逐点做碰撞检测碰到障碍物就在局部回退到原始折线路径。我采用的是分段策略A*先找到的粗路径做碰撞检测只对远离障碍物的路径段做平滑靠近障碍物的地方保留折线。平滑半径不是越大约好我试过45度转向角下半径1.5米的平滑处理路径明显缩短了但平滑后路径和原始路径的最大偏差有0.3米在拥堵场景中这个距离足够引发碰撞了。4. RRT与采样类算法高维空间和狭窄通道的另一种解法4.1 RRT的基本思路与实现A*适用于栅格地图这种离散化的状态空间但如果状态空间维度高——比如机械臂的关节空间一个状态是六七个关节角度——栅格化就不可行了。这时候采样类算法更有优势。RRTRapidly-exploring Random Tree的做法是在连续空间里随机采样点然后把采样点连接到已有的搜索树上的最近节点逐步向外扩展。RRT算法的魅力在于它不需要显式建模障碍物只需要一个碰撞检测函数。这让它在高维空间和复杂几何约束下依然可用。我这次在MATLAB里实现了一个简单的二维RRT用于对比验证% RRT核心扩展步骤 for iter 1:maxIter sample [rand*50, rand*50]; % 随机采样 nearestNode findNearest(tree, sample); newPoint steer(nearestNode, sample, stepSize); if ~collisionCheck(map, nearestNode.pos, newPoint) tree.add(newPoint, nearestNode); if norm(newPoint - goal) goalThreshold return tracePath(tree, newPoint); end end end三个关键参数分别是采样范围、扩展步长stepSize和目标判定阈值goalThreshold。stepSize决定了树的生长速度和平滑度太大容易跳过狭窄通道太小搜索效率低下。我这次用的步长1米在50×50地图上效果不错。4.2 RRT的致命短板与RRT*改进基础RRT有两个明显问题一是路径不是最优的随机采样导致路径绕路严重二是不保证找到路径如果目标在狭窄通道深处树很难恰好采样到通道入口。针对第一个问题RRT引入了重连rewire机制新节点加入后检查周围一定半径内的节点看是否能把它们的父节点换成新节点来缩短路径代价。这个机制让RRT在迭代次数足够多时能收敛到近似最优解。代价是计算量显著增加。每次插入新节点都要做邻域搜索在障碍物密集的场景中碰撞检测次数急剧上升。我实测同一张地图RRT找到可行路径平均需要0.8秒RRT需要3到5秒才能收敛到较短路径如果地图复杂度翻倍RRT耗时几乎线性增长。这给我们的工程启发是如果只需要一条可行路径用RRT如果需要较短路径用RRT加较大迭代上限如果环境是静态的完全可以先用RRT离线算好路径运行时再结合动态避障策略。4.3 A与RRT的对比实验数据为了让选型更有说服力我在同一张10障碍物地图上跑了30次对比实验。结果如下表指标A*RRT*平均搜索时间0.12s2.4s平均路径长度48.6m56.3m平均转弯次数917成功率100%100%限时内内存占用低中结论是在二维栅格静态地图中A完胜RRT无论是时间、路径质量还是稳定性。RRT*的真正价值在更高维度空间里比如六轴机械臂避障路径规划那里栅格地图根本建不出来。所以做项目选型时先问自己两个问题状态空间能不能离散化如果不能再接采样类算法。4.4 采样优化目标偏置与路径剪枝即使选了RRT也有一些花小钱办大事的优化手段。第一是目标偏置goal bias以一定概率比如10%不随机采样而是直接采样目标点让树朝目标方向生长。这个改动很小但收敛速度提升非常明显。第二是路径剪枝path pruningRRT返回的路径往往包含大量冗余节点做一次直线可见性检查把能直线连接的两个节点之间的中间节点全部删掉。我刚才测到的RRT*路径平均转弯17次剪枝后降到11次路径长度也缩短了8%左右。剪枝的MATLAB实现简单到令人发指——就是暴力遍历每对节点检查连线是否碰撞。但注意剪枝时要保序不能从前往后贪心剪完就完事正确做法是从起点开始尽可能向后找最远的可见节点连接然后从这个节点继续这样得到的剪枝路径才是最短的。5. 动态避障与局部路径规划让机器人应对不确定世界5.1 全局规划解决不了的问题固定地图下的全局规划只能解决静态避障真实环境里哪有什么静态。我在仿真里加入了两个速度不同的移动障碍物全局路径规划给出的路径瞬间就过时了。实时重跑全局规划不是不行——只要计算够快比如小地图上A*毫秒级完成——但在更大地图里频繁重规划会耗尽计算资源而且规划的路径前后不一致会导致机器人抖动。行业里标准的做法是分层规划全局规划负责宏观路线局部规划器负责实时避障。全局路径作为参考轨迹局部规划器只关注机器人周围几米内的障碍物滚动生成短期局部路径。这种全局引导局部纠偏的结构也是ROS里move_base导航栈的标准架构。5.2 动态窗口法DWA的原理与实现局部规划器我选的是DWADynamic Window Approach中文一般叫动态窗口法。核心思想很直观在机器人当前运动状态下考虑电机在下一时刻能产生的所有速度组合线速度角速度这些组合构成一个动态窗口。对窗口内每个速度组合模拟未来一段时间的运动轨迹计算轨迹的评价得分避开障碍物、朝向目标、速度大小选最高分执行。DWA的优势是把机器人运动学约束直接融进了规划里速度变化率、最大转向角速度这些约束都是从真实底盘参数来的。我在MATLAB里复现了简化版DWA核心评价函数长这样score alpha * headingDist(轨迹末端朝向, 目标方向) ... beta * clearance(轨迹与最近障碍物距离) ... gamma * velocity(速度大小);三个系数alpha、beta、gamma的比例是调参重点。alpha权重高机器人会激进朝目标冲容易撞障碍物beta高机器人过于保守会在空旷区域龟速爬行还被远方的障碍物吓到gamma高机器人贪快容易在接近障碍物时来不及刹车。我在这个项目里使用的比例是1:3:1偏保守型因为实验场地里障碍物较多。5.3 全局与局部路径的衔接问题分层规划最大的坑在于全局路径和局部绕障路径不一致时机器人可能陷入左右摇摆。比如全局路径贴着障碍物右侧走局部规划器为避让突然出现的动态障碍物绕到了左侧绕完后局部目标点又引着机器人回到右侧于是机器人反复横穿。我解决这个问题的办法是加入了路径跟踪容忍带的概念只要机器人当前位置距离全局路径不超过1.5米局部目标点就取全局路径上前方3米处的点如果超过容忍带就不再强制回拉而是重新规划全局路径。这个阈值要根据场景尺寸和机器人速度调整本质上是在平滑性和一致性之间做权衡。5.4 实际动态避障效果我在机器人附近设置了一个半径1.2米的行人模拟器以0.8m/s速度横穿路径。测试三种策略的效果纯A*全局规划遇到动态障碍物后重规划成功率62%平均绕行时间4.5秒A*DWA局部规划成功率100%平均绕行时间2.1秒纯DWA无全局引导在开阔区域能到目标但遇到U型障碍物时会卡住这套实验数据很直观地说明了为什么要分层全局规划给方向感局部规划给应急反应两者缺一不可。6. 路径优化工具箱与多目标权衡的实战应用6.1 我为什么在路径规划项目里引入MATLAB优化工具箱很多人在路径规划项目里只用路径搜索算法本身觉得优化工具箱无关。但实际工程里路径规划的终极目标不是找一条路而是找一条满足多个约束、在多个目标间权衡最优的路。比如仓储机器人路径要短但转弯多的路径对电池损耗大再比如巡检机器人路径要覆盖所有巡检点但还要避开人流高峰期区域。这些问题本质上是带约束的多目标优化问题而MATLAB优化工具箱正是处理这类问题的通用工具。我这次做的一个实用化改造是用A生成初始路径后用fmincon约束非线性优化对路径点做局部微调把路径总长度转弯惩罚碰撞距离惩罚作为目标函数限制条件是路径点不能进入障碍物膨胀区。效果比单纯A好不少路径总长基本不变但转弯次数少了约25%路径平滑度显著提升。核心代码如下% 用fmincon对路径点做局部优化 options optimoptions(fmincon, Display, off, Algorithm, sqp); [pathOpt, fval] fmincon((p) pathObjective(p, map), ... pathInitial, [], [], [], [], lb, ub, ... (p) collisionConstraint(p, map), options);注意fmincon是局部优化算法对初始点敏感。所以一定要先用A*算一条质量不错的初始路径再做局部优化不要上来就用fmincon裸算否则大概率收敛到奇怪的地方。这也是把优化工具箱嵌入路径规划项目时最容易踩的坑——优化算法不是银弹你得给它一个靠谱的起点。6.2 多目标权衡路径长度、能耗与安全距离我在项目里定义了三个优化目标路径长度L、总转弯角Σθ、最小障碍物距离D_min越大越安全。这三个目标互相矛盾想路径短就得贴着障碍物走安全距离变小想转弯少路径就可能绕远。解决多目标问题我用了两种方法。第一种是权重加权法把三个目标线性组合成一个标量目标函数。优点简单缺点是需要人调权重而且不同量纲的目标直接相加会引入不公平的尺度偏差。我的做法是先做归一化把每个目标除以其在独立优化时达到的最优值。第二种办法是用gamultiobj多目标遗传算法直接输出帕累托前沿。跑一次可以得到一组非支配解然后再根据实际偏好选点。这个方法的直观性强适合做毕业设计展示和论文配图——帕累托前沿那张图放在论文里评委一看就懂你在做什么工作。6.3 优化工具箱的一个隐蔽大坑非光滑目标函数路径规划的目标函数天然是非光滑的——路径和障碍物的距离会随着路径点位置的连续变化出现突变比如某段路径突然落入障碍物膨胀区惩罚项从0跳到很大的值。这对基于梯度的优化算法如fmincon的sqp算法是致命的梯度不存在算法会乱走甚至发散。我的经验是如果目标函数里有max、min这类不可导操作优先用遗传算法ga或模式搜索patternsearch这类无导数优化算法对非光滑问题更鲁棒。但无导数算法通常收敛慢所以最稳的流程是先跑ga大概找到好区域再用fmincon精细优化两段式处理。7. 项目验证与调试从仿真到仿真的再升级7.1 验证指标怎么定做完整套路径规划系统后我定义了一套验证指标体系分为四个维度完备性Completeness在存在可行路径的场景中能否找到路径最优性Optimality路径长度与理论最优值的差距计算效率Efficiency平均搜索节点数、平均耗时鲁棒性Robustness随机生成多组地图上的成功率方差强烈建议你也建立类似的量化指标体系而不是只截图个路径图放报告里。我在30张随机地图上测试了A和RRT的成功率、路径长度比值、耗时最后整理成三张表格项目报告的厚度和说服力直接不同。7.2 随机地图与应力测试只在一张地图上验证算法说服力不够也很容易过拟合。我用MATLAB的mapClutter随机生成了50张地图障碍物密度从5%到30%不等从稀疏到拥挤逐步测试。这里有个有意思的发现障碍物密度超过25%时A的搜索效率急剧下降因为可通行区域被切得很碎Open表操作次数暴增。而RRT在这种拥挤环境下表现更稳定虽然时间长但基本都能找到路径。基于这个数据我在项目里做了一个简单的自适应选择根据地图的障碍物密度动态选择算法——稀疏用A*拥挤用RRT*。这种组合拳策略在实机测试中表现很好平均耗时比单独用任一算法都低。7.3 边界条件与失败模式路径规划测试不能只测能走通的快乐路径还要测走不通的失败模式。我列出了几个必须测的边界场景起点或终点在障碍物内部起点到终点被障碍物完全隔离地图全是开阔地地图只有一条狭窄单格通道目标点位于U型陷阱深处每种情况算法应有明确的失败返回而不是死循环或崩溃。这里发现一个很常见的弱实现RRT在起点终点距离很远但中间无路的情况下会一直随机采样直到最大迭代次数才报错用户体验很差。改进办法是加一个启发式终止检测如果连续大量采样点扩展后树的覆盖范围没有明显增长提前终止并反馈可能无解。8. 仿真结果的局限性和向真实机器人迁移的注意事项8.1 仿真和现实的差距到底在哪很多初学者做完仿真后会有一个错觉算法在仿真里好得很真机一定也行。现实会狠狠打脸。我总结出三个最典型的差距。第一是定位误差。仿真里机器人位置是精确的真机靠里程计或激光定位累积误差动辄每米几厘米直接导致以为在路径上实际偏了。定位误差在狭窄通道里会直接引发碰撞。第二是执行误差。你发给底盘的线速度和角速度指令由于电机响应延迟、轮子打滑实际轨迹和预期轨迹有偏差。DWA这类算法在后端控制有反馈的前提下才有效纯开环控制仿真参数再准也白搭。第三是感知误差。仿真里的障碍物是已知且静止的真机的传感器数据带噪声、有遮挡障碍物的检测距离有限可能导致局部规划器来不及反应。这也是为什么很多路径规划项目最后都是仿真验证实机慢速演示的节奏——不是不想跑快是传感器和底盘的物理极限在那摆着。8.2 从MATLAB仿真到ROS/移动机器人底盘的迁移思路如果你想把MATLAB里验证过的A*和DWA搬到真实机器人上最顺畅的路径是ROS。MATLAB有ROS工具箱可以直接发布和订阅ROS话题把算法和仿真环境解耦。我项目后期就是用MATLAB的ROS节点发布速度指令让Gazebo里的差分驱动机器人模型跑起来。还有一个低成本验证方案如果你手头有带ROS的仿真环境比如TurtleBot3的Gazebo模型可以直接用move_base导航栈把自己的全局规划器做成ROS插件替换默认的NavFn。这样能复用整套代价地图、里程计和传感器驱动你只需要专注实现核心算法逻辑。这个方案对毕业设计来说既保住了工作量又避免被底层工程细节拖死。8.3 给真机调试的几条实用建议真机调试的经验和仿真完全是两个世界。这里分享几条踩坑换来的建议第一所有速度指令都要限幅并且要加平滑滤波。我在仿真里直接给速度值没问题但真机上速度突变会引起底盘抖动严重时直接过流保护。第二路径点下发要带目标容忍半径不能让机器人精确停在某个点——激光定位的精度根本达不到那么精确。第三一定要有急停逻辑。局部规划器计算超时、传感器丢数据、收到异常速度指令都必须能立刻刹车。我见过太多项目死在机器人在演示时突然撞墙原因就是缺少一层看门狗逻辑。9. 从课程作业到实际项目我的最终经验总结把这套项目做完最大的体会是路径规划从来不是一个算法题而是一个系统工程题。从环境建模、算法选型、参数调优到验证评估每一个环节都在互相关联地影响最终效果。很多人卡在算法跑不通上但真正的工作量分布往往是环境建模和问题定义占20%算法实现占30%调试和参数优化占30%验证和迁移占20%。关于学习路径我个人的建议是先把A和DWA彻底弄明白在仿真里跑通再去碰RRT和优化工具箱。因为A是确定性思维的极致体现DWA让你理解运动学和环境反馈这两个是机器人导航的地基。地基稳了后面学PRM、RRT、TEB、MPC这些进阶算法才有支撑。最后再分享一个我做项目时发现的小技巧调试A和RRT这类搜索算法时强烈建议加上动画可视化——把每个被扩展的节点、每次树的生长过程都画出来。这不仅是为了演示效果好更是因为很多算法问题比如启发函数方向性不对、采样分布不均匀只有动态观察才能及时发现。我调试RRT*的rewire逻辑时就是靠动画发现邻域半径设置不当导致树形扭曲的。这种看得见的调试方式效率远高于只盯着数值看。如果你正在做机器人路径规划相关的项目不管是课程大作业还是毕业设计希望这篇文章能帮你少走些弯路。路径规划优化这条路没有终点但踩过一个坑再回头看每一步都是值得的。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →