基于强化学习的走迷宫案例,利用Blender可视化

本文介绍如何利用Q-Learning算法和Blender进行走迷宫的强化学习案例。通过Blender创建迷宫模型,使用其API进行物体创建、移动和插帧,实现实时观察机器人学习过程。在遇到Blender内置Python库不全和无法在界面中查看运行情况的问题时,作者提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一些链接

Github地址:https://github.com/yuhhhhh/Maze_blender

莫烦强化学习:https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/

Blender官方api:https://docs.blender.org/api/2.90/info_quickstart.html

问题介绍

走迷宫是一个很简单的游戏,在一些简单的场景我们可以很轻松的找到终点,对于复杂的场景,花的时间可能会长一点,最近开始学习强化学习,走迷宫是强化学习入门的一个简单案例,本次尝试利用强化学习来训练一个机器人找到走迷宫的最短路径,强化学习部分的代码主要来自于莫烦的走迷宫案例,当然关于q-learning也是在莫烦的网站上学习的。初衷是为了验证blender是否可以进行仿真,也就是我们强化学习的过程是否可以在blender上实时观察到,在网上可以搜到的利用blender仿真的案例相当少,虽然官网给了丰富的api,这也许和blender在国内本来就不火有关,查阅了相关接口确实可以在blender中建立一个迷宫模型,接下来就开始吧,Let’s go!

Q-Learning

走迷宫用到的是Q-Learning算法,关于Q-Learning的讲解网上有相当多的资料可以查询,本文主要说一下我自己的见解,大家参考就行,机器人在每一个状态可以选择4个动作,即up,down,left,right四个动作,假如我们在状态s1,采取动作a1,这样机器人的状态就会发生变化,变为s2。而根据采取的动作a1不同,下一个状态s2就是不一样的,在迷宫中,状态主要对应着机器人的坐标,而在每一个坐标主要有3种状态,即:撞到墙壁,走到终点,正常行走三种状态,每一种状态我们设定一个reward,即奖励值,因为Q-Learning主要通过不断更新来得到最优的q值表,也就是我们在状态s1时选取动作不是完全随机的,会根据q值表选择q值最大的动作,即利益最大化。每个动作执行后我们更新q值表,这样不断反复的更新,q值表就能实现最优,设定的奖励值不是固定的,可以根据具体效果进行更改,比如我选择的奖励值如下:

状态 奖励值
撞到墙壁 -10
走到终点 50
正常行走 -0.1

接下来说说设置奖励值的思路,走到终点肯定是我们首要考虑的,所以它应该是一个正的奖励值,且这个值应该很大,因为由于q-learning的特性,我们到终点的这一段路对应状态的q值都会相应增大,撞到墙壁肯定是我们不希望的所以设定为负的,正常行走为什么也设置为负的,因为我们的目的是最短的路径,走的步数多了自然是我们不想看到的。

Blender库API

本次主要使用的blender的创建物体、移动物体、插帧的api。

首先我们导入blender的库

import bpy

创建迷宫

在blender中创建一个迷宫,可以先想好大体的迷宫路线,根据自己想好的迷宫图,转换为对应的矩阵,本文使用的迷宫矩阵如下:

maze = np.array(
        
Blender中进行可视化编程,通常指的是通过脚本或节点系统来创建和操作3D模型、动画以及视觉效果。Blender 提供了多种方式进行可视化编程,包括使用 Python 脚本和其内置的节点编辑器。 ### 使用Python脚本 BlenderPython API 允许用户通过编写 Python 脚本来控制几乎所有的 Blender 功能。这使得用户能够自动化任务、创建复杂的几何形状、修改对象属性、甚至创建新的工具和插件。 以下是一个简单的 Python 脚本示例,用于在 Blender 中创建一个立方体: ```python import bpy # 删除所有现有对象 bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete() # 创建一个新的立方体 bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0)) # 获取当前活动对象(即新创建的立方体) cube = bpy.context.active_object # 修改立方体的数据 cube.name = "MyCube" cube.data.name = "MyCubeMesh" # 添加材质到立方体 material = bpy.data.materials.new(name="RedMaterial") material.use_nodes = True nodes = material.node_tree.nodes nodes.clear() bsdf = nodes.new('ShaderNodeBsdfPrincipled') bsdf.inputs['Base Color'].default_value = (1, 0, 0, 1) # 红色 output = nodes.new('ShaderNodeOutputMaterial') material.node_tree.links.new(bsdf.outputs['BSDF'], output.inputs['Surface']) # 将材质分配给立方体 if cube.data.materials: cube.data.materials[0] = material else: cube.data.materials.append(material) ``` ### 使用节点编辑器 Blender 还提供了一个强大的节点编辑器,允许用户通过图形界面来构建着色器、纹理、合成效果等。节点编辑器支持多种类型的节点,包括材质节点、纹理节点、合成节点等。 要使用节点编辑器来创建一个简单的红色材质,可以按照以下步骤操作: 1. 打开 Blender 并选择一个对象。 2. 转到材质属性面板并创建一个新的材质。 3. 在材质设置中启用“使用节点”选项。 4. 打开节点编辑器窗口,并确保它显示的是当前选中的材质节点。 5. 清除默认的节点设置。 6. 添加一个 `Principled BSDF` 节点和一个 `Material Output` 节点。 7. 设置 `Principled BSDF` 节点的基础颜色为红色。 8. 连接 `Principled BSDF` 节点的输出到 `Material Output` 节点的表面输入。 这些方法展示了如何在 Blender利用 Python 脚本和节点编辑器来进行可视化编程,从而创造出复杂且富有创意的 3D 内容 [^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值