强化学习框环境 - robogym - 学习 - 4

强化学习环境 - robogym - 学习 - 4

文章目录

  • 强化学习环境 - robogym - 学习 - 4
    • 项目地址
    • 为什么选择 robogym
    • 如何消去目标位置的阴影?
    • 如何让物体颜色变得正确?

项目地址

https://github.com/openai/robogym

为什么选择 robogym

  1. 自己的项目需要做一些机械臂 table-top 级的多任务操作

  2. robogym 基于 mujoco 搭建,构建了一个仿真机械臂桌面物体操作(pick-place、stack、rearrange)场景

  3. robogym 的例程效果看,支持多个相机示教,包括眼在手上和眼在手外,可以获取多视角视觉信息

  4. robogym 的物体支持 YCB 数据集格式

主要是这些原因,当然,看官方 readme.md 文档,它还有其他不错的功能。

国内主流社区对 robogym 的介绍比较少,所以选择写一些文档记录一下,作为参考。

如何消去目标位置的阴影?

robogym 原本是做复杂 goal-condition 强化学习以及课程学习做的 benchmark ,因此在 benchmark 专门渲染了目标位置/旋转角。

但是对于我的项目,不需要这样的目标信息,因为目标是我自己设置的,不是 benchmark 设置的。

因此在 mujoco 仿真环境中,需要消除/不显示这样的目标阴影信息。

强化学习框环境 - robogym - 学习 - 4_第1张图片

解决办法如下:

打开源文件:~/robogym/robogym/envs/rearrange/simulation/base.py ,转到第 750 行左右。

if colors is not None:
	color = list(colors[i])

    self.mj_sim.model.geom_rgba[object_geom_ids, :] = color
    self.mj_sim.model.geom_rgba[target_geom_ids, :] = color

self.mj_sim.model.geom_rgba[target_geom_ids, -1] = 0.2

这里的 if 块说明的是,如果没有颜色变量,就从默认的 colors 列表中选取颜色,分别对 object_geom_idstarget_geom_ids 进行上色。但是在最后,又进行了 self.mj_sim.model.geom_rgba[target_geom_ids, -1] = 0.2 这个代码,这其实是让目标物体的颜色变淡。

因此只要在这里把 0.2 设置成更小的数,0.02 或者 0.0 都可以,就可以让目标物体在渲染中消失。

【注意】:只是在 mujoco 的 render() 渲染消失了,但是目标位置还是存在的,可以通过 reset() 读取得到!

self.mj_sim.model.geom_rgba[target_geom_ids, -1] = 0.0 效果如下:

强化学习框环境 - robogym - 学习 - 4_第2张图片

可见,阴影消失了。

如何让物体颜色变得正确?

robogym 这个 benchmark 是由 YCB 格式的数据集的,选择使用 YCB 物体进行仿真,可以得到一个模型的实体,但是 robogym 的代码是:先随机选择模型、再随机选择颜色,然后再一一匹配相当于上色。这样的结果是:渲染后 YCB 模型具有 非常不真实 的颜色。

强化学习框环境 - robogym - 学习 - 4_第3张图片

解决方法是:正则表达式提取从路径名中提取水果名字,设置一个字典记录每个水果的颜色,然后匹配到水果名字就做颜色的替换;没有匹配到,也就是其他物体,就用缺省随机颜色。

打开源文件:~/robogym/robogym/envs/rearrange/common/mesh.py ,进入到 MeshRearrangeEnv_sample_group_attributes 文件下,在源码基础上添加一些代码:

def _sample_group_attributes(self, num_groups: int):
        attrs_dict = super()._sample_group_attributes(num_groups)
        attrs_dict["mesh_files"] = self._sample_object_meshes(num_groups)


        # #################### add code here ! ####################
        # 设置一个字典记录每个水果的颜色
        fruit_colors = {
            "banana": [1.0, 1.0, 0.6, 1.0],  # yellow
            "strawberry": [1.0, 0.0, 0.4, 1.0],  # red
            "apple": [0.8, 0.0, 0.0, 1.0],  # red
            "lemon": [1.0, 1.0, 0.4, 1.0],  # yellow
            "peach": [1.0, 0.8, 0.6, 1.0],  # orange
            "pear": [0.8, 1.0, 0.8, 1.0],  # green
            "orange": [1.0, 0.5, 0.0, 1.0],  # orange
            "plum": [0.6, 0.0, 0.4, 1.0]  # purple
        }
        
        # 正则表达式提取从路径名中提取水果名字
        import re
        # attrs_dict["mesh_name"] = []
        for i in range(len(attrs_dict["mesh_files"])):
            match = re.search(r'/\d+_(\w+)/\d+_\w+.stl', attrs_dict["mesh_files"][i][0])
            if match:
                name_string = match.group(1)
                # attrs_dict["mesh_name"].append(name_string)
                if name_string in fruit_colors.keys():
                    # 然后匹配到水果名字就做颜色的替换
                    attrs_dict["color"][i, :] = np.asarray(fruit_colors[name_string])
            # else:
            #     没有匹配到,也就是其他物体,就用缺省随机颜色
            #     attrs_dict["mesh_name"].append('default')
        # ##########################################################

        return attrs_dict

效果显著,水果成功变成了它们应有的颜色。

强化学习框环境 - robogym - 学习 - 4_第4张图片

你可能感兴趣的:(序列决策,源码解读,学习,人工智能,论文阅读)