https://github.com/openai/robogym
自己的项目需要做一些机械臂 table-top 级的多任务操作
robogym 基于 mujoco 搭建,构建了一个仿真机械臂桌面物体操作(pick-place、stack、rearrange)场景
robogym 的例程效果看,支持多个相机示教,包括眼在手上和眼在手外,可以获取多视角视觉信息
robogym 的物体支持 YCB 数据集格式
主要是这些原因,当然,看官方 readme.md 文档,它还有其他不错的功能。
国内主流社区对 robogym 的介绍比较少,所以选择写一些文档记录一下,作为参考。
robogym 原本是做复杂 goal-condition 强化学习以及课程学习做的 benchmark ,因此在 benchmark 专门渲染了目标位置/旋转角。
但是对于我的项目,不需要这样的目标信息,因为目标是我自己设置的,不是 benchmark 设置的。
因此在 mujoco 仿真环境中,需要消除/不显示这样的目标阴影信息。
解决办法如下:
打开源文件:~/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_ids
和 target_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 这个 benchmark 是由 YCB 格式的数据集的,选择使用 YCB 物体进行仿真,可以得到一个模型的实体,但是 robogym 的代码是:先随机选择模型、再随机选择颜色,然后再一一匹配相当于上色。这样的结果是:渲染后 YCB 模型具有 非常不真实 的颜色。
解决方法是:正则表达式提取从路径名中提取水果名字,设置一个字典记录每个水果的颜色,然后匹配到水果名字就做颜色的替换;没有匹配到,也就是其他物体,就用缺省随机颜色。
打开源文件:~/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
效果显著,水果成功变成了它们应有的颜色。