跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
MATLAB / OctaveAI算法

用Q-learning做无人机三维避障路径规划

用Q-learning实现了三维栅格地图中无人机的路径规划,设计了包含距离和步数惩罚的奖励函数,通过ε-贪心探索学习到无碰撞最短路径,并在MATLAB上验证。

星落发布于 2026/6/30更新于 2026/10/866 浏览
用Q-learning做无人机三维避障路径规划

一、总体思路

我想让无人机在三维栅格里自己学会怎么飞。环境是10×10×10的网格,起点(2,2,2),终点(9,9,8),中间摆了些障碍物。用的算法是离线Q-learning,核心想法很简单:无人机每次走一步,环境给个奖惩,久而久之它就摸清哪条路最划算。

二、环境建模

状态就是坐标(x,y,z),地图大小10×10×10。动作设计得比较灵活:除了悬停,有53种移动方式,包括轴向、斜向,还能一步跨两格。总共54个动作。这样一来,无人机既能小步腾挪,也能大步流星。

动作集A = {(Δx,Δy,Δz) | Δx,Δy,Δz ∈ {-2,-1,0,1,2}, 不全为0} ∪ {(0,0,0)}

约束条件也很直白:别飞出地图,别撞上障碍物,最后得抵达终点。

三、Q-learning怎么更新

Q表是个四维数组:Q(x,y,z,a)。每次走完一步,用这个公式更新:

Q(s,a) ← Q(s,a) + α [ R + γ·max_a' Q(s',a') - Q(s,a) ]

学习率α和探索率ε都是动态衰减的,训练到后面越来越相信自己的经验。α从0.25降到0.05,ε随时间指数衰减,前期多试错,后期守成。

动作选择用ε-贪心:大部分时间选当前最优动作,偶尔随机浪一下,避免陷入局部最优。

四、奖励函数

奖励函数是整个训练的关键。我设了这么几种情况:

  • 到达终点:大奖励3500,但还要扣掉走的路程和步数,逼着它找捷径。
  • 碰撞或越界:直接罚1500,让无人机长记性。
  • 悬停:小罚10,催它别发呆。
  • 正常走:奖励和方向挂钩,接近终点有正反馈,远离就吃亏;同时每步距离和步数都会惩罚,促使路径又短又直。

具体表达式就是原文那个分段函数。核心意图无非是:必须到终点,必须不撞墙,路径得短,步数得少。

$$ R(s,a)= \begin{cases} 3500 - 15 \cdot d_{step} - 5 \cdot N_{step} & \text{到达终点}\ -1500 & \text{碰撞障碍物/越界}\ 30 \cdot (d_{cur}-d_{next}) -10 \cdot d_{step} -2 \cdot N_{step} -10 & \text{悬停}\ 30 \cdot (d_{cur}-d_{next}) -10 \cdot d_{step} -2 \cdot N_{step} & \text{正常飞行} \end{cases} $$

五、训练流程

大致过程如下:

  1. 初始化地图、起点终点、障碍物、54个动作。
  2. 建个四维Q表,全零。
  3. 设定超参数:α、γ、ε、训练轮数、最大步数。
  4. 开始循环:
    • 每轮开始,无人机回到起点,路径清空。
    • 每一步,先筛掉那些会出界或撞上障碍物的动作,再按ε-贪心选一个。
    • 执行动作,得到新坐标和奖励。
    • 更新Q值。
    • 如果到了终点或撞了,就结束本轮。
  5. 训练完,用Q表跑一遍最优路径,从起点开始贪心选动作。
  6. 画图:奖励收敛、距离收敛、三维路径。

六、MATLAB代码片段及结果

下面是核心代码片段(完整的训练循环和绘图部分):

for episode = 1:max_episode
    % 动态衰减学习率α和探索率ε
    % 无人机重置到起点
    for step = 1:max_step
        % 1. 动作剪枝:剔除无效动作
        % 2. ε-贪心选择动作
        % 3. 执行动作,得到s'和R
        % 4. 更新Q:Q(s,a) <- Q(s,a) + α[R + γ maxQ(s',a') - Q(s,a)]
        % 5. 终止判断
        % 6. 保存路径
    end
    % 记录本轮总奖励、距离等
end

% 最优路径
final_steps = size(path,1)-1;
final_dist = 0;
for i = 1:final_steps
    final_dist = final_dist + norm(path(i+1,:)-path(i,:));
end
fprintf('\n=========================================\n');
fprintf(' 最优步数:%d 步\n', final_steps);
fprintf(' 最短距离:%.4f\n', final_dist);
fprintf(' 避障状态:无碰撞\n');
fprintf('=========================================\n');

%% 绘图
figure('Color','w','Position',[80,80,1200,380]);
subplot(1,3,1);
plot(1:max_episode, reward_curve, 'b-','LineWidth',1.6);
xlabel('训练轮数'); ylabel('总奖励'); title('奖励收敛曲线'); grid on;
subplot(1,3,2);
plot(1:max_episode, episode_path_distance, 'r-','LineWidth',1.6);
xlabel('训练轮数'); ylabel('路径总距离'); title('距离收敛曲线'); grid on;
subplot(1,3,3);
hold on; grid on; axis equal; view(3);
xlabel('X'); ylabel('Y'); zlabel('Z');
title(sprintf('最优路径 | 步数:%d | 距离:%.2f | 无碰撞',final_steps,final_dist));
xlim([1 x_max]); ylim([1 y_max]); zlim([1 z_max]);
plot3(start_state(1),start_state(2),start_state(3),'rs','MarkerSize',11,'LineWidth',2);
plot3(end_state(1),end_state(2),end_state(3),'gd','MarkerSize',11,'LineWidth',2);
scatter3(obstacle(:,1),obstacle(:,2),obstacle(:,3),100,'k','filled');
plot3(path(:,1),path(:,2),path(:,3),'m-','LineWidth',2.8,'MarkerSize',5);
legend('起点','终点','障碍物','最优路径','Location','best');

最终的训练结果收敛得很快,大概几百轮后奖励就稳定了。步数和距离也都降到了一个不错的值。

目录

  1. 一、总体思路
  2. 二、环境建模
  3. 三、Q-learning怎么更新
  4. 四、奖励函数
  5. 五、训练流程
  6. 六、MATLAB代码片段及结果

更多推荐文章

查看全部
  • 自适应图像变焦与边界框变换用于无人机目标检测
  • 解决 Google Scholar 自动化查询限制问题
  • Milvus 实战:Attu 可视化安装与 Python 整合案例
  • 15 款互联网行业必备 AI 工具深度评测与推荐
  • 基于 Go 语言构建命令行 AI 对话客户端实战
  • Visual C++运行库缺失导致程序启动失败解决方案
  • Ilya Sutskever 精选 AI 论文清单:40 大核心文献整理与解析
  • Python 网络爬虫基础教程:豆瓣电影 Top250 数据抓取实战
  • AIGC 时代下 R 语言在数据科学中的应用实践
  • DeepSeek-OCR-WEBUI 镜像实现 Mac 本地化 OCR 全流程
  • OpenClaw 多机器人团队协作构建指南
  • Ubuntu 部署 OpenClaw 完整教程
  • 前端地图开发:主流 SDK 引入方式与初始化配置详解
  • Java Web 开发入门:基础概念与静态资源解析
  • Web 自动化测试入门指南:从概念到 Selenium 实战
  • 用 Rust 构建 Git 提交历史可视化工具
  • 空间复杂度怎么判断:几个常见例子讲透
  • AIGC 辅助软件开发全流程实战:需求与设计篇
  • Spatial Joy 2025 AR&AI 全球开发大赛参赛指南与资源解析
  • SysOM Linux 服务器监控与内存诊断工具详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online