def initialize(self):
        """ Adds a box terrain to the simulation, sets parameters based on the cfg.
        # """
        from isaacgym import terrain_utils

        options = gymapi.AssetOptions()
        options.fix_base_link = True
        options.armature = 0.01
        options.density = 1000
        options.use_mesh_materials = True
        options.mesh_normal_mode = gymapi.COMPUTE_PER_VERTEX
        options.override_com = True
        options.override_inertia = True
        options.vhacd_enabled = True
        options.vhacd_params = gymapi.VhacdParams()
        options.vhacd_params.resolution = 3000000
        options.vhacd_params.max_num_vertices_per_ch = 1024
        options.vhacd_params.max_convex_hulls = 64
        options.vhacd_params.concavity = 0.0

        env_lower = gymapi.Vec3(0., 0., 0.)
        env_upper = gymapi.Vec3(0., 0., 0.)
        env = self.env.envs[0]  # self.gym.create_env(self.sim, env_lower, env_upper, 1)

        collision_group = -1
        collision_filter = -1
        base_asset_root = f'{os.path.dirname(os.path.dirname(os.path.realpath(__file__)))}/../resources/objects/'
        base_asset_file = 'cube.urdf' #'cube_r08.urdf'
        self.base_asset = self.env.gym.load_asset(self.env.sim, base_asset_root, base_asset_file, options)

        texture_files = ['ice_texture.jpg', 'pebble_stone_texture_nature.jpg', 'particle_board_paint_aged.jpg', 'texture_stone_stone_texture_0.jpg', 'texture_wood_brown_1033760.jpg', 'brick_texture.jpg']
        texture_files = ['tiled_snow.jpg', 'tiled_pebble_stone_texture_nature.jpg', 'tiled_grass.jpg', 'tiled_brick_texture.jpg']
        texture_paths = [
            f'{os.path.dirname(os.path.dirname(os.path.realpath(__file__)))}/../resources/textures/{texture_file}'
            for texture_file in texture_files]
        textures = [self.env.gym.create_texture_from_file(self.env.sim, texture_path) for texture_path in texture_paths]

        self.env.terrain_actors = np.full((self.env.cfg.terrain.num_rows, self.env.cfg.terrain.num_cols), None)

        for i in range(self.env.cfg.terrain.num_rows):
            for j in range(self.env.cfg.terrain.num_cols):
                terrain_px = i * self.env.terrain.cfg.env_width + self.env.terrain.cfg.env_width / 2
                terrain_py = j * self.env.terrain.cfg.env_length + self.env.terrain.cfg.env_length / 2

                min_friction, max_friction = self.env.cfg.domain_rand.terrain_ground_friction_range
                static_friction = self.terrain_cell_frictions[i, j]
                dynamic_friction = self.terrain_cell_frictions[i, j]
                restitution = self.env.cfg.terrain.restitution
                segmentation_id = int(
                    (static_friction - min_friction) / (max_friction - min_friction) * 255)
                self.terrain_cell_bounds["x_min"][i, j] = i * self.env.terrain.cfg.env_width
                self.terrain_cell_bounds["y_min"][i, j] = j * self.env.terrain.cfg.env_length
                self.terrain_cell_bounds["x_max"][i, j] = (i + 1) * self.env.terrain.cfg.env_width
                self.terrain_cell_bounds["y_max"][i, j] = (j + 1) * self.env.terrain.cfg.env_length

                pose = gymapi.Transform()
                pose.r = gymapi.Quat(0, 0, 0, 1)
                pose.p = gymapi.Vec3(terrain_px, terrain_py,
                                     -self.env.terrain.cfg.env_width * 0.05 / 2 + self.terrain_cell_heights[i, j])  # , -self.base_depth / 2)

                props = self.env.gym.get_asset_rigid_shape_properties(self.base_asset)
                print(len(props))
                props[0].friction = self.terrain_cell_frictions[i, j]
                props[0].restitution = self.env.cfg.terrain.restitution
                self.env.gym.set_asset_rigid_shape_properties(self.base_asset, props)

                self.env.terrain_actors[i, j] = self.env.gym.create_actor(env, self.base_asset, pose, None, collision_group, collision_filter)
                self.env.gym.set_actor_scale(env, self.env.terrain_actors[i, j], self.env.terrain.cfg.env_width)
                # self.gym.set_rigid_body_color(env, base_handle, 0, gymapi.MESH_VISUAL_AND_COLLISION,
                #                          gymapi.Vec3(1, 1, 1))
                # print(len(textures), segmentation_id, segmentation_id // (255 // len(texture_files) + len(texture_files)))
                texture_idx = segmentation_id // (255 // len(texture_files) + len(texture_files))
                texture = textures[texture_idx % len(textures)]
                self.env.gym.set_rigid_body_texture(env, self.env.terrain_actors[i, j], 0, gymapi.MeshType.MESH_VISUAL, texture)

        lengthwise_density = int(self.env.cfg.terrain.terrain_length / self.env.cfg.terrain.horizontal_scale)
        widthwise_density = int(self.env.cfg.terrain.terrain_width / self.env.cfg.terrain.horizontal_scale)
        self.friction_samples = torch.tensor(self.terrain_cell_frictions).view(self.env.cfg.terrain.num_rows,
                                                                               self.env.cfg.terrain.num_cols).repeat_interleave(
            lengthwise_density, dim=0).repeat_interleave(widthwise_density, dim=1).to(self.env.device)
        self.roughness_samples = torch.tensor(self.terrain_cell_roughnesses).view(self.env.cfg.terrain.num_rows,
                                                                                 self.env.cfg.terrain.num_cols).repeat_interleave(
                lengthwise_density, dim=0).repeat_interleave(widthwise_density, dim=1).to(self.env.device)
 Adds a box terrain to the simulation, sets parameters based on the cfg.
        # 
globe_walking/go1_gym/terrains/box_terrain.py