Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大咖浅谈 | 从头开始做一个机器手臂2:写静态环境

大咖浅谈 | 从头开始做一个机器手臂2:写静态环境

原创
作者头像
腾讯云AI
发布于 2019-08-15 11:15:08
发布于 2019-08-15 11:15:08
9.5K00
代码可运行
举报
运行总次数:0
代码可运行

Morvan周沫凡

学习资料:

上次我们已经搭建好了三个主要部分, 包括 main.py, rl.py, env.py. 强化学习最重要的部分之一就是怎样定义你的环境. 做出来一个可视化的模拟环境能大大减轻不可见的负担. 有一个机器人在你屏幕上跑来跑去, 你能看见它, 根据他的行为来调整程序, 比看不见任何东西, 不知道是哪出了问题要好得多. 所以做一个可视化的环境变得重要起来.

这一次, 我们先熟悉一下如何用 pyglet 来画一些手臂的必要组建, 看到了画出来的东西, 我们就更加能确信我们走在了正确的道路上.

做一个 Viewer

其实 env.py 光有一个 ArmEnv 的 class 是不够的, 这个 ArmEnv 和可视化的部分分开来处理会更好管理你的代码. 所以, 我在 env.py 中, 除了 ArmEnv, 我还加入了一个叫 Viewer 的 class 来单独处理可视化的部分. 而 ArmEnv 来处理逻辑运行.

env.py

  • class ArmEnv 手臂的运动
  • class Viewer 手臂的可视化

这个 Viewer 包含了下面这些功能, 在可视化之前, 我们引入了 pyglet 这个 python 做可视化的模块. 如果你安装过 gym, gym 也是使用 pyglet 搭建的模拟环境. 安装过 gym 的朋友就没有必要再安装 pyglet 了, 没有安装过的, 你只要在 terminal 或者是 cmd 里面输入下面这个就能安装了. 同样, 我们还是用了 numpy 来做数据运算, 没有安装的朋友也可以自行安装.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ pip3 install pyglet numpy

安装好之后, 我们就能 import 这个 pyglet 模块. 并继承给 Viewer. 让 Viewer 可以使用 pyglet 的功能.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# env.py

import pyglet
class Viewer(pyglet.window.Window):
    def __init__(self, arm_info):
        # 画出手臂等
    def render(self):
        # 刷新并呈现在屏幕上
    def on_draw(self):
        # 刷新手臂等位置
    def _update_arm(self):
        # 更新手臂的位置信息

上面的 __init___update_arm 是最主要的部分. 其它两个部分都是可以通用的, 换个环境还能是一样. 所以接下来我们重点说 __init___update_arm.

初始化 Viewer

在看 __init__ 之前, 我们来分析一下, 我们要在什么时候建立这个 Viewer. 为了减少运算, 没有用到可视化的时候, 我们完全不用调用这个 Viewer 类. 所以在调用可视化的 env.render() 时, 我们才需要可视化, Viewer 这时候被调用生成最科学. 所以在 ArmEnv 中, 我们这样修改.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ArmEnv(object):
    viewer = None       # 首先没有 viewer

    def render(self):
        if self.viewer is None: # 如果调用了 render, 而且没有 viewer, 就生成一个
            self.viewer = Viewer()
        self.viewer.render()    # 使用 Viewer 中的 render 功能

找好了这个调用可视化的时机, 我们就能安心在 Viewer 中开始画手臂的样子了. 画手臂的时候我们要用到 pyglet 模块当中的一些内容, 想提前了解 pyglet 的使用方法的朋友, 可以戳这里.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# env.py

class Viewer(pyglet.window.Window):
    bar_thc = 5     # 手臂的厚度

    def __init__(self):
        # 创建窗口的继承
        # vsync 如果是 True, 按屏幕频率刷新, 反之不按那个频率
        super(Viewer, self).__init__(width=400, height=400, resizable=False, caption='Arm', vsync=False)

        # 窗口背景颜色
        pyglet.gl.glClearColor(1, 1, 1, 1)

        # 将手臂的作图信息放入这个 batch
        self.batch = pyglet.graphics.Batch()    # display whole batch at once

        # 添加蓝点
        self.point = self.batch.add(
            4, pyglet.gl.GL_QUADS, None,    # 4 corners
            ('v2f', [50, 50,                # x1, y1
                     50, 100,               # x2, y2
                     100, 100,              # x3, y3
                     100, 50]),             # x4, y4
            ('c3B', (86, 109, 249) * 4))    # color

        # 添加一条手臂
        self.arm1 = self.batch.add(
            4, pyglet.gl.GL_QUADS, None,
            ('v2f', [250, 250,              # 同上, 点信息
                     250, 300,
                     260, 300,
                     260, 250]),
            ('c3B', (249, 86, 86) * 4,))    # color

        # 按理添加第二条手臂...

上面我们设置了手臂和目标点的信息, 因为他们都可以理解为是一个长方形, 有四个顶点, 我们就能使用 GL_QUADS 这种形式. 在 pyglet 中, 还有很多其他的多边形形式或者是线形式, 具体可以参考这个链接. 我们将所有的形状信息加入一个 batch, 然后在刷新的时候整个 batch 都会刷新, 节约时间. 上面的 v2f 是每个点的 x, y 信息, 一共有四个点, 所以有8个数字. 除了 v2f 的形式, 还有其他的形式能在这里找到对应的说明. c3B 表示的是这个物体的颜色, 每个点都有个颜色, 而每个颜色用3原色来代表, 我们这个物体是纯色的, 所以每个点, 我用相同的颜色, 在 point(86, 109, 249) 就是蓝色, 然后 *4 就是4个顶点都是蓝色.为了简化这里的代码, 第二条手臂的形式和第一条一样, 第二条手臂的代码我就没写上了, 在这里能看到全部代码.

显示图像

写好了代码, 我们就来显示他们. pyglet 是一个实时刷新的做动画模块, 所以每次刷新的时候, 会调用一个功能, on_draw() 就是 pyglet 刷新时本身需要的一个功能. 而 render() 是我们在 env.render() 中调用的功能. 它们这两个功能在你建立另外的环境时可以不用变化, 因为这算是必要功能.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# env.py

class Viewer(pyglet.window.Window):
    def render(self):
        self._update_arm()  # 更新手臂内容 (暂时没有变化)
        self.switch_to()
        self.dispatch_events()
        self.dispatch_event('on_draw')
        self.flip()

    def on_draw(self):
        self.clear()        # 清屏
        self.batch.draw()   # 画上 batch 里面的内容

有了这两个功能, pyglet 就知道如何画图, 刷新图像了. 最后, 我们要在 env.py 最下面写上一个测试代码. 当运行 env.py 时, 我们就能测试画图画得怎样了. 记得每改动一点, 就运行看看, 这样才知道你的图到底画对没.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == '__main__':
    env = ArmEnv()
    while True:
        env.render()

这一次我们还只是看到了一些不会动的图像, 下一次我们就把这些不会动的让它动起来.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从头开始做一个机器手臂1:搭建结构
做这个实践的主要目的就是让我们活学活用, 从0开始搭建一个强化学习框架。之前我们在强化学习系列教程中学习到了很多强化学习的知识, 了解了各种算法应该怎样运用, 从最简单的 Q-Learning到结合神经网络的 DQN, 再到做连续动作的 DDPG 以及分布式训练的 A3C 和 DPPO。但是我们却没有真正意义上的实践过一次, 因为在那个系列中大多数时候我们只关注了算法本身。 但是搭建模拟环境, 调整参数也同样重要。 所以我们在这个系列中将会做到这些, 让你真正意义上入门了强化学习。
腾讯云AI
2019/08/06
9.4K1
从头开始做一个机器手臂1:搭建结构
Python写的我的世界源码+现成
玩过Minecraft的人应该知道的 W 前进 S 后退 A向左 D 向右 鼠标右键:增加方块 鼠标左键:删除方块 Tab 切换飞行模式/正常模式 鼠标移动 控制视角 具体游戏即可知道
全栈程序员站长
2022/07/29
13.4K0
Python写的我的世界源码+现成
OpenAI Gym 入门
这一部分参考官网提供的文档[1],对 Gym 的运作方式进行简单的介绍。Gym 是一个用于开发和比较强化学习算法的工具包,其对「代理」(agent)的结构不作要求,还可以和任意数值计算库兼容(如 Tensorflow 和 Pytorch)。Gym 提供了一系列用于交互的「环境」,这些环境共享统一的接口,以方便算法的编写。
口仆
2020/09/03
5.3K1
OpenAI Gym 入门
pyglet,一个超酷的 Python 库!
Github地址:https://github.com/pyglet/pyglet
sergiojune
2024/05/09
3991
pyglet,一个超酷的 Python 库!
【AlphaGo Zero 核心技术-深度强化学习教程代码实战03】编写通用的格子世界环境类
【导读】Google DeepMind在Nature上发表最新论文,介绍了迄今最强最新的版本AlphaGo Zero,不使用人类先验知识,使用纯强化学习,将价值网络和策略网络整合为一个架构,3天训练后就以100比0击败了上一版本的AlphaGo。Alpha Zero的背后核心技术是深度强化学习,为此,专知有幸邀请到叶强博士根据DeepMind AlphaGo的研究人员David Silver《深度强化学习》视频公开课进行创作的中文学习笔记,在专知发布推荐给大家!(关注专知公众号,获取强化学习pdf资料,详情
WZEARW
2018/04/09
1K0
【AlphaGo Zero 核心技术-深度强化学习教程代码实战03】编写通用的格子世界环境类
【三】gym简单画图、快来上手入门吧,超级简单!
得到了圆在左下角,原因是:默认情况下圆心在坐标原点 增加一个平移操作让圆显现:【圆心平移】
汀丶人工智能
2022/12/01
5330
【三】gym简单画图、快来上手入门吧,超级简单!
强化学习第1天:强化学习概述
强化学习中有一些重要的概念,我们接下来一一介绍他们,如果有些不理解不要着急,我们会举一个具体例子来解释
Nowl
2024/01/18
2890
强化学习第1天:强化学习概述
自定义Gym环境之井字棋
在文章 中 ,我们了解了一个简单的环境应该如何定义,并使用 print 简单地呈现了环境。在本文中,我们将学习自定义一个稍微复杂一点的环境——井字棋。回想一下井字棋游戏:
冬夜先生
2021/12/06
5580
Python实现3D建模工具(上)
本课程将基于OpenGL实现一般CAD软件都会具备的基础功能:渲染显示3D空间的画面并可以操作3D空间中物体。
AI拉呱
2024/05/25
2290
【深度强化学习】DQN训练超级玛丽闯关
上一期 MyEncyclopedia公众号文章 通过代码学Sutton强化学习:从Q-Learning 演化到 DQN,我们从原理上讲解了DQN算法,这一期,让我们通过代码来实现DQN 在任天堂经典的超级玛丽游戏中的自动通关吧。本系列将延续通过代码学Sutton 强化学习系列,逐步通过代码实现经典深度强化学习应用在各种游戏环境中。本文所有代码在
黄博的机器学习圈子
2020/12/11
1.4K0
【深度强化学习】DQN训练超级玛丽闯关
深度强化学习 | DQN训练超级玛丽闯关
本系列将延续通过代码学Sutton 强化学习系列,逐步通过代码实现经典深度强化学习应用在各种游戏环境中。本文所有代码在
NewBeeNLP
2021/03/03
1.5K0
深度强化学习 | DQN训练超级玛丽闯关
PyTorch专栏(二十三): 强化学习(DQN)教程
本教程介绍如何使用PyTorch从OpenAI Gym(https://gym.openai.com/)中的 CartPole-v0 任务上训练一个Deep Q Learning (DQN) 代理。
磐创AI
2019/12/10
2.8K0
PyTorch专栏(二十三): 强化学习(DQN)教程
TensorFlow应用实战-17-Qlearning实现迷宫小游戏
总共有12个状态,s1到s12.对于每一个状态会有四个动作。对于每个状态下的每个动作会有一个Q的值。
用户1332428
2018/07/30
2.1K0
TensorFlow应用实战-17-Qlearning实现迷宫小游戏
【二】gym初次入门一学就会---代码详细解析简明教程----平衡杆案例
注释:导入gym库,第2行创建CartPole-v0环境,并在第3行重置环境状态。在for循环中进行1000个时间步长(timestep)的控制,第5行刷新每个时间步长环境画面,第6行对当前环境状态采取一个随机动作(0或1),最后第7行循环结束后关闭仿真环境。 同时本地会渲染出一个窗口进行模拟如下图:
汀丶人工智能
2022/12/01
9320
【二】gym初次入门一学就会---代码详细解析简明教程----平衡杆案例
30分钟吃掉DQN算法
表格型方法存储的状态数量有限,当面对围棋或机器人控制这类有数不清的状态的环境时,表格型方法在存储和查找效率上都受局限,DQN的提出解决了这一局限,使用神经网络来近似替代Q表格。
lyhue1991
2023/09/05
2950
30分钟吃掉DQN算法
Python实现立方体纹理映射
本文要点在于扩展库pyopengl的使用,接口与标准的OpenGL基本一致。 import sys from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * from PIL import Image class MyPyOpenGLTest: #初始化OpenGL环境 def __init__(self, width = 640, height = 480, title = b'MyPyOpenGLTest')
Python小屋屋主
2018/04/16
1.3K0
Python实现立方体纹理映射
使用Python实现深度学习模型:强化学习与深度Q网络(DQN)
深度Q网络(Deep Q-Network,DQN)是结合深度学习与强化学习的一种方法,用于解决复杂的决策问题。本文将详细介绍如何使用Python实现DQN,主要包括以下几个方面:
Echo_Wish
2024/06/27
1K0
使用Python实现深度学习模型:强化学习与深度Q网络(DQN)
使用Isaac Gym 来强化学习mycobot 抓取任务
我现在将介绍一个利用myCobot的实验。这一次,实验将使用模拟器而不是物理机器进行。当尝试使用机器人进行深度强化学习时,在物理机器上准备大量训练数据可能具有挑战性。但是,使用模拟器,很容易收集大量数据集。然而,对于那些不熟悉它们的人来说,模拟器可能看起来令人生畏。因此,我们尝试使用由 Nvidia 开发的 Isaac Gym,它使我们能够实现从创建实验环境到仅使用 Python 代码进行强化学习的所有目标。在这篇文章中,我将介绍我们使用的方法。
大象机器人
2023/04/11
4.4K2
使用Isaac Gym 来强化学习mycobot 抓取任务
DDPG强化学习的PyTorch代码实现和逐步讲解
来源:Deephub Imba本文约4300字,建议阅读10分钟本文将使用pytorch对其进行完整的实现和讲解。 深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)是受Deep Q-Network启发的无模型、非策略深度强化算法,是基于使用策略梯度的Actor-Critic,本文将使用pytorch对其进行完整的实现和讲解。 DDPG的关键组成部分是 Replay Buffer Actor-Critic neural network Explorati
数据派THU
2023/04/05
8980
DDPG强化学习的PyTorch代码实现和逐步讲解
Q-learning解决悬崖问题
Q-learning是一个经典的强化学习算法,是一种基于价值(Value-based)的算法,通过维护和更新一个价值表格(Q表格)进行学习和预测。
lyhue1991
2023/09/05
3870
Q-learning解决悬崖问题
相关推荐
从头开始做一个机器手臂1:搭建结构
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验