1 前言
最近在使用robosuite时,需要在仿真环境中可视化物体的目标位置,从而方便观察训练情况,可视化的物体有以下要求:
- 形状尺寸与操作的物体一样
- 半透明
- 只有visual,不与场景其他物体有碰撞
- 可以在每次step后设置位置,且固定在设定的位置,不受重力影响
2 方法
找了半天,最终确定了基本思路:
- 在环境reset时,初始化一个与操作物体的形状尺寸一样的物体,可以加在xml模型,或通过robosuite内置的模型API,设置模型只有visual,颜色半透明.
- 在任务每次step时,设置物体的位置
以下代码只用于robosuite中,原始mujoco不可用:
(1) 初始化物体并载入任务仿真场景
# 初始化操作物体
self.cube = BoxObject(
name="cube",
density=100,
size_min=[0.03, 0.03, 0.03],
size_max=[0.06, 0.06, 0.06],
rgba=[1, 0, 0, 1],
material=redwood,
)
# 初始化仅可视化的目标物体
self.cube_target = BoxObject(
name="cube_target",
size=self.cube.size,
rgba=[1, 0, 0, 0.5],
obj_type='visual',
joints=None,
)
...
self.model = ManipulationTask(
mujoco_arena=mujoco_arena,
mujoco_robots=[robot.robot_model for robot in self.robots],
mujoco_objects=[self.cube, self.cube_target],
)
(2) 在任务每次step时,设置物体的位置
cube_target_id = self.env.sim.model.body_name2id('cube_target_main') # 获取仅可视化的目标物体的id
self.env.sim.model.body_pos[cube_target_id] = np.array([0, 0, 1]) # 设置新位置
self.env.sim.model.body_quat[cube_target_id] = np.array([1, 0, 0, 0]) # 设置新四元数 wxyz
3 可视化结果
图中,桌子上的红色木纹方块是cube,更高的半透明红色方块是cube_target.