From dd30d3a2783f068fced154d66fe94cb1b0ce7056 Mon Sep 17 00:00:00 2001 From: Jheel19 Date: Sat, 20 Jul 2024 00:19:27 +0530 Subject: [PATCH] Webots simulation --- .../robot_supervisor_controller/PPO_agent.py | 220 +++++++++++++++++ .../__pycache__/PPO_agent.cpython-312.pyc | Bin 0 -> 12466 bytes .../__pycache__/utilities.cpython-312.pyc | Bin 0 -> 1264 bytes .../robot_supervisor_controller.py | 161 +++++++++++++ .../robot_supervisor_controller/utilities.py | 25 ++ .../worlds/.cart pole final.jpg | Bin 0 -> 56999 bytes .../worlds/.cart pole final.wbproj | 9 + Cartpole simulation/worlds/.cart pole.jpg | Bin 0 -> 59781 bytes Cartpole simulation/worlds/.cart pole.wbproj | 10 + .../worlds/cart pole final.wbt | 226 ++++++++++++++++++ Cartpole simulation/worlds/cart pole.wbt | 226 ++++++++++++++++++ 11 files changed, 877 insertions(+) create mode 100644 Cartpole simulation/controllers/robot_supervisor_controller/PPO_agent.py create mode 100644 Cartpole simulation/controllers/robot_supervisor_controller/__pycache__/PPO_agent.cpython-312.pyc create mode 100644 Cartpole simulation/controllers/robot_supervisor_controller/__pycache__/utilities.cpython-312.pyc create mode 100644 Cartpole simulation/controllers/robot_supervisor_controller/robot_supervisor_controller.py create mode 100644 Cartpole simulation/controllers/robot_supervisor_controller/utilities.py create mode 100644 Cartpole simulation/worlds/.cart pole final.jpg create mode 100644 Cartpole simulation/worlds/.cart pole final.wbproj create mode 100644 Cartpole simulation/worlds/.cart pole.jpg create mode 100644 Cartpole simulation/worlds/.cart pole.wbproj create mode 100644 Cartpole simulation/worlds/cart pole final.wbt create mode 100644 Cartpole simulation/worlds/cart pole.wbt diff --git a/Cartpole simulation/controllers/robot_supervisor_controller/PPO_agent.py b/Cartpole simulation/controllers/robot_supervisor_controller/PPO_agent.py new file mode 100644 index 0000000..9450135 --- /dev/null +++ b/Cartpole simulation/controllers/robot_supervisor_controller/PPO_agent.py @@ -0,0 +1,220 @@ +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.distributions import Categorical +from torch import from_numpy, no_grad, save, load, tensor, clamp +from torch import float as torch_float +from torch import long as torch_long +from torch import min as torch_min +from torch.utils.data.sampler import BatchSampler, SubsetRandomSampler +import numpy as np +from torch import manual_seed +from collections import namedtuple + +Transition = namedtuple('Transition', ['state', 'action', 'a_log_prob', 'reward', 'next_state']) + + +class PPOAgent: + """ + PPOAgent implements the PPO RL algorithm (https://arxiv.org/abs/1707.06347). + It works with a set of discrete actions. + It uses the Actor and Critic neural network classes defined below. + """ + + def __init__(self, number_of_inputs, number_of_actor_outputs, clip_param=0.2, max_grad_norm=0.5, ppo_update_iters=5, + batch_size=8, gamma=0.99, use_cuda=False, actor_lr=0.001, critic_lr=0.003, seed=None): + super().__init__() + if seed is not None: + manual_seed(seed) + + # Hyper-parameters + self.clip_param = clip_param + self.max_grad_norm = max_grad_norm + self.ppo_update_iters = ppo_update_iters + self.batch_size = batch_size + self.gamma = gamma + self.use_cuda = use_cuda + + # models + self.actor_net = Actor(number_of_inputs, number_of_actor_outputs) + self.critic_net = Critic(number_of_inputs) + + if self.use_cuda: + self.actor_net.cuda() + self.critic_net.cuda() + + # Create the optimizers + self.actor_optimizer = optim.Adam(self.actor_net.parameters(), actor_lr) + self.critic_net_optimizer = optim.Adam(self.critic_net.parameters(), critic_lr) + + # Training stats + self.buffer = [] + + def work(self, agent_input, type_="simple"): + """ + type_ == "simple" + Implementation for a simple forward pass. + type_ == "selectAction" + Implementation for the forward pass, that returns a selected action according to the probability + distribution and its probability. + type_ == "selectActionMax" + Implementation for the forward pass, that returns the max selected action. + """ + agent_input = from_numpy(np.array(agent_input)).float().unsqueeze(0) # Add batch dimension with unsqueeze + if self.use_cuda: + agent_input = agent_input.cuda() + with no_grad(): + action_prob = self.actor_net(agent_input) + + if type_ == "simple": + output = [action_prob[0][i].data.tolist() for i in range(len(action_prob[0]))] + return output + elif type_ == "selectAction": + c = Categorical(action_prob) + action = c.sample() + return action.item(), action_prob[:, action.item()].item() + elif type_ == "selectActionMax": + return np.argmax(action_prob).item(), 1.0 + else: + raise Exception("Wrong type in agent.work(), returning input") + + def get_value(self, state): + """ + Gets the value of the current state according to the critic model. + + :param state: The current state + :return: state's value + """ + state = from_numpy(state) + with no_grad(): + value = self.critic_net(state) + return value.item() + + def save(self, path): + """ + Save actor and critic models in the path provided. + + :param path: path to save the models + :type path: str + """ + save(self.actor_net.state_dict(), path + '_actor.pkl') + save(self.critic_net.state_dict(), path + '_critic.pkl') + + def load(self, path): + """ + Load actor and critic models from the path provided. + + :param path: path where the models are saved + :type path: str + """ + actor_state_dict = load(path + '_actor.pkl') + critic_state_dict = load(path + '_critic.pkl') + self.actor_net.load_state_dict(actor_state_dict) + self.critic_net.load_state_dict(critic_state_dict) + + def store_transition(self, transition): + """ + Stores a transition in the buffer to be used later. + + :param transition: contains state, action, action_prob, reward, next_state + :type transition: namedtuple('Transition', ['state', 'action', 'a_log_prob', 'reward', 'next_state']) + """ + self.buffer.append(transition) + + def train_step(self, batch_size=None): + """ + Performs a training step or update for the actor and critic models, based on transitions gathered in the + buffer. It then resets the buffer. + If provided with a batch_size, this is used instead of default self.batch_size + + :param: batch_size: int + :return: None + """ + # Default behaviour waits for buffer to collect at least one batch_size of transitions + if batch_size is None: + if len(self.buffer) < self.batch_size: + return + batch_size = self.batch_size + + # Extract states, actions, rewards and action probabilities from transitions in buffer + state = tensor([t.state for t in self.buffer], dtype=torch_float) + action = tensor([t.action for t in self.buffer], dtype=torch_long).view(-1, 1) + reward = [t.reward for t in self.buffer] + old_action_log_prob = tensor([t.a_log_prob for t in self.buffer], dtype=torch_float).view(-1, 1) + + # Unroll rewards + R = 0 + Gt = [] + for r in reward[::-1]: + R = r + self.gamma * R + Gt.insert(0, R) + Gt = tensor(Gt, dtype=torch_float) + + # Send everything to cuda if used + if self.use_cuda: + state, action, old_action_log_prob = state.cuda(), action.cuda(), old_action_log_prob.cuda() + Gt = Gt.cuda() + + # Repeat the update procedure for ppo_update_iters + for _ in range(self.ppo_update_iters): + # Create randomly ordered batches of size batch_size from buffer + for index in BatchSampler(SubsetRandomSampler(range(len(self.buffer))), batch_size, False): + # Calculate the advantage at each step + Gt_index = Gt[index].view(-1, 1) + V = self.critic_net(state[index]) + delta = Gt_index - V + advantage = delta.detach() + + # Get the current probabilities + # Apply past actions with .gather() + action_prob = self.actor_net(state[index]).gather(1, action[index]) # new policy + + # PPO + ratio = (action_prob / old_action_log_prob[index]) # Ratio between current and old policy probabilities + surr1 = ratio * advantage + surr2 = clamp(ratio, 1 - self.clip_param, 1 + self.clip_param) * advantage + + # update actor network + action_loss = -torch_min(surr1, surr2).mean() # MAX->MIN descent + self.actor_optimizer.zero_grad() # Delete old gradients + action_loss.backward() # Perform backward step to compute new gradients + nn.utils.clip_grad_norm_(self.actor_net.parameters(), self.max_grad_norm) # Clip gradients + self.actor_optimizer.step() # Perform training step based on gradients + + # update critic network + value_loss = F.mse_loss(Gt_index, V) + self.critic_net_optimizer.zero_grad() + value_loss.backward() + nn.utils.clip_grad_norm_(self.critic_net.parameters(), self.max_grad_norm) + self.critic_net_optimizer.step() + + # After each training step, the buffer is cleared + del self.buffer[:] + + +class Actor(nn.Module): + def __init__(self, number_of_inputs, number_of_outputs): + super(Actor, self).__init__() + self.fc1 = nn.Linear(number_of_inputs, 10) + self.fc2 = nn.Linear(10, 10) + self.action_head = nn.Linear(10, number_of_outputs) + + def forward(self, x): + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + action_prob = F.softmax(self.action_head(x), dim=1) + return action_prob + + +class Critic(nn.Module): + def __init__(self, number_of_inputs): + super(Critic, self).__init__() + self.fc1 = nn.Linear(number_of_inputs, 10) + self.fc2 = nn.Linear(10, 10) + self.state_value = nn.Linear(10, 1) + + def forward(self, x): + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + value = self.state_value(x) + return value diff --git a/Cartpole simulation/controllers/robot_supervisor_controller/__pycache__/PPO_agent.cpython-312.pyc b/Cartpole simulation/controllers/robot_supervisor_controller/__pycache__/PPO_agent.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5991a5a3b73dafeed60f04def2a871f408cf32ae GIT binary patch literal 12466 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 literal 0 HcmV?d00001 diff --git a/Cartpole simulation/controllers/robot_supervisor_controller/__pycache__/utilities.cpython-312.pyc b/Cartpole simulation/controllers/robot_supervisor_controller/__pycache__/utilities.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10c9ad4cf7a3ecb8961f5786774cf90a3ba0c7ce GIT binary patch literal 1264 zcmb7EPe>F|7@yghbwyiOtyqt*L&<^&L8L8FLD^nJ50-*$PUG%#9h-l?nc06#AZ-WD zL*DdghoF!k=whAhCUn`M+hkDfsY?XfrBmOVncW>BqCVL7e((2w-=FvGd-FaX?_$7; zRes?u$1n}LXj&uyho=B+GI=J?%FHaA=kk$9>};gMruc7EGLh>Dlyr*14Z%0YWq}e@N;+v>F+q}(H;mmf#X6an* z1`I0?L+v(S1+mT9{7w*O3b=pqnPO6`^$CvHg}^2>qKL9o#i%IC7DlFqL}chVCoM=g zk5pVjL{tkH%~z0N>AGBz)B-XWG0ItlVAb@uhr7IJXiT&jRjExAeISzD+V3tEkWq#eSp`~+1mytM)uPA z(UFVUNfqB9QW0kxwYA2>myO!9M(t^%_PSA9%_}r0nK>spSHD-N zOZtbza=ml;b8m8M(CIz1U3e99&W$*U(cQ7V%$rFkF}`1N64Uk0=|iXn9@S0SbJbGx x3ZWktui6(3>7n=p48J-rD_Y)?@fFesOZt&9=;jZOW!aBR|53+jc82xzzX5ZcZ*u?u literal 0 HcmV?d00001 diff --git a/Cartpole simulation/controllers/robot_supervisor_controller/robot_supervisor_controller.py b/Cartpole simulation/controllers/robot_supervisor_controller/robot_supervisor_controller.py new file mode 100644 index 0000000..81954d8 --- /dev/null +++ b/Cartpole simulation/controllers/robot_supervisor_controller/robot_supervisor_controller.py @@ -0,0 +1,161 @@ +from deepbots.supervisor.controllers.robot_supervisor_env import RobotSupervisorEnv +from utilities import normalize_to_range +from PPO_agent import PPOAgent, Transition + +from gym.spaces import Box, Discrete +import numpy as np + + +class CartpoleRobot(RobotSupervisorEnv): + def __init__(self): + super().__init__() + # Define agent's observation space using Gym's Box, setting the lowest and highest possible values + self.observation_space = Box(low=np.array([-0.4, -np.inf, -1.3, -np.inf]), + high=np.array([0.4, np.inf, 1.3, np.inf]), + dtype=np.float64) + # Define agent's action space using Gym's Discrete + self.action_space = Discrete(2) + + self.robot = self.getSelf() # Grab the robot reference from the supervisor to access various robot methods + self.position_sensor = self.getDevice("polePosSensor") + self.position_sensor.enable(self.timestep) + + self.pole_endpoint = self.getFromDef("POLE_ENDPOINT") + self.wheels = [] + for wheel_name in ['wheel1', 'wheel2', 'wheel3', 'wheel4']: + wheel = self.getDevice(wheel_name) # Get the wheel handle + wheel.setPosition(float('inf')) # Set starting position + wheel.setVelocity(0.0) # Zero out starting velocity + self.wheels.append(wheel) + self.steps_per_episode = 200 # Max number of steps per episode + self.episode_score = 0 # Score accumulated during an episode + self.episode_score_list = [] # A list to save all the episode scores, used to check if task is solved + + def get_observations(self): + # Position on x-axis + cart_position = normalize_to_range(self.robot.getPosition()[0], -0.4, 0.4, -1.0, 1.0) + # Linear velocity on x-axis + cart_velocity = normalize_to_range(self.robot.getVelocity()[0], -0.2, 0.2, -1.0, 1.0, clip=True) + # Pole angle off vertical + pole_angle = normalize_to_range(self.position_sensor.getValue(), -0.23, 0.23, -1.0, 1.0, clip=True) + # Angular velocity y of endpoint + endpoint_velocity = normalize_to_range(self.pole_endpoint.getVelocity()[4], -1.5, 1.5, -1.0, 1.0, clip=True) + + return [cart_position, cart_velocity, pole_angle, endpoint_velocity] + + def get_default_observation(self): + # This method just returns a zero vector as a default observation + return [0.0 for _ in range(self.observation_space.shape[0])] + + def get_reward(self, action=None): + # Reward is +1 for every step the episode hasn't ended + return 1 + + def is_done(self): + if self.episode_score > 195.0: + return True + + pole_angle = round(self.position_sensor.getValue(), 2) + if abs(pole_angle) > 0.261799388: # more than 15 degrees off vertical (defined in radians) + return True + + cart_position = round(self.robot.getPosition()[0], 2) # Position on x-axis + if abs(cart_position) > 0.39: + return True + + return False + + def solved(self): + if len(self.episode_score_list) > 100: # Over 100 trials thus far + if np.mean(self.episode_score_list[-100:]) > 195.0: # Last 100 episodes' scores average value + return True + return False + + def get_info(self): + return None + + def render(self, mode='human'): + pass + + def apply_action(self, action): + action = int(action[0]) + + if action == 0: + motor_speed = 5.0 + else: + motor_speed = -5.0 + + for i in range(len(self.wheels)): + self.wheels[i].setPosition(float('inf')) + self.wheels[i].setVelocity(motor_speed) + + +env = CartpoleRobot() +agent = PPOAgent(number_of_inputs=env.observation_space.shape[0], number_of_actor_outputs=env.action_space.n) + +solved = False +episode_count = 0 +episode_limit = 2000 + +# Run outer loop until the episodes limit is reached or the task is solved +while not solved and episode_count < episode_limit: + observation = env.reset() # Reset robot and get starting observation + env.episode_score = 0 + + for step in range(env.steps_per_episode): + # In training mode the agent samples from the probability distribution, naturally implementing exploration + selected_action, action_prob = agent.work(observation, type_="selectAction") + # Step the supervisor to get the current selected_action's reward, the new observation and whether we reached + # the done condition + new_observation, reward, done, info = env.step([selected_action]) + + # Save the current state transition in agent's memory + trans = Transition(observation, selected_action, action_prob, reward, new_observation) + agent.store_transition(trans) + + if done: + # Save the episode's score + env.episode_score_list.append(env.episode_score) + agent.train_step(batch_size=step + 1) + solved = env.solved() # Check whether the task is solved + break + + env.episode_score += reward # Accumulate episode reward + observation = new_observation # observation for next step is current step's new_observation + + print("Episode #", episode_count, "score:", env.episode_score) + episode_count += 1 # Increment episode counter + +if not solved: + print("Task is not solved, deploying agent for testing...") +elif solved: + print("Task is solved, deploying agent for testing..." , env.episode_score_list) + +observation = env.reset() +env.episode_score = 0.0 +while True: + selected_action, action_prob = agent.work(observation, type_="selectActionMax") + observation, _, done, _ = env.step([selected_action]) + if done: + observation = env.reset() + +# final_actor_parameters = agent.Actor.get_weights() +# final_critic_parameters = agent.Critic.get_weights() + +# Assuming you want to save these parameters to a file for future use or analysis +# np.save("final_actor_parameters.npy", final_actor_parameters) +# np.save("final_critic_parameters.npy", final_critic_parameters) +# Load the saved parameters +# final_actor_parameters_loaded = np.load("final_actor_parameters.npy", allow_pickle=True) +# final_critic_parameters_loaded = np.load("final_critic_parameters.npy", allow_pickle=True) + +# Print the shapes of the loaded parameters +# print("Final actor parameters shape:", final_actor_parameters_loaded.shape) +# print("Final critic parameters shape:", final_critic_parameters_loaded.shape) + +# Print the loaded parameters +# print("Final actor parameters:") +# print(final_actor_parameters_loaded) + +# print("\nFinal critic parameters:") +# print(final_critic_parameters_loaded) diff --git a/Cartpole simulation/controllers/robot_supervisor_controller/utilities.py b/Cartpole simulation/controllers/robot_supervisor_controller/utilities.py new file mode 100644 index 0000000..c7b99d2 --- /dev/null +++ b/Cartpole simulation/controllers/robot_supervisor_controller/utilities.py @@ -0,0 +1,25 @@ +import numpy as np + + +def normalize_to_range(value, min_val, max_val, new_min, new_max, clip=False): + """ + Normalize value to a specified new range by supplying the current range. + + :param value: value to be normalized + :param min_val: value's min value, value ∈ [min_val, max_val] + :param max_val: value's max value, value ∈ [min_val, max_val] + :param new_min: normalized range min value + :param new_max: normalized range max value + :param clip: whether to clip normalized value to new range or not + :return: normalized value ∈ [new_min, new_max] + """ + value = float(value) + min_val = float(min_val) + max_val = float(max_val) + new_min = float(new_min) + new_max = float(new_max) + + if clip: + return np.clip((new_max - new_min) / (max_val - min_val) * (value - max_val) + new_max, new_min, new_max) + else: + return (new_max - new_min) / (max_val - min_val) * (value - max_val) + new_max diff --git a/Cartpole simulation/worlds/.cart pole final.jpg b/Cartpole simulation/worlds/.cart pole final.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0dc86e512b3dc835257720d7779a3230d55c7a91 GIT binary patch literal 56999 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 T=FD>ZpyQbD=~I@ezd!yDw$P2N literal 0 HcmV?d00001 diff --git a/Cartpole simulation/worlds/.cart pole.wbproj b/Cartpole simulation/worlds/.cart pole.wbproj new file mode 100644 index 0000000..a595b78 --- /dev/null +++ b/Cartpole simulation/worlds/.cart pole.wbproj @@ -0,0 +1,10 @@ +Webots Project File version R2023b +perspectives: 000000ff00000000fd0000000200000001000001fc000002fbfc0200000001fb0000001400540065007800740045006400690074006f0072010000001e000002fb0000009300ffffff0000000300000780000000defc0100000001fb0000001a0043006f006e0073006f006c00650041006c006c0041006c006c0100000000000007800000006900ffffff00000582000002fb00000001000000020000000100000008fc00000000 +simulationViewPerspectives: 000000ff00000001000000020000013e000005240100000002010000000100 +sceneTreePerspectives: 000000ff000000010000000300000026000000c0000000fa0100000002010000000200 +minimizedPerspectives: 000000ff00000000fd00000001000000010000016e000003dbfc0200000001fc0000001e000003db000000b901000025fa000000000100000002fb0000001a0043006f006e0073006f006c00650041006c006c0041006c006c0100000000ffffffff0000006900fffffffb0000001400540065007800740045006400690074006f007201000006120000016e0000007700ffffff00000610000003db00000001000000020000000100000008fc00000000 +maximizedDockId: -1 +centralWidgetVisible: 1 +orthographicViewHeight: 1 +textFiles: 0 "controllers/robot_supervisor_controller/robot_supervisor_controller.py" +consoles: Console:All:All diff --git a/Cartpole simulation/worlds/cart pole final.wbt b/Cartpole simulation/worlds/cart pole final.wbt new file mode 100644 index 0000000..da106c3 --- /dev/null +++ b/Cartpole simulation/worlds/cart pole final.wbt @@ -0,0 +1,226 @@ +#VRML_SIM R2023b utf8 + +EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023b/projects/objects/backgrounds/protos/TexturedBackground.proto" +EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023b/projects/objects/backgrounds/protos/TexturedBackgroundLight.proto" +EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023b/projects/objects/floors/protos/RectangleArena.proto" + +WorldInfo { +} +Viewpoint { + orientation -0.32730664950095556 0.3604312365867326 0.8734756326795943 1.60966653012283 + position -0.408227532341093 -7.216605670296964 4.707246747148011 +} +TexturedBackground { +} +TexturedBackgroundLight { +} +RectangleArena { + floorSize 6 7 +} +DEF ROBOT Robot { + translation 0.09257651788962837 -1.972678605261608 0.039471399451226956 + rotation 0.999731915286195 -0.015940686848343228 -0.01679261924177948 1.5711005209410327 + children [ + DEF HINGE_COVER Solid { + translation 0 0.03 -3.469446951953614e-18 + rotation 0 1 0 -1.5707953071795862 + children [ + Shape { + appearance PBRAppearance { + baseColor 0 0.6509803921568628 1 + } + geometry Box { + size 0.030000000000000002 0.019999999999999997 0.05 + } + } + ] + name "hingeCover" + } + DEF BODY Shape { + appearance PBRAppearance { + baseColor 0.917647 0.145098 0.145098 + roughness 1 + metalness 0 + } + geometry Box { + size 0.2 0.05 0.08 + } + } + DEF WHEEL1 HingeJoint { + jointParameters HingeJointParameters { + position -25937.76197049255 + axis 0 0 1 + anchor 0.06 0 0.05 + } + device [ + RotationalMotor { + name "wheel1" + } + ] + endPoint Solid { + translation 0.060010071324414195 8.885043735261581e-06 0.050000010543824816 + rotation 1.767092318482182e-08 -4.192625930253737e-08 0.999999999999999 0.797777587791215 + children [ + DEF WHEEL Shape { + appearance PBRAppearance { + baseColor 0.305882 0.898039 0.25098 + roughness 1 + metalness 0 + } + geometry Cylinder { + height 0.02 + radius 0.04 + subdivision 24 + } + } + ] + boundingObject USE WHEEL + physics Physics { + } + linearVelocity -0.1347509737077112 0.006462373924541475 -0.002628514058932974 + angularVelocity -0.16159239226265323 -4.952763532827587 -1.6903758648252137e-05 + } + } + DEF WHEEL2 HingeJoint { + jointParameters HingeJointParameters { + position -25937.67378192782 + axis 0 0 1 + anchor -0.06 0 0.05 + } + device [ + RotationalMotor { + name "wheel2" + } + ] + endPoint Solid { + translation -0.06000036710654964 1.2831686112321726e-06 0.05000000952472374 + rotation 1.7609523273201465e-08 -3.7117876288131156e-08 0.9999999999999992 0.885966066500956 + children [ + USE WHEEL + ] + name "solid(1)" + boundingObject USE WHEEL + physics Physics { + } + linearVelocity -0.13471857965990697 0.006462509138896213 0.0025655890027489812 + angularVelocity -0.16159240282723167 -4.952763864824605 -1.6903794928912132e-05 + } + } + DEF WHEEL3 HingeJoint { + jointParameters HingeJointParameters { + position -25937.76185183187 + axis 0 0 1 + anchor 0.06 0 -0.05 + } + device [ + RotationalMotor { + name "wheel3" + } + ] + endPoint Solid { + translation 0.06001006958831937 8.886751027961752e-06 -0.05000000738328558 + rotation -1.7671225502077935e-08 4.192000384813852e-08 0.999999999999999 0.7978962484736103 + children [ + USE WHEEL + ] + name "solid(2)" + boundingObject USE WHEEL + physics Physics { + } + linearVelocity -0.1347499927806518 0.0064623637987592025 -0.002568203768056672 + angularVelocity -0.16159239138418666 -4.952763532986873 -1.6903788659716178e-05 + } + } + DEF WHEEL4 HingeJoint { + jointParameters HingeJointParameters { + position -25937.673634112387 + axis 0 0 1 + anchor -0.06 0 -0.05 + } + device [ + RotationalMotor { + name "wheel4" + } + ] + endPoint Solid { + translation -0.06000036802061397 1.283564723279628e-06 -0.05000000839401549 + rotation -1.7609877817193185e-08 3.71115398466415e-08 0.9999999999999991 0.8861138819345312 + children [ + USE WHEEL + ] + name "solid(3)" + boundingObject USE WHEEL + physics Physics { + } + linearVelocity -0.13471759356352747 0.006462498954678398 0.0026259026923046184 + angularVelocity -0.16159240194625607 -4.952763864993612 -1.6903824164435378e-05 + } + } + DEF POLE HingeJoint { + jointParameters HingeJointParameters { + position 0.0068548111429938535 + axis 0 0 1 + anchor 0 0.03000000000047226 0 + minStop -1.3 + maxStop 1.3 + } + device [ + DEF POLE_POS_SENSOR PositionSensor { + name "polePosSensor" + } + ] + endPoint Solid { + translation -0.0038929262485308353 0.5299888212033494 -5.369584240405452e-07 + rotation -0.5743490324970277 -0.5788448407672313 0.5788452635954505 2.098901346027397 + children [ + DEF POLE_ENDPOINT Solid { + translation 0.5000000000000002 0 0 + children [ + DEF BALL Shape { + appearance PBRAppearance { + baseColor 0.03137254901960784 0.047058823529411764 1 + metalness 0 + } + geometry Sphere { + radius 0.1 + } + } + ] + boundingObject USE BALL + physics Physics { + density -1 + mass 0.02 + } + } + DEF POLE Shape { + appearance PBRAppearance { + baseColor 1 0.1568627450980392 0.1568627450980392 + roughness 1 + metalness 0 + } + geometry Box { + size 1 0.020000000000000004 0.019999999999999997 + } + } + ] + name "pole" + boundingObject USE POLE + physics Physics { + density -1 + mass 0.2 + } + linearVelocity -0.034087939063273384 0.002811508564126967 0.0006577358334693077 + angularVelocity 0.006573764510785528 0.18192055763253784 -9.68527617225178e-06 + } + } + ] + boundingObject USE BODY + physics Physics { + density -1 + mass 2 + } + controller "robot_supervisor_controller" + supervisor TRUE + linearVelocity -0.13465255787327102 0.006459420267273784 -2.6882452267955828e-05 + angularVelocity 0.0020747883777318277 0.04455406446858071 -9.577650352201203e-06 +} diff --git a/Cartpole simulation/worlds/cart pole.wbt b/Cartpole simulation/worlds/cart pole.wbt new file mode 100644 index 0000000..5ff43f0 --- /dev/null +++ b/Cartpole simulation/worlds/cart pole.wbt @@ -0,0 +1,226 @@ +#VRML_SIM R2023b utf8 + +EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023b/projects/objects/backgrounds/protos/TexturedBackground.proto" +EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023b/projects/objects/backgrounds/protos/TexturedBackgroundLight.proto" +EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023b/projects/objects/floors/protos/RectangleArena.proto" + +WorldInfo { +} +Viewpoint { + orientation -0.2528562466679153 0.26582802134873335 0.9302683384845643 1.593059440262344 + position -0.36187075201939056 -6.652441771026875 3.5946341848126413 +} +TexturedBackground { +} +TexturedBackgroundLight { +} +RectangleArena { + floorSize 6 7 +} +DEF ROBOT Robot { + translation -0.17263497135203973 -2.4904785526655506 0.03947799283119494 + rotation 0.9954334034464817 -0.06784901169962579 -0.06714797773826274 1.5752241093900121 + children [ + DEF HINGE_COVER Solid { + translation 0 0.03 -3.469446951953614e-18 + rotation 0 1 0 -1.5707953071795862 + children [ + Shape { + appearance PBRAppearance { + baseColor 0 0.6509803921568628 1 + } + geometry Box { + size 0.030000000000000002 0.019999999999999997 0.05 + } + } + ] + name "hingeCover" + } + DEF BODY Shape { + appearance PBRAppearance { + baseColor 0.917647 0.145098 0.145098 + roughness 1 + metalness 0 + } + geometry Box { + size 0.2 0.05 0.08 + } + } + DEF WHEEL1 HingeJoint { + jointParameters HingeJointParameters { + position -26240.322971938112 + axis 0 0 1 + anchor 0.06 0 0.05 + } + device [ + RotationalMotor { + name "wheel1" + } + ] + endPoint Solid { + translation 0.06001302865671588 -3.260319280472611e-06 0.050000010543824816 + rotation -1.767255671073001e-08 -2.069927352646998e-07 -0.9999999999999785 0.17032911315013582 + children [ + DEF WHEEL Shape { + appearance PBRAppearance { + baseColor 0.305882 0.898039 0.25098 + roughness 1 + metalness 0 + } + geometry Cylinder { + height 0.02 + radius 0.04 + subdivision 24 + } + } + ] + boundingObject USE WHEEL + physics Physics { + } + linearVelocity 0.137603337828954 -0.026636483046593135 0.0028057577389736348 + angularVelocity 0.6660340351131924 4.909082408004797 -0.00016961954046368707 + } + } + DEF WHEEL2 HingeJoint { + jointParameters HingeJointParameters { + position -26240.228519384247 + axis 0 0 1 + anchor -0.06 0 0.05 + } + device [ + RotationalMotor { + name "wheel2" + } + ] + endPoint Solid { + translation -0.05999915747321099 1.0351026583878904e-06 0.05000000952472374 + rotation -1.761288177761632e-08 -4.6394560610849096e-07 -0.9999999999998923 0.07587664530498538 + children [ + USE WHEEL + ] + name "solid(1)" + boundingObject USE WHEEL + physics Physics { + } + linearVelocity 0.13761978174614553 -0.02663568448868824 -0.0025387859700480215 + angularVelocity 0.6660339512948436 4.909082085456431 -0.00016962414685499442 + } + } + DEF WHEEL3 HingeJoint { + jointParameters HingeJointParameters { + position -26240.32271784413 + axis 0 0 1 + anchor 0.06 0 -0.05 + } + device [ + RotationalMotor { + name "wheel3" + } + ] + endPoint Solid { + translation 0.06001302952019581 -3.2561566638333596e-06 -0.05000000738328558 + rotation 1.7672811590474686e-08 2.073069373996707e-07 -0.9999999999999784 0.17007501916587 + children [ + USE WHEEL + ] + name "solid(2)" + boundingObject USE WHEEL + physics Physics { + } + linearVelocity 0.13760765581078696 -0.026636644252958645 0.00253751591078523 + angularVelocity 0.6660340491740365 4.9090823825524 -0.00016961921598020418 + } + } + DEF WHEEL4 HingeJoint { + jointParameters HingeJointParameters { + position -26240.228224221857 + axis 0 0 1 + anchor -0.06 0 -0.05 + } + device [ + RotationalMotor { + name "wheel4" + } + ] + endPoint Solid { + translation -0.05999915782382724 1.0362031001285853e-06 -0.05000000839401549 + rotation 1.7613244104743785e-08 4.6576852071899036e-07 -0.9999999999998914 0.07558148291529411 + children [ + USE WHEEL + ] + name "solid(3)" + boundingObject USE WHEEL + physics Physics { + } + linearVelocity 0.13762406833421179 -0.02663584512615485 -0.0028070231623932157 + angularVelocity 0.6660339653985637 4.909082060051224 -0.00016962480132096672 + } + } + DEF POLE HingeJoint { + jointParameters HingeJointParameters { + position 0.0003396631295334478 + axis 0 0 1 + anchor 0 0.03000000000047226 0 + minStop -1.3 + maxStop 1.3 + } + device [ + DEF POLE_POS_SENSOR PositionSensor { + name "polePosSensor" + } + ] + endPoint Solid { + translation -0.00048329903613630724 0.5569756051532191 2.329729554228643e-05 + rotation -0.5799301004972435 -0.5760558075972879 0.5760562342954839 2.0905282115323827 + children [ + DEF POLE_ENDPOINT Solid { + translation 0.5000000000000002 0 0 + children [ + DEF BALL Shape { + appearance PBRAppearance { + baseColor 0.03137254901960784 0.047058823529411764 1 + metalness 0 + } + geometry Sphere { + radius 0.1 + } + } + ] + boundingObject USE BALL + physics Physics { + density -1 + mass 0.02 + } + } + DEF POLE Shape { + appearance PBRAppearance { + baseColor 1 0.1568627450980392 0.1568627450980392 + roughness 1 + metalness 0 + } + geometry Box { + size 1 0.020000000000000004 0.019999999999999997 + } + } + ] + name "pole" + boundingObject USE POLE + physics Physics { + density -1 + mass 0.2 + } + linearVelocity 0.029197133493237208 -0.010200976283313153 7.923896363626188e-05 + angularVelocity -0.02822651849779103 -0.18692372894902887 -2.8988285542784134e-05 + } + } + ] + boundingObject USE BODY + physics Physics { + density -1 + mass 2 + } + controller "robot_supervisor_controller" + supervisor TRUE + linearVelocity 0.1375560919833146 -0.02662701260296723 3.3655832044132746e-05 + angularVelocity -0.008912192819659319 -0.04515020673151795 -3.241173592939213e-05 +}