이번에 새롭게 추가된 패키지 코드 > etri_env
각 로봇팔 별로 민우가 만든 Roboti Rack 환경에 대해 custom pick and place controller + 각 로봇을 연동하는 예제들을 모두 만들어 두었다.
멀티 환경 코드의 재사용성을 높이기 위해 아래와 같은 상속 구조를 갖도록 코드를 구성했다.
MultiEnv
MultiRoboticRack
MultiRoboticRackFrankaBasic
MultiRoboticRackUR5
MultiRoboticRackUR10
MultiRoboticRackZeus
[나중에는 이렇게 환경이 추가될 것이다.] MultiSemiconductor
MultiRoboticRackFrankaBasic
MultiRoboticRackUR5
MultiRoboticRackUR10
MultiRoboticRackZeus
…
class MultiEnv(object):
class MultiRoboticRack(MultiEnv):
class MultiRoboticRackFrankaBasic(MultiRoboticRack):
class MultiRoboticRackUR5(MultiRoboticRack):
class MultiRoboticRackUR10(MultiRoboticRack):
class MultiRoboticRackZeus(MultiRoboticRack):
MultiRoboticRackZeus를 예를 들어 살펴보자.
로봇을 등장시키고, 로봇의 컨트롤러까지 모두 MultiRoboticRackZeus에서 구현되고 연동되도록 해두었다.
매개변수로 ROBOT_TYPE이라는 것을 받고 이것에 따라서 2지 / 3지 그리퍼를 다르게 달릴 수 있도록 하였다.
def add_robot(self):
robot = None
if self._robot_type == "2f85":
robot = self._world.scene.add(
Zeus2F(
prim_path=f"/World/Env_{self._index}/robot_{self._index}",
usd_path=self.ROBOT_PATH,
name=f"robot_{self._index}",
position=self._robot_position + self._xyz_offset,
orientation=self._robot_orientation,
attach_gripper=True,
)
)
elif self._robot_type == "3f":
robot = self._world.scene.add(
Zeus3F(
prim_path=f"/World/Env_{self._index}/robot_{self._index}",
usd_path=self.ROBOT_PATH,
name=f"robot_{self._index}",
position=self._robot_position + self._xyz_offset,
orientation=self._robot_orientation,
attach_gripper=True,
)
)
controller = CustomPickPlaceController(
name="pick_place_controller",
gripper=robot.gripper,
robot_articulation=robot,
end_effector_initial_height=1.2,
robot_type="zeus",
)
self._controllers.append(controller)
그리고 custom pick and place controller 또한 robot_type을 매개변수로 받아
각 로봇별로 알맞은 컨트롤러를 연동 가능하도록 설계해 두었다.