GymFetch-插孔-开抽屉任务介绍

21 篇文章 4 订阅
16 篇文章 9 订阅

GymFetch-插孔开抽屉任务介绍

前言:

最近做HER相关对比实验,需要几个验证仿真环境,所以仿照原版gym-fetch的封装格式,借用了metaworld的素材,为了和push,pick有所区别,所以重新搭建了两个环境,一个是随机插孔任务,一个是开抽屉任务。前者目前看来是符合需要的。后者面临着穿模的问题,后面会有所讨论。

开源链接:https://github.com/kaixindelele/GymFetch

插孔任务介绍:

总所周知,mujoco是不能仿真凹形体的,所以如果导入一个3D建模好的插孔盒子,是无法正常模拟的,插入孔中都会出现碰撞的问题。

而插孔任务其实很多论文中都提到了,比如朱玉可的19年那篇best paper, 比如GUAPO算法:
在这里插入图片描述
在这里插入图片描述

但好用的,开源的插孔仿真环境,我还真的没怎么找到过,就连robosuite里面都没搭建一个好的插孔任务,我是没想到的,待会儿发个邮件问问他们。目前能找到的都是四个长方形拼成的一个带孔盒子:
在这里插入图片描述

现在有另一个问题,这里的四个box都是没有自由度的,mujoco的box 几何体如果加了joint自由度的话,那么被夹爪接触了之后,会发生偏移,哪怕是将关节阻尼damping='10000000000'都会从缝隙中插进去。

所以这四个box必须得是无自由度的。

这样的话,带孔盒子和孔就是固定的,不利于任务难度的提高。

我必须要随机初始化孔的中心位置,然后根据孔的中心位置,安排box的位置,这样的话,就需要一个坐标生成函数,一个每次reset时,设置box位置的函数。

box坐标生成函数:输入孔的中心坐标xy,和孔的大小,整个盒子的长度一半。
输出四个box的坐标和大小。

    def reset_hole(self, hole_center, half_hole_size=0.02, hsw1y=0.1):
        cx, cy = hole_center
        hsw1x = (hsw1y - half_hole_size) / 2.0
        w1x = cx - hsw1x - half_hole_size
        w1y = cy

        hsw2x = (2*hsw1y-2*hsw1x)/2.0
        hsw2y = (hsw1y-half_hole_size)/2.0
        w2x = w1x + hsw1x + (2*hsw1y-2*hsw1x)/2.0
        w2y = w1y - hsw1y + (hsw1y-half_hole_size)/2.0

        hsw3x = hsw2x
        hsw3y = hsw2y
        w3x = w2x
        w3y = w1y + hsw1y - (hsw1y-half_hole_size)/2.0

        hsw4x = (hsw1y-half_hole_size)/2
        hsw4y = half_hole_size
        w4x = cx + half_hole_size + (hsw1y - half_hole_size) / 2.0
        w4y = cy
        return (w1x, w1y), (w2x, w2y), (w3x, w3y), (w4x, w4y)

设定body的pos,mujoco中除了set_joint_pos函数外,还能直接给body_pos设定值:

self.sim.model.body_pos[self.sim.model.body_name2id('w4')] = np.array(
            [w4x, w4y, self.sim.model.body_pos[self.sim.model.body_name2id('w4')][2]])

这样就可以随机初始化孔的位置了。

插孔任务observation的设置:

关于环境观察值的输出格式,分为
‘observation’: obs.copy(), 除了desired_goal之外的都在里面
‘grip_goal’: grip_pos.copy(), 夹爪的末端坐标xyz
‘achieved_goal’: achieved_goal.copy(), desired_goal if grip2desire > 2cm else grip_goal,即离得远时,是目标点的坐标(加上移偏置),离的近了,直接变为夹爪坐标。即假设有一个虚拟物块在目标上方,到了之后,贴着夹爪随着夹爪移动。
‘desired_goal’: self.goal.copy(),

上面基本上说清楚了观察值。

关于奖励函数的设置,仍然是稀疏奖励,但是将距离阈值变成了1cm(如果难度过高,回头再调)。

最终效果:

在这里插入图片描述

抽屉任务:

横版:

在这里插入图片描述

竖版:

在这里插入图片描述
我想的是将整个抽屉设置成刚体,夹爪穿不过去的那种,但是现在出现各种奇怪的问题,如果将里面的抽屉joint damp设置的低,那么就会自己抖动,如果设置damp大了,那么夹爪会想着直接穿过外壳,直接拉着里面的抽屉往外动。

关节limited属性也不起作用,有点迷惑。回头再调调。

联系方式:

ps: 欢迎做强化的同学加群一起学习:

深度强化学习-DRL:799378128

Mujoco建模:818977608

欢迎玩其他物理引擎的同学一起玩耍~

欢迎关注知乎帐号:未入门的炼丹学徒

CSDN帐号:https://blog.csdn.net/hehedadaq

我的个人博客:

未入门的炼丹学徒

网址非常好记:metair.top

极简spinup+HER+PER代码实现:https://github.com/kaixindelele/DRLib

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hehedadaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值