import argparse import numpy as np from sapien.core import Pose from transforms3d.euler import euler2quat from simpler_env.utils.io import DictAction def parse_range_tuple(t): return np.linspace(t[0], t[1], int(t[2])) def get_args(): # parse command-line arguments parser = argparse.ArgumentParser() parser.add_argument( "--policy-model", type=str, default="rt1", help="Policy model type; e.g., 'rt1', 'octo-base', 'octo-small'", ) parser.add_argument( "--policy-setup", type=str, default="google_robot", help="Policy model setup; e.g., 'google_robot', 'widowx_bridge'", ) parser.add_argument("--ckpt-path", type=str, default=None) parser.add_argument("--env-name", type=str, required=True) parser.add_argument( "--additional-env-save-tags", type=str, default=None, help="Additional tags to save the environment eval results", ) parser.add_argument("--scene-name", type=str, default="google_pick_coke_can_1_v4") parser.add_argument("--enable-raytracing", action="store_true") parser.add_argument("--robot", type=str, default="google_robot_static") parser.add_argument( "--obs-camera-name", type=str, default=None, help="Obtain image observation from this camera for policy input. None = default", ) parser.add_argument("--action-scale", type=float, default=1.0) parser.add_argument("--control-freq", type=int, default=3) parser.add_argument("--sim-freq", type=int, default=513) parser.add_argument("--max-episode-steps", type=int, default=80) parser.add_argument("--rgb-overlay-path", type=str, default=None) parser.add_argument( "--robot-init-x-range", type=float, nargs=3, default=[0.35, 0.35, 1], help="[xmin, xmax, num]", ) parser.add_argument( "--robot-init-y-range", type=float, nargs=3, default=[0.20, 0.20, 1], help="[ymin, ymax, num]", ) parser.add_argument( "--robot-init-rot-quat-center", type=float, nargs=4, default=[1, 0, 0, 0], help="[x, y, z, w]", ) parser.add_argument( "--robot-init-rot-rpy-range", type=float, nargs=9, default=[0, 0, 1, 0, 0, 1, 0, 0, 1], help="[rmin, rmax, rnum, pmin, pmax, pnum, ymin, ymax, ynum]", ) parser.add_argument( "--obj-variation-mode", type=str, default="xy", choices=["xy", "episode"], help="Whether to vary the xy position of a single object, or to vary predetermined episodes", ) parser.add_argument("--obj-episode-range", type=int, nargs=2, default=[0, 60], help="[start, end]") parser.add_argument( "--obj-init-x-range", type=float, nargs=3, default=[-0.35, -0.12, 5], help="[xmin, xmax, num]", ) parser.add_argument( "--obj-init-y-range", type=float, nargs=3, default=[-0.02, 0.42, 5], help="[ymin, ymax, num]", ) parser.add_argument( "--additional-env-build-kwargs", nargs="+", action=DictAction, help="Additional env build kwargs in xxx=yyy format. If the value " 'is a list, it should be like key="[a,b]" or key=a,b ' 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' "Note that the quotation marks are necessary and that no white space " "is allowed.", ) parser.add_argument("--logging-dir", type=str, default="./results") parser.add_argument("--tf-memory-limit", type=int, default=3072, help="Tensorflow memory limit") parser.add_argument("--octo-init-rng", type=int, default=0, help="Octo init rng seed") args = parser.parse_args() # env args: robot pose args.robot_init_xs = parse_range_tuple(args.robot_init_x_range) args.robot_init_ys = parse_range_tuple(args.robot_init_y_range) args.robot_init_quats = [] for r in parse_range_tuple(args.robot_init_rot_rpy_range[:3]): for p in parse_range_tuple(args.robot_init_rot_rpy_range[3:6]): for y in parse_range_tuple(args.robot_init_rot_rpy_range[6:]): args.robot_init_quats.append((Pose(q=euler2quat(r, p, y)) * Pose(q=args.robot_init_rot_quat_center)).q) # env args: object position if args.obj_variation_mode == "xy": args.obj_init_xs = parse_range_tuple(args.obj_init_x_range) args.obj_init_ys = parse_range_tuple(args.obj_init_y_range) # update logging info (args.additional_env_save_tags) if using a different camera from default if args.obs_camera_name is not None: if args.additional_env_save_tags is None: args.additional_env_save_tags = f"obs_camera_{args.obs_camera_name}" else: args.additional_env_save_tags = args.additional_env_save_tags + f"_obs_camera_{args.obs_camera_name}" return args