From 0bb268d1e222c40b912c889be280755c2a7b0668 Mon Sep 17 00:00:00 2001 From: boris-il-forte Date: Wed, 9 Jun 2021 15:12:28 +0200 Subject: [PATCH 1/2] Policy Gradient Algorithms cleanup - Fixed bug for GPOMDP, a copy() was misisng on the array - Simplified _compute_gradient interface, removed tuple output as it was never used - Improved lqr_pg example with 2d lqr --- examples/lqr_pg.py | 12 +++---- .../policy_search/policy_gradient/enac.py | 2 +- .../policy_search/policy_gradient/gpomdp.py | 31 ++++++++++--------- .../policy_gradient/policy_gradient.py | 12 +++---- .../policy_gradient/reinforce.py | 5 ++- 5 files changed, 30 insertions(+), 32 deletions(-) diff --git a/examples/lqr_pg.py b/examples/lqr_pg.py index 8e4e9565..ad84484d 100644 --- a/examples/lqr_pg.py +++ b/examples/lqr_pg.py @@ -29,7 +29,7 @@ def experiment(alg, n_epochs, n_iterations, ep_per_run): logger.info('Experiment Algorithm: ' + alg.__name__) # MDP - mdp = LQR.generate(dimensions=1) + mdp = LQR.generate(dimensions=2, max_action=1., max_pos=1.) approximator = Regressor(LinearApproximator, input_shape=mdp.info.observation_space.shape, @@ -39,13 +39,13 @@ def experiment(alg, n_epochs, n_iterations, ep_per_run): input_shape=mdp.info.observation_space.shape, output_shape=mdp.info.action_space.shape) - sigma_weights = 2 * np.ones(sigma.weights_size) + sigma_weights = 0.25 * np.ones(sigma.weights_size) sigma.set_weights(sigma_weights) policy = StateStdGaussianPolicy(approximator, sigma) # Agent - optimizer = AdaptiveOptimizer(eps=.01) + optimizer = AdaptiveOptimizer(eps=1e-2) algorithm_params = dict(optimizer=optimizer) agent = alg(mdp.info, policy, **algorithm_params) @@ -53,18 +53,18 @@ def experiment(alg, n_epochs, n_iterations, ep_per_run): core = Core(agent, mdp) dataset_eval = core.evaluate(n_episodes=ep_per_run) J = compute_J(dataset_eval, gamma=mdp.info.gamma) - logger.epoch_info(0, J=np.mean(J), policy_weights=policy.get_weights()) + logger.epoch_info(0, J=np.mean(J), policy_weights=policy.get_weights().tolist()) for i in trange(n_epochs, leave=False): core.learn(n_episodes=n_iterations * ep_per_run, n_episodes_per_fit=ep_per_run) dataset_eval = core.evaluate(n_episodes=ep_per_run) J = compute_J(dataset_eval, gamma=mdp.info.gamma) - logger.epoch_info(i+1, J=np.mean(J), policy_weights=policy.get_weights()) + logger.epoch_info(i+1, J=np.mean(J), policy_weights=policy.get_weights().tolist()) if __name__ == '__main__': algs = [REINFORCE, GPOMDP, eNAC] for alg in algs: - experiment(alg, n_epochs=10, n_iterations=4, ep_per_run=100) + experiment(alg, n_epochs=10, n_iterations=4, ep_per_run=25) diff --git a/mushroom_rl/algorithms/policy_search/policy_gradient/enac.py b/mushroom_rl/algorithms/policy_search/policy_gradient/enac.py index e6106712..5df90907 100644 --- a/mushroom_rl/algorithms/policy_search/policy_gradient/enac.py +++ b/mushroom_rl/algorithms/policy_search/policy_gradient/enac.py @@ -42,7 +42,7 @@ def _compute_gradient(self, J): self.sum_grad_log_list = list() - return nat_grad, + return nat_grad def _step_update(self, x, u, r): self.sum_grad_log += self.policy.diff_log(x, u) diff --git a/mushroom_rl/algorithms/policy_search/policy_gradient/gpomdp.py b/mushroom_rl/algorithms/policy_search/policy_gradient/gpomdp.py index 77a1159f..c0a68eb4 100644 --- a/mushroom_rl/algorithms/policy_search/policy_gradient/gpomdp.py +++ b/mushroom_rl/algorithms/policy_search/policy_gradient/gpomdp.py @@ -40,24 +40,26 @@ def __init__(self, mdp_info, policy, optimizer, features=None): np.seterr(divide='ignore', invalid='ignore') def _compute_gradient(self, J): - gradient = np.zeros(self.policy.weights_size) - n_episodes = len(self.list_sum_d_log_pi_ep) - + grad_J_episode = list() for i in range(n_episodes): list_sum_d_log_pi = self.list_sum_d_log_pi_ep[i] list_reward = self.list_reward_ep[i] n_steps = len(list_sum_d_log_pi) + gradient = np.zeros(self.policy.weights_size) + for t in range(n_steps): step_grad = list_sum_d_log_pi[t] step_reward = list_reward[t] - baseline = self.baseline_num[t] / self.baseline_den[t] + baseline = np.mean(self.baseline_num[t], axis=0) / np.mean(self.baseline_den[t], axis=0) baseline[np.logical_not(np.isfinite(baseline))] = 0. - gradient += (step_reward - baseline) * step_grad + gradient += step_grad * (step_reward - baseline) - gradient /= n_episodes + grad_J_episode.append(gradient) + + gradJ = np.mean(grad_J_episode, axis=0) self.list_reward_ep = list() self.list_sum_d_log_pi_ep = list() @@ -65,7 +67,7 @@ def _compute_gradient(self, J): self.baseline_num = list() self.baseline_den = list() - return gradient, + return gradJ def _step_update(self, x, u, r): discounted_reward = self.df * r @@ -74,17 +76,16 @@ def _step_update(self, x, u, r): d_log_pi = self.policy.diff_log(x, u) self.sum_d_log_pi += d_log_pi - self.list_sum_d_log_pi.append(self.sum_d_log_pi) + self.list_sum_d_log_pi.append(self.sum_d_log_pi.copy()) squared_sum_d_log_pi = np.square(self.sum_d_log_pi) - if self.step_count < len(self.baseline_num): - self.baseline_num[ - self.step_count] += discounted_reward * squared_sum_d_log_pi - self.baseline_den[self.step_count] += squared_sum_d_log_pi - else: - self.baseline_num.append(discounted_reward * squared_sum_d_log_pi) - self.baseline_den.append(squared_sum_d_log_pi) + if self.step_count >= len(self.baseline_num): + self.baseline_num.append(list()) + self.baseline_den.append(list()) + + self.baseline_num[self.step_count].append(discounted_reward * squared_sum_d_log_pi) + self.baseline_den[self.step_count].append(squared_sum_d_log_pi) self.step_count += 1 diff --git a/mushroom_rl/algorithms/policy_search/policy_gradient/policy_gradient.py b/mushroom_rl/algorithms/policy_search/policy_gradient/policy_gradient.py index 332e1f9e..755d1438 100644 --- a/mushroom_rl/algorithms/policy_search/policy_gradient/policy_gradient.py +++ b/mushroom_rl/algorithms/policy_search/policy_gradient/policy_gradient.py @@ -60,16 +60,11 @@ def _update_parameters(self, J): episode in the dataset. """ - res = self._compute_gradient(J) + grad = self._compute_gradient(J) theta_old = self.policy.get_weights() - if len(res) == 1: - grad = res[0] - theta_new = self.optimizer(theta_old, grad) - else: - grad, nat_grad = res - theta_new = self.optimizer(theta_old, grad, nat_grad) + theta_new = self.optimizer(theta_old, grad) self.policy.set_weights(theta_new) @@ -111,6 +106,9 @@ def _compute_gradient(self, J): J (list): list of the cumulative discounted rewards for each episode in the dataset. + Returns: + The gradient computed by the algorithm. + """ raise NotImplementedError('PolicyGradient is an abstract class') diff --git a/mushroom_rl/algorithms/policy_search/policy_gradient/reinforce.py b/mushroom_rl/algorithms/policy_search/policy_gradient/reinforce.py index bec19a9d..15d4db55 100644 --- a/mushroom_rl/algorithms/policy_search/policy_gradient/reinforce.py +++ b/mushroom_rl/algorithms/policy_search/policy_gradient/reinforce.py @@ -28,8 +28,7 @@ def __init__(self, mdp_info, policy, optimizer, features=None): np.seterr(divide='ignore', invalid='ignore') def _compute_gradient(self, J): - baseline = np.mean(self.baseline_num, axis=0) / np.mean( - self.baseline_den, axis=0) + baseline = np.mean(self.baseline_num, axis=0) / np.mean(self.baseline_den, axis=0) baseline[np.logical_not(np.isfinite(baseline))] = 0. grad_J_episode = list() for i, J_episode in enumerate(J): @@ -41,7 +40,7 @@ def _compute_gradient(self, J): self.baseline_den = list() self.baseline_num = list() - return grad_J, + return grad_J def _step_update(self, x, u, r): d_log_pi = self.policy.diff_log(x, u) From 29db0c70c6680c1f2edb80dea540c73f0cdd6602 Mon Sep 17 00:00:00 2001 From: boris-il-forte Date: Wed, 9 Jun 2021 16:44:15 +0200 Subject: [PATCH 2/2] Improved PyBullet environment class - PyBullet environment class cleaned up - Now everything is splitted in multiple files - removed pybullet_envs folder (envs still in development) - fixed policy gradient test --- mushroom_rl/environments/__init__.py | 1 - mushroom_rl/environments/pybullet.py | 361 +++---- .../environments/pybullet_envs/__init__.py | 3 - .../pybullet_envs/data/__init__.py | 0 .../pybullet_envs/data/hexapod/hexapod.urdf | 963 ------------------ .../data/hexapod/meshes/collision/base.stl | Bin 63484 -> 0 bytes .../hexapod/meshes/collision/leg_0_left.stl | Bin 16684 -> 0 bytes .../hexapod/meshes/collision/leg_0_right.stl | Bin 16684 -> 0 bytes .../data/hexapod/meshes/collision/leg_1.stl | Bin 19084 -> 0 bytes .../hexapod/meshes/collision/leg_2_left.stl | Bin 15884 -> 0 bytes .../hexapod/meshes/collision/leg_2_right.stl | Bin 15884 -> 0 bytes .../data/hexapod/meshes/collision/motor.stl | Bin 15484 -> 0 bytes .../data/hexapod/meshes/visual/base.stl | Bin 158684 -> 0 bytes .../data/hexapod/meshes/visual/leg_0_left.stl | Bin 41684 -> 0 bytes .../hexapod/meshes/visual/leg_0_right.stl | Bin 41684 -> 0 bytes .../data/hexapod/meshes/visual/leg_1.stl | Bin 47684 -> 0 bytes .../data/hexapod/meshes/visual/leg_2_left.stl | Bin 31684 -> 0 bytes .../hexapod/meshes/visual/leg_2_right.stl | Bin 31684 -> 0 bytes .../data/hexapod/meshes/visual/motor.stl | Bin 154684 -> 0 bytes .../environments/pybullet_envs/hexapod.py | 184 ---- mushroom_rl/utils/pybullet/__init__.py | 4 + mushroom_rl/utils/pybullet/contacts.py | 90 ++ mushroom_rl/utils/pybullet/index_map.py | 189 ++++ mushroom_rl/utils/pybullet/joints_helper.py | 44 + mushroom_rl/utils/pybullet/observation.py | 19 + mushroom_rl/utils/pybullet/viewer.py | 41 + tests/algorithms/test_policy_gradient.py | 2 +- 27 files changed, 503 insertions(+), 1398 deletions(-) delete mode 100644 mushroom_rl/environments/pybullet_envs/__init__.py delete mode 100644 mushroom_rl/environments/pybullet_envs/data/__init__.py delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/hexapod.urdf delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/base.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/leg_0_left.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/leg_0_right.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/leg_1.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/leg_2_left.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/leg_2_right.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/motor.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/visual/base.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/visual/leg_0_left.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/visual/leg_0_right.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/visual/leg_1.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/visual/leg_2_left.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/visual/leg_2_right.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/visual/motor.stl delete mode 100644 mushroom_rl/environments/pybullet_envs/hexapod.py create mode 100644 mushroom_rl/utils/pybullet/__init__.py create mode 100644 mushroom_rl/utils/pybullet/contacts.py create mode 100644 mushroom_rl/utils/pybullet/index_map.py create mode 100644 mushroom_rl/utils/pybullet/joints_helper.py create mode 100644 mushroom_rl/utils/pybullet/observation.py create mode 100644 mushroom_rl/utils/pybullet/viewer.py diff --git a/mushroom_rl/environments/__init__.py b/mushroom_rl/environments/__init__.py index 5a0f166e..65f456af 100644 --- a/mushroom_rl/environments/__init__.py +++ b/mushroom_rl/environments/__init__.py @@ -30,7 +30,6 @@ try: PyBullet = None from .pybullet import PyBullet - from .pybullet_envs import * except ImportError: pass diff --git a/mushroom_rl/environments/pybullet.py b/mushroom_rl/environments/pybullet.py index 0a33d262..58035366 100644 --- a/mushroom_rl/environments/pybullet.py +++ b/mushroom_rl/environments/pybullet.py @@ -1,66 +1,10 @@ import numpy as np -from enum import Enum import pybullet import pybullet_data from pybullet_utils.bullet_client import BulletClient from mushroom_rl.core import Environment, MDPInfo from mushroom_rl.utils.spaces import Box -from mushroom_rl.utils.viewer import ImageViewer - - -class PyBulletObservationType(Enum): - """ - An enum indicating the type of data that should be added to the observation - of the environment, can be Joint-/Body-/Site- positions and velocities. - - """ - __order__ = "BODY_POS BODY_LIN_VEL BODY_ANG_VEL JOINT_POS JOINT_VEL LINK_POS LINK_LIN_VEL LINK_ANG_VEL" - BODY_POS = 0 - BODY_LIN_VEL = 1 - BODY_ANG_VEL = 2 - JOINT_POS = 3 - JOINT_VEL = 4 - LINK_POS = 5 - LINK_LIN_VEL = 6 - LINK_ANG_VEL = 7 - - -class PyBulletViewer(ImageViewer): - def __init__(self, client, dt, size=(500, 500), distance=4, origin=(0, 0, 1), angles=(0, -45, 60), - fov=60, aspect=1, near_val=0.01, far_val=100): - self._client = client - self._size = size - self._distance = distance - self._origin = origin - self._angles = angles - self._fov = fov - self._aspect = aspect - self._near_val = near_val - self._far_val = far_val - super().__init__(size, dt) - - def display(self): - img = self._get_image() - super().display(img) - - def _get_image(self): - view_matrix = self._client.computeViewMatrixFromYawPitchRoll(cameraTargetPosition=self._origin, - distance=self._distance, - roll=self._angles[0], - pitch=self._angles[1], - yaw=self._angles[2], - upAxisIndex=2) - proj_matrix = self._client.computeProjectionMatrixFOV(fov=self._fov, aspect=self._aspect, - nearVal=self._near_val, farVal=self._far_val) - (_, _, px, _, _) = self._client.getCameraImage(width=self._size[0], - height=self._size[1], - viewMatrix=view_matrix, - projectionMatrix=proj_matrix, - renderer=pybullet.ER_BULLET_HARDWARE_OPENGL) - - rgb_array = np.reshape(np.array(px), (self._size[0], self._size[1], -1)) - rgb_array = rgb_array[:, :, :3] - return rgb_array +from mushroom_rl.utils.pybullet import * class PyBullet(Environment): @@ -69,13 +13,13 @@ class PyBullet(Environment): """ def __init__(self, files, actuation_spec, observation_spec, gamma, - horizon, timestep=1/240, n_intermediate_steps=1, + horizon, timestep=1/240, n_intermediate_steps=1, enforce_joint_velocity_limits=False, debug_gui=False, **viewer_params): """ Constructor. Args: - files (list): Paths to the URDF files to load; + files (dict): dictionary of the URDF/MJCF/SDF files to load (key) and parameters dictionary (value); actuation_spec (list): A list of tuples specifying the names of the joints which should be controllable by the agent and tehir control mode. Can be left empty when all actuators should be used in position control; @@ -90,10 +34,15 @@ def __init__(self, files, actuation_spec, observation_spec, gamma, n_intermediate_steps (int): The number of steps between every action taken by the agent. Allows the user to modify, control and access intermediate states; + enforce_joint_velocity_limits (bool, False): flag to enforce the velocity limits; + debug_gui (bool, False): flag to activate the default pybullet visualizer, that can be used for debug + purposes; **viewer_params: other parameters to be passed to the viewer. See PyBulletViewer documentation for the available options. """ + assert len(observation_spec) > 0 + assert len(actuation_spec) > 0 # Store simulation parameters self._timestep = timestep @@ -102,68 +51,34 @@ def __init__(self, files, actuation_spec, observation_spec, gamma, # Create the simulation and viewer if debug_gui: self._client = BulletClient(connection_mode=pybullet.GUI) + self._client.configureDebugVisualizer(pybullet.COV_ENABLE_GUI, 0) else: self._client = BulletClient(connection_mode=pybullet.DIRECT) self._client.setTimeStep(self._timestep) self._client.setGravity(0, 0, -9.81) self._client.setAdditionalSearchPath(pybullet_data.getDataPath()) - self._viewer = PyBulletViewer(self._client, self._timestep * self._n_intermediate_steps, **viewer_params) + self._viewer = PyBulletViewer(self._client, self.dt, **viewer_params) self._state = None # Load model and create access maps self._model_map = dict() - for file_name, kwargs in files.items(): - model_id = self._client.loadURDF(file_name, **kwargs) - model_name = self._client.getBodyInfo(model_id)[1].decode('UTF-8') - self._model_map[model_name] = model_id - self._model_map.update(self._custom_load_models()) + self._load_all_models(files, enforce_joint_velocity_limits) + + # Build utils + self._indexer = IndexMap(self._client, self._model_map, actuation_spec, observation_spec) + self.joints = JointsHelper(self._client, self._indexer, observation_spec) + + # Finally, we create the MDP information and call the constructor of the parent class + action_space = Box(*self._indexer.action_limits) - self._joint_map = dict() - self._link_map = dict() - for model_id in self._model_map.values(): - for joint_id in range(self._client.getNumJoints(model_id)): - joint_data = self._client.getJointInfo(model_id, joint_id) - if joint_data[2] != pybullet.JOINT_FIXED: - joint_name = joint_data[1].decode('UTF-8') - self._joint_map[joint_name] = (model_id, joint_id) - link_name = joint_data[12].decode('UTF-8') - self._link_map[link_name] = (model_id, joint_id) - - # Read the actuation spec and build the mapping between actions and ids - # as well as their limits - assert(len(actuation_spec) > 0) - self._action_data = list() - for name, mode in actuation_spec: - if name in self._joint_map: - data = self._joint_map[name] + (mode,) - self._action_data.append(data) - - if mode == pybullet.TORQUE_CONTROL: - self._client.setJointMotorControl2(data[0], data[1], - controlMode=pybullet.VELOCITY_CONTROL, - force=0) - - low, high = self._compute_action_limits() - action_space = Box(np.array(low), np.array(high)) - - # Read the observation spec to build a mapping at every step. It is - # ensured that the values appear in the order they are specified. - if len(observation_spec) == 0: - raise AttributeError("No Environment observations were specified. " - "Add at least one observation to the observation_spec.") - - self._observation_map = observation_spec - self._observation_indices_map = dict() - - # We can only specify limits for the joint positions, all other - # information can be potentially unbounded - low, high = self._compute_observation_limits() - observation_space = Box(low, high) - - # Finally, we create the MDP information and call the constructor of - # the parent class + observation_space = Box(*self._indexer.observation_limits) mdp_info = MDPInfo(observation_space, action_space, gamma, horizon) + + # Let the child class modify the mdp_info data structure + mdp_info = self._modify_mdp_info(mdp_info) + + # Provide the structure to the superclass super().__init__(mdp_info) # Save initial state of the MDP @@ -174,9 +89,11 @@ def seed(self, seed): def reset(self, state=None): self._client.restoreState(self._initial_state) - self.setup() - self._state = self._create_observation() - return self._state + self.setup(state) + self._state = self._indexer.create_sim_state() + observation = self._create_observation(self._state) + + return observation def render(self): self._viewer.display() @@ -185,16 +102,16 @@ def stop(self): pass def step(self, action): - cur_obs = self._state + curr_state = self._state.copy() action = self._preprocess_action(action) - self._step_init(cur_obs, action) + self._step_init(curr_state, action) for i in range(self._n_intermediate_steps): - ctrl_action = self._compute_action(action) - self._apply_control(ctrl_action) + ctrl_action = self._compute_action(curr_state, action) + self._indexer.apply_control(ctrl_action) self._simulation_pre_step() @@ -202,18 +119,23 @@ def step(self, action): self._simulation_post_step() - self._state = self._create_observation() + curr_state = self._indexer.create_sim_state() self._step_finalize() - reward = self.reward(cur_obs, action, self._state) + absorbing = self.is_absorbing(curr_state) + reward = self.reward(self._state, action, curr_state, absorbing) - return self._state, reward, self.is_absorbing(self._state), {} + observation = self._create_observation(curr_state) - def get_observation_index(self, name, obs_type): - return self._observation_indices_map[name][obs_type] + self._state = curr_state - def get_observation(self, obs, name, obs_type): + return observation, reward, absorbing, {} + + def get_sim_state_index(self, name, obs_type): + return self._indexer.get_index(name, obs_type) + + def get_sim_state(self, obs, name, obs_type): """ Returns a specific observation value @@ -226,126 +148,64 @@ def get_observation(self, obs, name, obs_type): The required elements of the input state vector. """ - indices = self.get_observation_index(name, obs_type) + indices = self.get_sim_state_index(name, obs_type) return obs[indices] - def _compute_action_limits(self): - low = list() - high = list() - - for model_id, joint_id, mode in self._action_data: - joint_info = self._client.getJointInfo(model_id, joint_id) - if mode is pybullet.POSITION_CONTROL: - low.append(joint_info[8]) - high.append(joint_info[9]) - elif mode is pybullet.VELOCITY_CONTROL: - low.append(-joint_info[11]) - high.append(joint_info[11]) - elif mode is pybullet.TORQUE_CONTROL: - low.append(-joint_info[10]) - high.append(joint_info[10]) - else: - raise NotImplementedError - - return np.array(low), np.array(high) - - def _compute_observation_limits(self): - low = list() - high = list() - - for name, obs_type in self._observation_map: - index_count = len(low) - if obs_type is PyBulletObservationType.BODY_POS \ - or obs_type is PyBulletObservationType.BODY_LIN_VEL \ - or obs_type is PyBulletObservationType.BODY_ANG_VEL: - n_dim = 7 if obs_type is PyBulletObservationType.BODY_POS else 3 - low += [-np.inf] * n_dim - high += [-np.inf] * n_dim - elif obs_type is PyBulletObservationType.LINK_POS \ - or obs_type is PyBulletObservationType.LINK_LIN_VEL \ - or obs_type is PyBulletObservationType.LINK_ANG_VEL: - n_dim = 7 if obs_type is PyBulletObservationType.LINK_POS else 3 - low += [-np.inf] * n_dim - high += [-np.inf] * n_dim - else: - model_id, joint_id = self._joint_map[name] - joint_info = self._client.getJointInfo(model_id, joint_id) - - if obs_type is PyBulletObservationType.JOINT_POS: - low.append(joint_info[8]) - high.append(joint_info[9]) - else: - low.append(-np.inf) - high.append(np.inf) - - self._add_observation_index(name, obs_type, index_count, len(low)) - - return np.array(low), np.array(high) - - def _add_observation_index(self, name, obs_type, start, end): - if name not in self._observation_indices_map: - self._observation_indices_map[name] = dict() - - self._observation_indices_map[name][obs_type] = list(range(start, end)) - - def _create_observation(self): - data_obs = list() - - for name, obs_type in self._observation_map: - if obs_type is PyBulletObservationType.BODY_POS \ - or obs_type is PyBulletObservationType.BODY_LIN_VEL \ - or obs_type is PyBulletObservationType.BODY_ANG_VEL: - model_id = self._model_map[name] - if obs_type is PyBulletObservationType.BODY_POS: - t, q = self._client.getBasePositionAndOrientation(model_id) - data_obs += t + q - else: - v, w = self._client.getBaseVelocity(model_id) - if obs_type is PyBulletObservationType.BODY_LIN_VEL: - data_obs += v - else: - data_obs += w - elif obs_type is PyBulletObservationType.LINK_POS \ - or obs_type is PyBulletObservationType.LINK_LIN_VEL \ - or obs_type is PyBulletObservationType.LINK_ANG_VEL: - model_id, link_id = self._link_map[name] - - if obs_type is PyBulletObservationType.LINK_POS: - link_data = self._client.getLinkState(model_id, link_id) - t = link_data[0] - q = link_data[1] - data_obs += t + q - elif obs_type is PyBulletObservationType.LINK_LIN_VEL: - data_obs += self._client.getLinkState(model_id, link_id, computeLinkVelocity=True)[-2] - elif obs_type is PyBulletObservationType.LINK_ANG_VEL: - data_obs += self._client.getLinkState(model_id, link_id, computeLinkVelocity=True)[-1] - else: - model_id, joint_id = self._joint_map[name] - pos, vel, _, _ = self._client.getJointState(model_id, joint_id) - if obs_type is PyBulletObservationType.JOINT_POS: - data_obs.append(pos) - elif obs_type is PyBulletObservationType.JOINT_VEL: - data_obs.append(vel) - - return np.array(data_obs) - - def _apply_control(self, action): - - i = 0 - for model_id, joint_id, mode in self._action_data: - u = action[i] - if mode is pybullet.POSITION_CONTROL: - kwargs = dict(targetPosition=u, maxVelocity=self._client.getJointInfo(model_id, joint_id)[11]) - elif mode is pybullet.VELOCITY_CONTROL: - kwargs = dict(targetVelocity=u, maxVelocity=self._client.getJointInfo(model_id, joint_id)[11]) - elif mode is pybullet.TORQUE_CONTROL: - kwargs = dict(force=u) - else: - raise NotImplementedError - - self._client.setJointMotorControl2(model_id, joint_id, mode, **kwargs) - i += 1 + def _modify_mdp_info(self, mdp_info): + """ + This method can be overridden to modify the automatically generated MDPInfo data structure. + By default, returns the given mdp_info structure unchanged. + + Args: + mdp_info (MDPInfo): the MDPInfo structure automatically computed by the environment. + + Returns: + The modified MDPInfo data structure. + + """ + return mdp_info + + def _create_observation(self, state): + """ + This method can be overridden to ctreate an observation vector from the simulator state vector. + By default, returns the simulator state vector unchanged. + + Args: + state (np.ndarray): the simulator state vector. + + Returns: + The environment observation. + + """ + return state + + def _load_model(self, file_name, kwargs): + if file_name.endswith('.urdf'): + model_id = self._client.loadURDF(file_name, **kwargs) + elif file_name.endswith('.sdf'): + model_id = self._client.loadSDF(file_name, **kwargs)[0] + else: + model_id = self._client.loadMJCF(file_name, **kwargs)[0] + + for j in range(self._client.getNumJoints(model_id)): + self._client.setJointMotorControl2(model_id, j, pybullet.POSITION_CONTROL, force=0) + + return model_id + + def _load_all_models(self, files, enforce_joint_velocity_limits): + for file_name, kwargs in files.items(): + model_id = self._load_model(file_name, kwargs) + model_name = self._client.getBodyInfo(model_id)[1].decode('UTF-8') + self._model_map[model_name] = model_id + self._model_map.update(self._custom_load_models()) + + # Enforce velocity limits on every joint + if enforce_joint_velocity_limits: + for model_id in self._model_map.values(): + for joint_id in range(self._client.getNumJoints(model_id)): + joint_data = self._client.getJointInfo(model_id, joint_id) + self._client.changeDynamics(model_id, joint_id, maxJointVelocity=joint_data[11]) def _preprocess_action(self, action): """ @@ -367,14 +227,14 @@ def _step_init(self, state, action): """ pass - def _compute_action(self, action): + def _compute_action(self, state, action): """ Compute a transformation of the action at every intermediate step. Useful to add control signals simulated directly in python. Args: - action (np.ndarray): numpy array with the actions - provided at every step. + state (np.ndarray): numpy array with the current state of teh simulation; + action (np.ndarray): numpy array with the actions, provided at every step. Returns: The action to be set in the actual pybullet simulation. @@ -413,15 +273,15 @@ def _custom_load_models(self): """ return list() - def reward(self, state, action, next_state): + def reward(self, state, action, next_state, absorbing): """ Compute the reward based on the given transition. Args: state (np.array): the current state of the system; action (np.array): the action that is applied in the current state; - next_state (np.array): the state reached after applying the given - action. + next_state (np.array): the state reached after applying the given action; + absorbing (bool): whether next_state is an absorbing state or not. Returns: The reward as a floating point scalar value. @@ -442,11 +302,16 @@ def is_absorbing(self, state): """ raise NotImplementedError - def setup(self): + def setup(self, state): """ A function that allows to execute setup code after an environment reset. + Args: + state (np.ndarray): the state to be restored. If the state should be + chosen by the environment, state is None. Environments can ignore this + value if the initial state cannot be set programmatically. + """ pass @@ -454,3 +319,7 @@ def setup(self): def client(self): return self._client + @property + def dt(self): + return self._timestep * self._n_intermediate_steps + diff --git a/mushroom_rl/environments/pybullet_envs/__init__.py b/mushroom_rl/environments/pybullet_envs/__init__.py deleted file mode 100644 index 6ba022fd..00000000 --- a/mushroom_rl/environments/pybullet_envs/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .hexapod import HexapodBullet - -HexapodBullet.register() \ No newline at end of file diff --git a/mushroom_rl/environments/pybullet_envs/data/__init__.py b/mushroom_rl/environments/pybullet_envs/data/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/mushroom_rl/environments/pybullet_envs/data/hexapod/hexapod.urdf b/mushroom_rl/environments/pybullet_envs/data/hexapod/hexapod.urdf deleted file mode 100644 index 2029f842..00000000 --- a/mushroom_rl/environments/pybullet_envs/data/hexapod/hexapod.urdf +++ /dev/null @@ -1,963 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/base.stl b/mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/base.stl deleted file mode 100644 index 1c7c9dd4de144a1683ab602e0da83348b64919c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63484 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 w1h*8|Pv-f$<{;lIgKX3kUSI=JG^?ROYJ!{x& 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 diff --git a/mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/leg_2_left.stl b/mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/leg_2_left.stl deleted file mode 100644 index b6134ab18e3a7ca0ae69cff16719c9eaa3ce4046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15884 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 diff --git a/mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/motor.stl b/mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/collision/motor.stl deleted file mode 100644 index b5f4f0286c20d7e7d4c9d859aa811e171006f85d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15484 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 O1Xf(Ruf#$(;{N~~`QOI? diff --git a/mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/visual/motor.stl b/mushroom_rl/environments/pybullet_envs/data/hexapod/meshes/visual/motor.stl deleted file mode 100644 index 212246481aacb052382b0820a1748f22033e99d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154684 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 diff --git a/mushroom_rl/environments/pybullet_envs/hexapod.py b/mushroom_rl/environments/pybullet_envs/hexapod.py deleted file mode 100644 index 393536a5..00000000 --- a/mushroom_rl/environments/pybullet_envs/hexapod.py +++ /dev/null @@ -1,184 +0,0 @@ -import time -import numpy as np -import pybullet -from mushroom_rl.environments.pybullet import PyBullet, PyBulletObservationType - -from pathlib import Path - -from mushroom_rl.environments.pybullet_envs import __file__ as path_robots - - -class HexapodBullet(PyBullet): - def __init__(self, gamma=0.99, horizon=1000, goal=None, debug_gui=False): - hexapod_path = Path(path_robots).absolute().parent / 'data' / 'hexapod'/ 'hexapod.urdf' - self.robot_path = str(hexapod_path) - - action_spec = [ - ("hexapod/leg_0/joint_0", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_0/joint_1", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_0/joint_2", pybullet.VELOCITY_CONTROL), - - ("hexapod/leg_1/joint_0", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_1/joint_1", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_1/joint_2", pybullet.VELOCITY_CONTROL), - - ("hexapod/leg_2/joint_0", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_2/joint_1", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_2/joint_2", pybullet.VELOCITY_CONTROL), - - ("hexapod/leg_3/joint_0", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_3/joint_1", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_3/joint_2", pybullet.VELOCITY_CONTROL), - - ("hexapod/leg_4/joint_0", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_4/joint_1", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_4/joint_2", pybullet.VELOCITY_CONTROL), - - ("hexapod/leg_5/joint_0", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_5/joint_1", pybullet.VELOCITY_CONTROL), - ("hexapod/leg_5/joint_2", pybullet.VELOCITY_CONTROL), - ] - - observation_spec = [ - ("hexapod/leg_0/joint_0", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_0/joint_1", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_0/joint_2", PyBulletObservationType.JOINT_POS), - - ("hexapod/leg_1/joint_0", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_1/joint_1", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_1/joint_2", PyBulletObservationType.JOINT_POS), - - ("hexapod/leg_2/joint_0", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_2/joint_1", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_2/joint_2", PyBulletObservationType.JOINT_POS), - - ("hexapod/leg_3/joint_0", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_3/joint_1", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_3/joint_2", PyBulletObservationType.JOINT_POS), - - ("hexapod/leg_4/joint_0", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_4/joint_1", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_4/joint_2", PyBulletObservationType.JOINT_POS), - - ("hexapod/leg_5/joint_0", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_5/joint_1", PyBulletObservationType.JOINT_POS), - ("hexapod/leg_5/joint_2", PyBulletObservationType.JOINT_POS), - - ("hexapod", PyBulletObservationType.BODY_POS), - ("hexapod", PyBulletObservationType.BODY_LIN_VEL) - ] - - files = { - self.robot_path: dict(basePosition=[0.0, 0, 0.12], - baseOrientation=[0, 0, 0.0, 1.0], - flags=pybullet.URDF_USE_SELF_COLLISION), - 'plane.urdf': {} - } - - super().__init__(files, action_spec, observation_spec, gamma, horizon, n_intermediate_steps=8, debug_gui=debug_gui, - distance=3, origin=[0., 0., 0.], angles=[0., -45., 0.]) - - self._client.setGravity(0, 0, -9.81) - - self.hexapod_initial_state = np.array( - [-0.66, 0.66, -1.45, - 0.66, -0.66, 1.45, - 0.00, 0.66, -1.45, - 0.00, -0.66, 1.45, - 0.66, 0.66, -1.45, - -0.66, -0.66, 1.45] - ) - - self._goal = np.array([2.0, 2.0]) if goal is None else goal - - def setup(self): - for i, (model_id, joint_id, _) in enumerate(self._action_data): - self._client.resetJointState(model_id, joint_id, self.hexapod_initial_state[i]) - - self._client.resetDebugVisualizerCamera(cameraDistance=3, cameraYaw=0.0, cameraPitch=-45, - cameraTargetPosition=[0., 0., 0.]) - - self._filter_collisions() - - def reward(self, state, action, next_state): - - pose = self.get_observation(next_state, "hexapod", PyBulletObservationType.BODY_POS) - euler = pybullet.getEulerFromQuaternion(pose[3:]) - - goal_distance = np.linalg.norm(pose[:2] - self._goal) - goal_reward = np.exp(-goal_distance) - - attitude_distance = np.linalg.norm(euler[:2]) - attitude_reward = np.exp(-attitude_distance) - - action_penalty = np.linalg.norm(action) - - self_collisions_penalty = 1.0*self._count_self_collisions() - - return goal_reward + 1e-2*attitude_reward - 1e-3*action_penalty - self_collisions_penalty - - def is_absorbing(self, state): - pose = self.get_observation(state, "hexapod", PyBulletObservationType.BODY_POS) - - euler = pybullet.getEulerFromQuaternion(pose[3:]) - - return pose[2] > 0.5 or abs(euler[0]) > np.pi/2 or abs(euler[1]) > np.pi/2 or self._count_self_collisions() >= 2 - - def _count_self_collisions(self): - hexapod_id = self._model_map['hexapod'] - - collision_count = 0 - collisions = self._client.getContactPoints(hexapod_id) - - for collision in collisions: - body_2 = collision[2] - if body_2 == hexapod_id: - collision_count += 1 - - return collision_count - - def _filter_collisions(self): - # Disable fixed links collisions - for leg_n in range(6): - for link_n in range(3): - motor_name = f'hexapod/leg_{leg_n}/motor_{link_n}' - link_name = f'hexapod/leg_{leg_n}/link_{link_n}' - self._client.setCollisionFilterPair(self._link_map[motor_name][0], self._link_map[link_name][0], - self._link_map[motor_name][1], self._link_map[link_name][1], 0) - - -if __name__ == '__main__': - from mushroom_rl.core import Core - from mushroom_rl.core import Agent - from mushroom_rl.utils.dataset import compute_J - - - class DummyAgent(Agent): - def __init__(self, n_actions): - self._n_actions = n_actions - - def draw_action(self, state): - time.sleep(0.01) - - return np.random.randn(self._n_actions) - - def episode_start(self): - pass - - def fit(self, dataset): - pass - - - mdp = HexapodBullet(debug_gui=True) - agent = DummyAgent(mdp.info.action_space.shape[0]) - - core = Core(agent, mdp) - dataset = core.evaluate(n_episodes=10, render=False) - print('reward: ', compute_J(dataset, mdp.info.gamma)) - print("mdp_info state shape", mdp.info.observation_space.shape) - print("actual state shape", dataset[0][0].shape) - print("mdp_info action shape", mdp.info.action_space.shape) - print("actual action shape", dataset[0][1].shape) - - print("action low", mdp.info.action_space.low) - print("action high", mdp.info.action_space.high) diff --git a/mushroom_rl/utils/pybullet/__init__.py b/mushroom_rl/utils/pybullet/__init__.py new file mode 100644 index 00000000..66de4454 --- /dev/null +++ b/mushroom_rl/utils/pybullet/__init__.py @@ -0,0 +1,4 @@ +from .observation import PyBulletObservationType +from .index_map import IndexMap +from .viewer import PyBulletViewer +from .joints_helper import JointsHelper diff --git a/mushroom_rl/utils/pybullet/contacts.py b/mushroom_rl/utils/pybullet/contacts.py new file mode 100644 index 00000000..b886efcb --- /dev/null +++ b/mushroom_rl/utils/pybullet/contacts.py @@ -0,0 +1,90 @@ +class ContactHelper(object): + def __init__(self, client, contacts, model_map, link_map): + self._client = client + + self._contact_list = list() + self._contact_name_map = dict() + self._computed_contacts = dict() + + for contact in contacts: + name_1, name_2 = contact.split('<->') + + model_1, link_1 = self._get_link_ids(name_1, link_map, model_map) + model_2, link_2 = self._get_link_ids(name_2, link_map, model_map) + + self._contact_name_map[contact] = (model_1, model_2, link_1, link_2) + self._add_contact(model_1, model_2, link_1, link_2) + + def compute_contacts(self): + if len(self._contact_list) == 0: + return + + self._reset_computed_contacts() + for contact in self._contact_list: + model_a, model_b = contact[0] + contacts_points = self._client.getContactPoints(model_a, model_b) + + for contact_p in contacts_points: + involved_links = contact_p[3:5] + if involved_links in contact[1]: + self._computed_contacts[model_a][model_b][contact_p[3]][contact_p[4]] = contact_p + + def get_contact(self, contact_name): + model_1, model_2, link_1, link_2 = self._order_contact(*self._contact_name_map[contact_name]) + return self._computed_contacts[model_1][model_2][link_1][link_2] + + def _add_contact(self, model_1, model_2, link_1, link_2): + model_a, model_b, link_a, link_b = self._order_contact(model_1, model_2, link_1, link_2) + + done = False + for contact in self._contact_list: + models = contact[0] + links_list = contact[1] + if models == (model_a, model_b): + exists = False + for links in links_list: + if (link_a, link_b) == links: + exists = True + break + if not exists: + links_list.append((link_a, link_b)) + done = True + break + + if not done: + contact = ((model_a, model_b), [(link_a, link_b)]) + self._contact_list.append(contact) + + def _reset_computed_contacts(self): + for contact in self._contact_name_map.values(): + model_a, model_b, link_a, link_b = self._order_contact(*contact) + + if model_a not in self._computed_contacts: + self._computed_contacts[model_a] = dict() + if model_b not in self._computed_contacts[model_a]: + self._computed_contacts[model_a][model_b] = dict() + if link_a not in self._computed_contacts[model_a][model_b]: + self._computed_contacts[model_a][model_b][link_a] = dict() + self._computed_contacts[model_a][model_b][link_a][link_b] = None + + @staticmethod + def _get_link_ids(name, link_map, model_map): + if name in link_map: + return link_map[name] + else: + return model_map[name], -1 + + @staticmethod + def _order_contact(model_1, model_2, link_1, link_2): + if model_1 < model_2: + model_a = model_1 + link_a = link_1 + model_b = model_2 + link_b = link_2 + else: + model_a = model_2 + link_a = link_2 + model_b = model_1 + link_b = link_1 + + return model_a, model_b, link_a, link_b diff --git a/mushroom_rl/utils/pybullet/index_map.py b/mushroom_rl/utils/pybullet/index_map.py new file mode 100644 index 00000000..afd21539 --- /dev/null +++ b/mushroom_rl/utils/pybullet/index_map.py @@ -0,0 +1,189 @@ +import numpy as np +import pybullet +from .observation import PyBulletObservationType +from .contacts import ContactHelper + + +class IndexMap(object): + def __init__(self, client, model_map, actuation_spec, observation_spec): + self._client = client + self.model_map = model_map + self.joint_map = dict() + self.link_map = dict() + + self._build_joint_and_link_maps() + + # Contact utils + contact_types = [PyBulletObservationType.CONTACT_FLAG] + contacts = [obs[0] for obs in observation_spec if obs[1] in contact_types] + self._contacts = ContactHelper(client, contacts, self.model_map, self.link_map) + + # Read the actuation spec and build the mapping between actions and ids as well as their limits + self.action_data = list() + self._action_low, self._action_high = self._process_actuation_spec(actuation_spec) + + # Read the observation spec to build a mapping at every step. + # It is ensured that the values appear in the order they are specified. + self.observation_map = observation_spec + self.observation_indices_map = dict() + + # We can only specify limits for the joints, all other information can be potentially unbounded + self._observation_low, self._observation_high = self._process_observations() + + def create_sim_state(self): + data_obs = list() + + self._contacts.compute_contacts() + + for name, obs_type in self.observation_map: + if obs_type is PyBulletObservationType.BODY_POS \ + or obs_type is PyBulletObservationType.BODY_LIN_VEL \ + or obs_type is PyBulletObservationType.BODY_ANG_VEL: + model_id = self.model_map[name] + if obs_type is PyBulletObservationType.BODY_POS: + t, q = self._client.getBasePositionAndOrientation(model_id) + data_obs += t + q + else: + v, w = self._client.getBaseVelocity(model_id) + if obs_type is PyBulletObservationType.BODY_LIN_VEL: + data_obs += v + else: + data_obs += w + elif obs_type is PyBulletObservationType.LINK_POS \ + or obs_type is PyBulletObservationType.LINK_LIN_VEL \ + or obs_type is PyBulletObservationType.LINK_ANG_VEL: + model_id, link_id = self.link_map[name] + + if obs_type is PyBulletObservationType.LINK_POS: + link_data = self._client.getLinkState(model_id, link_id) + t = link_data[0] + q = link_data[1] + data_obs += t + q + elif obs_type is PyBulletObservationType.LINK_LIN_VEL: + data_obs += self._client.getLinkState(model_id, link_id, computeLinkVelocity=True)[-2] + elif obs_type is PyBulletObservationType.LINK_ANG_VEL: + data_obs += self._client.getLinkState(model_id, link_id, computeLinkVelocity=True)[-1] + elif obs_type is PyBulletObservationType.JOINT_POS \ + or obs_type is PyBulletObservationType.JOINT_VEL: + model_id, joint_id = self.joint_map[name] + pos, vel, _, _ = self._client.getJointState(model_id, joint_id) + if obs_type is PyBulletObservationType.JOINT_POS: + data_obs.append(pos) + elif obs_type is PyBulletObservationType.JOINT_VEL: + data_obs.append(vel) + elif obs_type is PyBulletObservationType.CONTACT_FLAG: + contact = self._contacts.get_contact(name) + contact_flag = 0 if contact is None else 1 + data_obs.append(contact_flag) + + return np.array(data_obs) + + def apply_control(self, action): + + i = 0 + for model_id, joint_id, mode in self.action_data: + u = action[i] + if mode is pybullet.POSITION_CONTROL: + kwargs = dict(targetPosition=u, maxVelocity=self._client.getJointInfo(model_id, joint_id)[11]) + elif mode is pybullet.VELOCITY_CONTROL: + kwargs = dict(targetVelocity=u, maxVelocity=self._client.getJointInfo(model_id, joint_id)[11]) + elif mode is pybullet.TORQUE_CONTROL: + kwargs = dict(force=u) + else: + raise NotImplementedError + + self._client.setJointMotorControl2(model_id, joint_id, mode, **kwargs) + i += 1 + + def get_index(self, name, obs_type): + return self.observation_indices_map[name][obs_type] + + def _build_joint_and_link_maps(self): + for model_id in self.model_map.values(): + for joint_id in range(self._client.getNumJoints(model_id)): + joint_data = self._client.getJointInfo(model_id, joint_id) + + if joint_data[2] != pybullet.JOINT_FIXED: + joint_name = joint_data[1].decode('UTF-8') + self.joint_map[joint_name] = (model_id, joint_id) + link_name = joint_data[12].decode('UTF-8') + self.link_map[link_name] = (model_id, joint_id) + + def _process_actuation_spec(self, actuation_spec): + for name, mode in actuation_spec: + if name in self.joint_map: + data = self.joint_map[name] + (mode,) + self.action_data.append(data) + + low = list() + high = list() + + for model_id, joint_id, mode in self.action_data: + joint_info = self._client.getJointInfo(model_id, joint_id) + if mode is pybullet.POSITION_CONTROL: + low.append(joint_info[8]) + high.append(joint_info[9]) + elif mode is pybullet.VELOCITY_CONTROL: + low.append(-joint_info[11]) + high.append(joint_info[11]) + elif mode is pybullet.TORQUE_CONTROL: + low.append(-joint_info[10]) + high.append(joint_info[10]) + else: + raise NotImplementedError + + return np.array(low), np.array(high) + + def _process_observations(self): + low = list() + high = list() + + for name, obs_type in self.observation_map: + index_count = len(low) + if obs_type is PyBulletObservationType.BODY_POS \ + or obs_type is PyBulletObservationType.BODY_LIN_VEL \ + or obs_type is PyBulletObservationType.BODY_ANG_VEL: + n_dim = 7 if obs_type is PyBulletObservationType.BODY_POS else 3 + low += [-np.inf] * n_dim + high += [np.inf] * n_dim + elif obs_type is PyBulletObservationType.LINK_POS \ + or obs_type is PyBulletObservationType.LINK_LIN_VEL \ + or obs_type is PyBulletObservationType.LINK_ANG_VEL: + n_dim = 7 if obs_type is PyBulletObservationType.LINK_POS else 3 + low += [-np.inf] * n_dim + high += [np.inf] * n_dim + elif obs_type is PyBulletObservationType.JOINT_POS \ + or obs_type is PyBulletObservationType.JOINT_VEL: + model_id, joint_id = self.joint_map[name] + joint_info = self._client.getJointInfo(model_id, joint_id) + + if obs_type is PyBulletObservationType.JOINT_POS: + low.append(joint_info[8]) + high.append(joint_info[9]) + else: + max_joint_vel = joint_info[11] + low.append(-max_joint_vel) + high.append(max_joint_vel) + elif obs_type is PyBulletObservationType.CONTACT_FLAG: + low.append(0.) + high.append(1.) + else: + raise RuntimeError('Unsupported observation type') + + self._add_observation_index(name, obs_type, index_count, len(low)) + + return np.array(low), np.array(high) + + def _add_observation_index(self, name, obs_type, start, end): + if name not in self.observation_indices_map: + self.observation_indices_map[name] = dict() + + self.observation_indices_map[name][obs_type] = list(range(start, end)) + + @property + def observation_limits(self): + return self._observation_low, self._observation_high + + @property + def action_limits(self): + return self._action_low, self._action_high \ No newline at end of file diff --git a/mushroom_rl/utils/pybullet/joints_helper.py b/mushroom_rl/utils/pybullet/joints_helper.py new file mode 100644 index 00000000..7d096c77 --- /dev/null +++ b/mushroom_rl/utils/pybullet/joints_helper.py @@ -0,0 +1,44 @@ +import numpy as np + +from .observation import PyBulletObservationType + + +class JointsHelper(object): + def __init__(self, client, indexer, observation_spec): + self._joint_pos_indexes = list() + self._joint_velocity_indexes = list() + joint_limits_low = list() + joint_limits_high = list() + joint_velocity_limits = list() + for joint_name, obs_type in observation_spec: + joint_idx = indexer.get_index(joint_name, obs_type) + if obs_type == PyBulletObservationType.JOINT_VEL: + self._joint_velocity_indexes.append(joint_idx[0]) + + model_id, joint_id = indexer.joint_map[joint_name] + joint_info = client.getJointInfo(model_id, joint_id) + joint_velocity_limits.append(joint_info[11]) + + elif obs_type == PyBulletObservationType.JOINT_POS: + self._joint_pos_indexes.append(joint_idx[0]) + + model_id, joint_id = indexer.joint_map[joint_name] + joint_info = client.getJointInfo(model_id, joint_id) + joint_limits_low.append(joint_info[8]) + joint_limits_high.append(joint_info[9]) + + self._joint_limits_low = np.array(joint_limits_low) + self._joint_limits_high = np.array(joint_limits_high) + self._joint_velocity_limits = np.array(joint_velocity_limits) + + def positions(self, state): + return state[self._joint_pos_indexes] + + def velocities(self, state): + return state[self._joint_velocity_indexes] + + def limits(self): + return self._joint_limits_low, self._joint_limits_high + + def velocity_limits(self): + return self._joint_velocity_limits diff --git a/mushroom_rl/utils/pybullet/observation.py b/mushroom_rl/utils/pybullet/observation.py new file mode 100644 index 00000000..32082927 --- /dev/null +++ b/mushroom_rl/utils/pybullet/observation.py @@ -0,0 +1,19 @@ +from enum import Enum + + +class PyBulletObservationType(Enum): + """ + An enum indicating the type of data that should be added to the observation + of the environment, can be Joint-/Body-/Site- positions and velocities. + + """ + __order__ = "BODY_POS BODY_LIN_VEL BODY_ANG_VEL JOINT_POS JOINT_VEL LINK_POS LINK_LIN_VEL LINK_ANG_VEL CONTACT_FLAG" + BODY_POS = 0 + BODY_LIN_VEL = 1 + BODY_ANG_VEL = 2 + JOINT_POS = 3 + JOINT_VEL = 4 + LINK_POS = 5 + LINK_LIN_VEL = 6 + LINK_ANG_VEL = 7 + CONTACT_FLAG = 8 \ No newline at end of file diff --git a/mushroom_rl/utils/pybullet/viewer.py b/mushroom_rl/utils/pybullet/viewer.py new file mode 100644 index 00000000..d66ac72f --- /dev/null +++ b/mushroom_rl/utils/pybullet/viewer.py @@ -0,0 +1,41 @@ +import numpy as np +import pybullet +from mushroom_rl.utils.viewer import ImageViewer + + +class PyBulletViewer(ImageViewer): + def __init__(self, client, dt, size=(500, 500), distance=4, origin=(0, 0, 1), angles=(0, -45, 60), + fov=60, aspect=1, near_val=0.01, far_val=100): + self._client = client + self._size = size + self._distance = distance + self._origin = origin + self._angles = angles + self._fov = fov + self._aspect = aspect + self._near_val = near_val + self._far_val = far_val + super().__init__(size, dt) + + def display(self): + img = self._get_image() + super().display(img) + + def _get_image(self): + view_matrix = self._client.computeViewMatrixFromYawPitchRoll(cameraTargetPosition=self._origin, + distance=self._distance, + roll=self._angles[0], + pitch=self._angles[1], + yaw=self._angles[2], + upAxisIndex=2) + proj_matrix = self._client.computeProjectionMatrixFOV(fov=self._fov, aspect=self._aspect, + nearVal=self._near_val, farVal=self._far_val) + (_, _, px, _, _) = self._client.getCameraImage(width=self._size[0], + height=self._size[1], + viewMatrix=view_matrix, + projectionMatrix=proj_matrix, + renderer=pybullet.ER_BULLET_HARDWARE_OPENGL) + + rgb_array = np.reshape(np.array(px), (self._size[0], self._size[1], -1)) + rgb_array = rgb_array[:, :, :3] + return rgb_array diff --git a/tests/algorithms/test_policy_gradient.py b/tests/algorithms/test_policy_gradient.py index bdcc5796..9e413a66 100644 --- a/tests/algorithms/test_policy_gradient.py +++ b/tests/algorithms/test_policy_gradient.py @@ -72,7 +72,7 @@ def test_REINFORCE_save(tmpdir): def test_GPOMDP(): params = dict(optimizer=AdaptiveOptimizer(eps=.01)) policy = learn(GPOMDP, params).policy - w = np.array([-0.07623939, 2.05232858]) + w = np.array([-0.11457566, 1.99784316]) assert np.allclose(w, policy.get_weights())