├── .gitignore ├── images ├── assembly_1.png ├── assembly_2.png ├── three_cubes_1.png └── three_cubes_2.png ├── gym_gazebo_hsr ├── envs │ ├── __init__.py │ ├── assets │ │ ├── models │ │ │ ├── gear1.stl │ │ │ ├── gear2.stl │ │ │ ├── gear2_1.stl │ │ │ ├── shaft1.stl │ │ │ ├── shaft2.stl │ │ │ ├── base_plate.stl │ │ │ └── compound_gear.stl │ │ ├── launch │ │ │ ├── gazebo_hsr_assembly-v0.launch │ │ │ └── gazebo_hsr_three_cubes-v0.launch │ │ └── worlds │ │ │ ├── hsr_three_cubes.world │ │ │ └── hsr_assembly.world │ ├── gazebo_env.py │ └── gazebo_hsr_assembly_env.py └── __init__.py ├── examples ├── log.txt └── gazebo_hsr_assembly_v0.py ├── setup.py └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.egg-info 2 | *.pyc 3 | *.py~ 4 | .idea 5 | logs/ 6 | *~ 7 | log.txt 8 | -------------------------------------------------------------------------------- /images/assembly_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascane/gym-gazebo-hsr/HEAD/images/assembly_1.png -------------------------------------------------------------------------------- /images/assembly_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascane/gym-gazebo-hsr/HEAD/images/assembly_2.png -------------------------------------------------------------------------------- /images/three_cubes_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascane/gym-gazebo-hsr/HEAD/images/three_cubes_1.png -------------------------------------------------------------------------------- /images/three_cubes_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascane/gym-gazebo-hsr/HEAD/images/three_cubes_2.png -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/__init__.py: -------------------------------------------------------------------------------- 1 | from gym_gazebo_hsr.envs.gazebo_hsr_assembly_env import GazeboHsrAssemblyEnv 2 | -------------------------------------------------------------------------------- /examples/log.txt: -------------------------------------------------------------------------------- 1 | export ROS_MASTER_URI=http://localhost:11311 2 | export GAZEBO_MASTER_URI=http://localhost:10966 3 | -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/assets/models/gear1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascane/gym-gazebo-hsr/HEAD/gym_gazebo_hsr/envs/assets/models/gear1.stl -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/assets/models/gear2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascane/gym-gazebo-hsr/HEAD/gym_gazebo_hsr/envs/assets/models/gear2.stl -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/assets/models/gear2_1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascane/gym-gazebo-hsr/HEAD/gym_gazebo_hsr/envs/assets/models/gear2_1.stl -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/assets/models/shaft1.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascane/gym-gazebo-hsr/HEAD/gym_gazebo_hsr/envs/assets/models/shaft1.stl -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/assets/models/shaft2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascane/gym-gazebo-hsr/HEAD/gym_gazebo_hsr/envs/assets/models/shaft2.stl -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/assets/models/base_plate.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascane/gym-gazebo-hsr/HEAD/gym_gazebo_hsr/envs/assets/models/base_plate.stl -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/assets/models/compound_gear.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascane/gym-gazebo-hsr/HEAD/gym_gazebo_hsr/envs/assets/models/compound_gear.stl -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup(name='gym_gazebo_hsr', 4 | version='0.0.1', 5 | install_requires=['gym'], 6 | description='An OpenAI gym environment based on Gazebo and ROS for Human Support Robot (HSR)', 7 | url='https://github.com/ascane/gym-gazebo-hsr', 8 | author='Chia-Man Hung' 9 | ) 10 | -------------------------------------------------------------------------------- /gym_gazebo_hsr/__init__.py: -------------------------------------------------------------------------------- 1 | from gym.envs.registration import register 2 | 3 | register( 4 | id='gazebo-hsr-assembly-v0', 5 | entry_point='gym_gazebo_hsr.envs:GazeboHsrAssemblyEnv', 6 | ) 7 | 8 | register( 9 | id='gazebo-hsr-assembly-v1', 10 | entry_point='gym_gazebo_hsr.envs:GazeboHsrAssemblyEnv', 11 | max_episode_steps=100, 12 | ) 13 | -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/assets/launch/gazebo_hsr_assembly-v0.launch: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/assets/launch/gazebo_hsr_three_cubes-v0.launch: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /examples/gazebo_hsr_assembly_v0.py: -------------------------------------------------------------------------------- 1 | import gym 2 | import gym_gazebo_hsr # Don't remove this. It registers the env. 3 | import signal 4 | 5 | 6 | if __name__ == "__main__": 7 | env = gym.make('gazebo-hsr-assembly-v0') 8 | 9 | env.render(mode='human') 10 | 11 | env.reset() 12 | 13 | env.step(0) 14 | env.step(1) 15 | env.step(2) 16 | env.step(3) 17 | env.step(4) 18 | env.step(5) 19 | env.step(6) 20 | env.step(7) 21 | env.step(8) 22 | env.step(9) 23 | env.step(10) 24 | env.step(11) 25 | env.step(12) 26 | env.step(13) 27 | env.step(14) 28 | env.step(15) 29 | 30 | env.reset() 31 | 32 | signal.pause() 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # An OpenAI gym environment based on Gazebo and ROS for Human Support Robot (HSR) 2 | 3 | Work in progress 4 | 5 | Instructions: 6 | - Add `gym-gazebo-hsr` to PYTHONPATH 7 | - Add `.../models` to GAZEBO_MODEL_PATH 8 | - In /opt/ros/kinetic/python2.7/dist-packages/hsrb_interface/end_effector.py 9 | * In method `command` 10 | add 11 | ```python 12 | self._follow_joint_trajectory_client.action_client.wait_for_server() 13 | ``` 14 | before 15 | ```python 16 | self._follow_joint_trajectory_client.send_goal(goal) 17 | ``` 18 | 19 | * In method `apply_force` 20 | add 21 | ```python 22 | client.action_client.wait_for_server() 23 | ``` 24 | before 25 | ```python 26 | client.send_goal(goal) 27 | ``` 28 | 29 | How to run: 30 | (replace ```git/``` by your repository) 31 | - run ```python git/gym-gazebo-hsr/examples/gazebo_hsr_assembly_v0.py --world='three_cubes'``` 32 |

33 | 34 | 35 |

36 | - run ```python git/gym-gazebo-hsr/examples/gazebo_hsr_assembly_v0.py --world='assembly'``` 37 |

38 | 39 | 40 |

41 | 42 | -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/gazebo_env.py: -------------------------------------------------------------------------------- 1 | import gym 2 | import os 3 | from os import path 4 | import random 5 | import rospy 6 | import subprocess 7 | import time 8 | 9 | 10 | class GazeboEnv(gym.Env): 11 | """Superclass for all Gazebo environments. 12 | """ 13 | metadata = {'render.modes': ['human']} 14 | 15 | def __init__(self, launchfile): 16 | random_number = random.randint(10000, 15000) 17 | self.port = '11311' # str(random_number) # os.environ["ROS_PORT_SIM"] 18 | self.port_gazebo = str(random_number + 1) # os.environ["ROS_PORT_SIM"] 19 | 20 | with open("log.txt", "a") as myfile: 21 | myfile.write("export ROS_MASTER_URI=http://localhost:" + self.port + "\n") 22 | myfile.write("export GAZEBO_MASTER_URI=http://localhost:" + self.port_gazebo + "\n") 23 | 24 | # Start roscore 25 | self.proc_core = subprocess.Popen(['roscore', '-p', self.port]) 26 | time.sleep(1) 27 | print("Roscore launched!") 28 | 29 | # Launch the simulation with the given launchfile name 30 | if launchfile.startswith("/"): 31 | fullpath = launchfile 32 | else: 33 | fullpath = os.path.join(os.path.dirname(__file__), "assets", "launch", launchfile) 34 | if not path.exists(fullpath): 35 | raise IOError("File " + fullpath + " does not exist") 36 | 37 | self.proc_launch = subprocess.Popen(['roslaunch', '-p', self.port, fullpath]) 38 | print ("Gazebo launched!") 39 | rospy.wait_for_service('/gazebo/reset_world') 40 | 41 | self.proc_gzclient = None 42 | 43 | # In order for a ROS node to use simulation time according to the /clock topic, the /use_sim_time parameter must 44 | # be set to true before the node is initialized. This is done in the launchfile. See wiki.ros.org/Clock. 45 | rospy.init_node('gym', anonymous=True) 46 | 47 | def reset(self): 48 | # Implemented in subclass 49 | raise NotImplementedError 50 | 51 | def step(self, action): 52 | # Implement this method in every subclass 53 | # Perform a step in gazebo. E.g. move the robot 54 | raise NotImplementedError 55 | 56 | def _terminate_gzclient(self): 57 | # self.proc_gzclient.poll() is None means child process has not terminated 58 | if self.proc_gzclient is not None and self.proc_gzclient.poll() is None: 59 | self.proc_gzclient.terminate() 60 | self.proc_gzclient.wait() 61 | 62 | def render(self, mode="human", close=False): 63 | if close: 64 | self._terminate_gzclient() 65 | return 66 | 67 | if self.proc_gzclient is None or self.proc_gzclient.poll() is not None: 68 | self.proc_gzclient = subprocess.Popen("gzclient") 69 | 70 | def close(self): 71 | # Terminate gzclient, roslaunch and roscore 72 | self._terminate_gzclient() 73 | self.proc_launch.terminate() 74 | self.proc_core.terminate() 75 | self.proc_launch.wait() 76 | self.proc_core.wait() 77 | 78 | def _configure(self): 79 | # TODO 80 | # From OpenAI API: Provides runtime configuration to the environment 81 | # Maybe set the Real Time Factor? 82 | pass 83 | 84 | def seed(self): 85 | # TODO 86 | # From OpenAI API: Sets the seed for this env's random number generator(s) 87 | pass 88 | -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/gazebo_hsr_assembly_env.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import copy 3 | from gazebo_env import GazeboEnv 4 | from gazebo_msgs.msg import LinkStates, ModelState, ModelStates 5 | from gazebo_msgs.srv import SetModelState 6 | import hsrb_interface 7 | from hsrb_interface import geometry 8 | import math 9 | import numpy as np 10 | import random 11 | import rospy 12 | from sensor_msgs.msg import CompressedImage 13 | from std_srvs.srv import Empty 14 | import time 15 | 16 | parser = argparse.ArgumentParser() 17 | parser.add_argument('--world', type=str, 18 | help='optional, which world to launch, three_cubes or assembly', default='three_cubes') 19 | args = parser.parse_args() 20 | 21 | if args.world == 'three_cubes': 22 | launch_file = "gazebo_hsr_three_cubes-v0.launch" 23 | moving_object_model_names = ["box_red", "box_green", "box_blue"] 24 | model_names = ['ground_plane', 'low_table_rotate', 'box_red', 'box_green', 'box_blue', 'hsrb'] 25 | link_names = ['ground_plane::link', 'low_table_rotate::link', 'box_red::link_1', 'box_green::link_2', 26 | 'box_blue::link_3', 'hsrb::base_footprint', 'hsrb::arm_lift_link', 'hsrb::arm_flex_link', 27 | 'hsrb::arm_roll_link', 'hsrb::wrist_flex_link', 'hsrb::wrist_ft_sensor_mount_link', 28 | 'hsrb::wrist_ft_sensor_frame', 'hsrb::hand_l_proximal_link', 'hsrb::hand_l_spring_proximal_link', 29 | 'hsrb::hand_l_mimic_distal_link', 'hsrb::hand_l_distal_link', 'hsrb::hand_motor_dummy_link', 30 | 'hsrb::hand_r_proximal_link', 'hsrb::hand_r_spring_proximal_link', 'hsrb::hand_r_mimic_distal_link', 31 | 'hsrb::hand_r_distal_link', 'hsrb::base_roll_link', 'hsrb::base_l_drive_wheel_link', 32 | 'hsrb::base_l_passive_wheel_x_frame', 'hsrb::base_l_passive_wheel_y_frame', 33 | 'hsrb::base_l_passive_wheel_z_link', 34 | 'hsrb::base_r_drive_wheel_link', 'hsrb::base_r_passive_wheel_x_frame', 35 | 'hsrb::base_r_passive_wheel_y_frame', 36 | 'hsrb::base_r_passive_wheel_z_link', 'hsrb::torso_lift_link', 'hsrb::head_pan_link', 37 | 'hsrb::head_tilt_link'] 38 | elif args.world == 'assembly': 39 | launch_file = "gazebo_hsr_assembly-v0.launch" 40 | moving_object_model_names = ["base_plate", "compound_gear", "gear1", "gear2", "gear2_1", "shaft1", "shaft2"] 41 | model_names = ['ground_plane', 'low_table_rotate', 'base_plate', 'compound_gear', 'gear1', 'gear2', 'gear2_1', 42 | 'shaft1', 'shaft2', 'hsrb'] 43 | link_names = ['ground_plane::link', 'low_table_rotate::link', 'base_plate::link_0', 'compound_gear::link_1', 44 | 'gear1::link_2', 'gear2::link_4', 'gear2_1::link_3', 'shaft1::link_5', 'shaft2::link_6', 45 | 'hsrb::base_footprint', 'hsrb::arm_lift_link', 'hsrb::arm_flex_link', 'hsrb::arm_roll_link', 46 | 'hsrb::wrist_flex_link', 'hsrb::wrist_ft_sensor_mount_link', 'hsrb::wrist_ft_sensor_frame', 47 | 'hsrb::hand_l_proximal_link', 'hsrb::hand_l_spring_proximal_link', 'hsrb::hand_l_mimic_distal_link', 48 | 'hsrb::hand_l_distal_link', 'hsrb::hand_motor_dummy_link', 'hsrb::hand_r_proximal_link', 49 | 'hsrb::hand_r_spring_proximal_link', 'hsrb::hand_r_mimic_distal_link', 'hsrb::hand_r_distal_link', 50 | 'hsrb::base_roll_link', 'hsrb::base_l_drive_wheel_link', 'hsrb::base_l_passive_wheel_x_frame', 51 | 'hsrb::base_l_passive_wheel_y_frame', 'hsrb::base_l_passive_wheel_z_link', 52 | 'hsrb::base_r_drive_wheel_link', 53 | 'hsrb::base_r_passive_wheel_x_frame', 'hsrb::base_r_passive_wheel_y_frame', 54 | 'hsrb::base_r_passive_wheel_z_link', 55 | 'hsrb::torso_lift_link', 'hsrb::head_pan_link', 'hsrb::head_tilt_link'] 56 | else: 57 | raise NotImplementedError 58 | 59 | model_names_dict = {model_names[i]: i for i in range(len(model_names))} 60 | link_names_dict = {link_names[i]: i for i in range(len(link_names))} 61 | 62 | arm_joint_names = ["arm_lift_joint", "arm_flex_joint", "arm_roll_joint", "wrist_flex_joint", "wrist_roll_joint"] 63 | hand_gripper_link_names = ['hsrb::arm_lift_link', 'hsrb::arm_flex_link', 'hsrb::arm_roll_link', 'hsrb::wrist_flex_link', 64 | 'hsrb::hand_l_mimic_distal_link', 'hsrb::hand_r_mimic_distal_link'] 65 | table_xmin, table_xmax, table_ymin, table_ymax, table_z = 0.9, 1.4, -0.5, 0.5, 1 66 | 67 | 68 | class HsrState(object): 69 | def __init__(self): 70 | self.model_states = None # gazebo_msgs.msgModelStates 71 | self.link_states = None # gazebo_msgs.msgLinkStates 72 | self.hand_image = None # int array 73 | self.head_center_image = None # int array 74 | self.head_l_image = None # int array 75 | self.head_r_image = None # int array 76 | 77 | def to_array(self): 78 | result = [] 79 | # self may be changed during to_array thus causing problems. 80 | hs = copy.deepcopy(self) 81 | # for model_name in moving_object_model_names + ['hsrb']: 82 | # pose = self.model_states.pose[model_names_dict[model_name]] 83 | # result.extend([pose.position.x, pose.position.y, pose.position.z]) 84 | # result.extend([pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w]) 85 | # for link_name in hand_gripper_link_names: 86 | # pose = self.model_states.pose[model_names_dict[link_name]] 87 | # result.extend([pose.position.x, pose.position.y, pose.position.z]) 88 | # result.extend([pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w]) 89 | 90 | for pose in hs.model_states.pose: 91 | result.extend([pose.position.x, pose.position.y, pose.position.z]) 92 | result.extend([pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w]) 93 | result.extend([0.0] * (7 * (len(model_names) - len(hs.model_states.pose)))) 94 | for pose in hs.link_states.pose: 95 | result.extend([pose.position.x, pose.position.y, pose.position.z]) 96 | result.extend([pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w]) 97 | result.extend([0.0] * (7 * (len(link_names) - len(hs.link_states.pose)))) 98 | result.extend(hs.head_l_image / 256.0) 99 | # The size of head_l_image varies. Pad with 0 to make the network input size a constant. 100 | result.extend([0.0] * (65536 - len(hs.head_l_image))) 101 | result.extend(hs.head_r_image / 256.0) 102 | # The size of head_r_image varies. Pad with 0 to make the network input size a constant. 103 | result.extend([0.0] * (65536 - len(hs.head_r_image))) 104 | 105 | return result 106 | 107 | 108 | class GazeboHsrAssemblyEnv(GazeboEnv): 109 | def __init__(self): 110 | # Launch the simulation with the given launch file 111 | GazeboEnv.__init__(self, launch_file) 112 | self.robot = None 113 | self.state = HsrState() 114 | rospy.Subscriber("/gazebo/model_states", ModelStates, self._model_states_callback) 115 | rospy.Subscriber("/gazebo/link_states", LinkStates, self._link_states_callback) 116 | rospy.Subscriber("/hsrb/hand_camera/image_raw/compressed", CompressedImage, self._hand_image_callback) 117 | rospy.Subscriber("/hsrb/head_center_camera/image_raw/compressed", CompressedImage, 118 | self._head_center_image_callback) 119 | rospy.Subscriber("/hsrb/head_l_stereo_camera/image_rect_color/compressed", CompressedImage, 120 | self._head_l_image_callback) 121 | rospy.Subscriber("/hsrb/head_r_stereo_camera/image_rect_color/compressed", CompressedImage, 122 | self._head_r_image_callback) 123 | 124 | def _model_states_callback(self, data): 125 | self.state.model_states = data 126 | 127 | def _link_states_callback(self, data): 128 | self.state.link_states = data 129 | 130 | def _hand_image_callback(self, data): 131 | self.state.hand_image = np.fromstring(data.data, np.uint8) 132 | 133 | def _head_center_image_callback(self, data): 134 | self.state.head_center_image = np.fromstring(data.data, np.uint8) 135 | 136 | def _head_l_image_callback(self, data): 137 | self.state.head_l_image = np.fromstring(data.data, np.uint8) 138 | 139 | def _head_r_image_callback(self, data): 140 | self.state.head_r_image = np.fromstring(data.data, np.uint8) 141 | 142 | @staticmethod 143 | def _set_model_state(model_state): 144 | rospy.wait_for_service('/gazebo/set_model_state') 145 | try: 146 | set_model_state_client = rospy.ServiceProxy('/gazebo/set_model_state', SetModelState) 147 | set_model_state_client(model_state) 148 | except rospy.ServiceException as e: 149 | print("Service call failed: %s" % e) 150 | 151 | @staticmethod 152 | def _reset_robot_position_orientation(): 153 | model_state = ModelState() 154 | model_state.model_name = "hsrb" 155 | model_state.pose.position.x = 0 156 | model_state.pose.position.y = 0 157 | model_state.pose.position.z = 0 158 | model_state.pose.orientation.x = 0 159 | model_state.pose.orientation.y = 0 160 | model_state.pose.orientation.z = 0 161 | model_state.pose.orientation.w = 1 162 | model_state.reference_frame = "world" 163 | GazeboHsrAssemblyEnv._set_model_state(model_state) 164 | 165 | @staticmethod 166 | def _randomize_model_position(model_name, xmin, xmax, ymin, ymax, z): 167 | model_state = ModelState() 168 | model_state.model_name = model_name 169 | model_state.pose.position.x = random.uniform(xmin, xmax) 170 | model_state.pose.position.y = random.uniform(ymin, ymax) 171 | model_state.pose.position.z = z 172 | model_state.reference_frame = "world" 173 | GazeboHsrAssemblyEnv._set_model_state(model_state) 174 | 175 | @staticmethod 176 | def _randomize_models(xmin, xmax, ymin, ymax, z): 177 | # Put the objects somewhere else to prevent obstructing other objects. 178 | for i, model_name in enumerate(moving_object_model_names): 179 | GazeboHsrAssemblyEnv._randomize_model_position(model_name, 10 + i, 10.1 + i, 10, 10.1, 0) 180 | for model_name in moving_object_model_names: 181 | GazeboHsrAssemblyEnv._randomize_model_position(model_name, xmin, xmax, ymin, ymax, z) 182 | time.sleep(1) 183 | 184 | def reset(self): 185 | self.state = HsrState() 186 | 187 | rospy.wait_for_service('/gazebo/reset_world') 188 | try: 189 | reset_world_client = rospy.ServiceProxy('/gazebo/reset_world', Empty) 190 | reset_world_client() 191 | except rospy.ServiceException as e: 192 | print("Service call failed: %s" % e) 193 | 194 | GazeboHsrAssemblyEnv._randomize_models(table_xmin, table_xmax, table_ymin, table_ymax, table_z) 195 | # Reset the robot 196 | try: 197 | GazeboHsrAssemblyEnv._reset_robot_position_orientation() 198 | whole_body = self._get_robot().get('whole_body') 199 | whole_body.move_to_neutral() 200 | self._gripper_command(0.3) # Open the gripper a little bit 201 | except Exception as e: 202 | print("Exception: %s" % e) 203 | # Return initial OpenAI gym observation 204 | return self.state 205 | 206 | def _get_robot(self): 207 | if self.robot is None: 208 | self.robot = hsrb_interface.Robot() 209 | return self.robot 210 | 211 | def _move(self, axis, distance): 212 | whole_body = self._get_robot().get('whole_body') 213 | whole_body.move_end_effector_by_line(axis, distance) 214 | 215 | def _gripper_apply_force(self, effort): 216 | robot = self._get_robot() 217 | gripper = robot.get('gripper', robot.Items.END_EFFECTOR) 218 | delicate = False 219 | if 0.2 <= effort <= 0.6: 220 | delicate = True 221 | gripper.apply_force(effort, delicate) 222 | 223 | def _gripper_command(self, open_angle): 224 | robot = self._get_robot() 225 | gripper = robot.get('gripper', robot.Items.END_EFFECTOR) 226 | gripper.command(open_angle) 227 | 228 | def step(self, action): 229 | try: 230 | # Big move 231 | if action == 0: 232 | self._move(geometry.Vector3(1, 0, 0), 0.1) 233 | elif action == 1: 234 | self._move(geometry.Vector3(-1, 0, 0), 0.1) 235 | elif action == 2: 236 | self._move(geometry.Vector3(0, 1, 0), 0.1) 237 | elif action == 3: 238 | self._move(geometry.Vector3(0, -1, 0), 0.1) 239 | elif action == 4: 240 | self._move(geometry.Vector3(0, 0, 1), 0.1) 241 | elif action == 5: 242 | self._move(geometry.Vector3(0, 0, -1), 0.1) 243 | # Small moves 244 | elif action == 6: 245 | self._move(geometry.Vector3(1, 0, 0), 0.01) 246 | elif action == 7: 247 | self._move(geometry.Vector3(-1, 0, 0), 0.01) 248 | elif action == 8: 249 | self._move(geometry.Vector3(0, 1, 0), 0.01) 250 | elif action == 9: 251 | self._move(geometry.Vector3(0, -1, 0), 0.01) 252 | elif action == 10: 253 | self._move(geometry.Vector3(0, 0, 1), 0.01) 254 | elif action == 11: 255 | self._move(geometry.Vector3(0, 0, -1), 0.01) 256 | # Gripper 257 | elif action == 12: 258 | self._gripper_command(1.2) # Open 259 | elif action == 13: 260 | self._gripper_command(0.0) # Close 261 | elif action == 14: 262 | self._gripper_apply_force(0.5) 263 | elif action == 15: 264 | self._gripper_apply_force(1.0) 265 | else: 266 | raise NotImplementedError 267 | except Exception as e: 268 | print("Action %d is unavailable: %s" % (action, e)) 269 | 270 | observation = self.state 271 | reward = self._reward() 272 | done = False if reward < 0.9 else True 273 | info = None 274 | 275 | return observation, reward, done, info 276 | 277 | def get_model_pose(self, model_name): 278 | return self.state.model_states.pose[model_names_dict[model_name]] 279 | 280 | def get_link_pose(self, link_name): 281 | return self.state.link_states.pose[link_names_dict[link_name]] 282 | 283 | def get_hand_position(self): 284 | l_pos = self.get_link_pose('hsrb::hand_l_mimic_distal_link').position 285 | r_pos = self.get_link_pose('hsrb::hand_r_mimic_distal_link').position 286 | return geometry.vector3((l_pos.x + r_pos.x) * 0.5, (l_pos.y + r_pos.y) * 0.5, (l_pos.z + r_pos.z) * 0.5) 287 | 288 | @staticmethod 289 | def norm2(v1, v2): 290 | return math.sqrt(math.pow(v1.x - v2.x, 2) + math.pow(v1.y - v2.y, 2) + math.pow(v1.z - v2.z, 2)) 291 | 292 | def _reward(self): # Green box on top of red box 293 | if args.world == 'three_cubes': 294 | box_green_position = self.get_model_pose("box_green").position 295 | box_red_position = self.get_model_pose("box_red").position 296 | dist_z = box_green_position.z - box_red_position.z 297 | if dist_z < 0.09 or dist_z > 0.11: 298 | return 0 299 | box_red_position.z = box_green_position.z 300 | dist_xy = GazeboHsrAssemblyEnv.norm2(box_green_position, box_red_position) 301 | if dist_xy > 0.1: 302 | return 0 303 | return 1 if dist_xy < 0.05 else 1 - 10 * dist_xy 304 | else: 305 | raise NotImplementedError 306 | -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/assets/worlds/hsr_three_cubes.world: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1 5 | 0 0 10 0 -0 0 6 | 0.8 0.8 0.8 1 7 | 0.2 0.2 0.2 1 8 | 9 | 1000 10 | 0.9 11 | 0.01 12 | 0.001 13 | 14 | -0.5 0.1 -0.9 15 | 16 | 17 | 1 18 | 19 | 20 | 21 | 22 | 0 0 1 23 | 100 100 24 | 25 | 26 | 27 | 28 | 29 | 100 30 | 50 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 10 42 | 43 | 44 | 0 45 | 46 | 47 | 0 0 1 48 | 100 100 49 | 50 | 51 | 52 | 56 | 57 | 58 | 0 59 | 0 60 | 61 | 62 | 0 0 -9.8 63 | 6e-06 2.3e-05 -4.2e-05 64 | 65 | 66 | 0.001 67 | 1 68 | 1000 69 | 70 | 71 | 0.4 0.4 0.4 1 72 | 0.7 0.7 0.7 1 73 | 1 74 | 75 | 76 | EARTH_WGS84 77 | 0 78 | 0 79 | 0 80 | 0 81 | 82 | 83 | 84 | 0 0 0 0 0 -1.5708 85 | 86 | 1 87 | 0 0 0 0 -0 0 88 | 89 | 1 90 | 0 91 | 0 92 | 1 93 | 0 94 | 1 95 | 96 | 97 | 0 98 | 0 99 | 1 100 | 101 | 0 0 0.5 0 -0 0 102 | 103 | 104 | 1.5 0.8 0.03 105 | 106 | 107 | 108 | 112 | 113 | __default__ 114 | 115 | 1 1 1 1 116 | 1 1 1 1 117 | 0.2 0.2 0.2 1 118 | 0 0 0 1 119 | 120 | 0 121 | 1 122 | 123 | 124 | 0.68 -0.38 0.25 0 -0 0 125 | 126 | 127 | 0.02 128 | 0.5 129 | 130 | 131 | 132 | 136 | 137 | __default__ 138 | 139 | 0.3 0.3 0.3 1 140 | 0.7 0.7 0.7 1 141 | 0.01 0.01 0.01 1 142 | 0 0 0 1 143 | 144 | 0 145 | 1 146 | 147 | 148 | 0.68 0.38 0.25 0 -0 0 149 | 150 | 151 | 0.02 152 | 0.5 153 | 154 | 155 | 156 | 160 | 161 | __default__ 162 | 163 | 0.3 0.3 0.3 1 164 | 0.7 0.7 0.7 1 165 | 0.01 0.01 0.01 1 166 | 0 0 0 1 167 | 168 | 0 169 | 1 170 | 171 | 172 | -0.68 -0.38 0.25 0 -0 0 173 | 174 | 175 | 0.02 176 | 0.5 177 | 178 | 179 | 180 | 184 | 185 | __default__ 186 | 187 | 0.3 0.3 0.3 1 188 | 0.7 0.7 0.7 1 189 | 0.01 0.01 0.01 1 190 | 0 0 0 1 191 | 192 | 0 193 | 1 194 | 195 | 196 | -0.68 0.38 0.25 0 -0 0 197 | 198 | 199 | 0.02 200 | 0.5 201 | 202 | 203 | 204 | 208 | 209 | __default__ 210 | 211 | 0.3 0.3 0.3 1 212 | 0.7 0.7 0.7 1 213 | 0.01 0.01 0.01 1 214 | 0 0 0 1 215 | 216 | 0 217 | 1 218 | 219 | 220 | 0 221 | 10 222 | 0 0 0.5 0 -0 0 223 | 224 | 225 | 1.5 0.8 0.03 226 | 227 | 228 | 229 | 230 | 231 | 0.6 232 | 0.6 233 | 0 0 0 234 | 0 235 | 0 236 | 237 | 238 | 1 239 | 0 240 | 0 241 | 1 242 | 243 | 0 244 | 245 | 246 | 247 | 248 | 0 249 | 1e+06 250 | 251 | 252 | 0 253 | 1 254 | 1 255 | 256 | 0 257 | 0.2 258 | 1e+13 259 | 1 260 | 0.01 261 | 0 262 | 263 | 264 | 1 265 | -0.01 266 | 0 267 | 0.2 268 | 1e+13 269 | 1 270 | 271 | 272 | 273 | 274 | 275 | 0 276 | 10 277 | 0.68 0.38 0.25 0 -0 0 278 | 279 | 280 | 0.02 281 | 0.5 282 | 283 | 284 | 285 | 286 | 287 | 1 288 | 1 289 | 0 0 0 290 | 0 291 | 0 292 | 293 | 294 | 1 295 | 0 296 | 0 297 | 1 298 | 299 | 0 300 | 301 | 302 | 303 | 304 | 0 305 | 1e+06 306 | 307 | 308 | 0 309 | 1 310 | 1 311 | 312 | 0 313 | 0.2 314 | 1e+13 315 | 1 316 | 0.01 317 | 0 318 | 319 | 320 | 1 321 | -0.01 322 | 0 323 | 0.2 324 | 1e+13 325 | 1 326 | 327 | 328 | 329 | 330 | 331 | 0 332 | 10 333 | -0.68 -0.38 0.25 0 -0 0 334 | 335 | 336 | 0.02 337 | 0.5 338 | 339 | 340 | 341 | 342 | 343 | 1 344 | 1 345 | 0 0 0 346 | 0 347 | 0 348 | 349 | 350 | 1 351 | 0 352 | 0 353 | 1 354 | 355 | 0 356 | 357 | 358 | 359 | 360 | 0 361 | 1e+06 362 | 363 | 364 | 0 365 | 1 366 | 1 367 | 368 | 0 369 | 0.2 370 | 1e+13 371 | 1 372 | 0.01 373 | 0 374 | 375 | 376 | 1 377 | -0.01 378 | 0 379 | 0.2 380 | 1e+13 381 | 1 382 | 383 | 384 | 385 | 386 | 387 | 0 388 | 10 389 | 0.68 -0.38 0.25 0 -0 0 390 | 391 | 392 | 0.02 393 | 0.5 394 | 395 | 396 | 397 | 398 | 399 | 1 400 | 1 401 | 0 0 0 402 | 0 403 | 0 404 | 405 | 406 | 1 407 | 0 408 | 0 409 | 1 410 | 411 | 0 412 | 413 | 414 | 415 | 416 | 0 417 | 1e+06 418 | 419 | 420 | 0 421 | 1 422 | 1 423 | 424 | 0 425 | 0.2 426 | 1e+13 427 | 1 428 | 0.01 429 | 0 430 | 431 | 432 | 1 433 | -0.01 434 | 0 435 | 0.2 436 | 1e+13 437 | 1 438 | 439 | 440 | 441 | 442 | 443 | 0 444 | 10 445 | -0.68 0.38 0.25 0 -0 0 446 | 447 | 448 | 0.02 449 | 0.5 450 | 451 | 452 | 453 | 454 | 455 | 1 456 | 1 457 | 0 0 0 458 | 0 459 | 0 460 | 461 | 462 | 1 463 | 0 464 | 0 465 | 1 466 | 467 | 0 468 | 469 | 470 | 471 | 472 | 0 473 | 1e+06 474 | 475 | 476 | 0 477 | 1 478 | 1 479 | 480 | 0 481 | 0.2 482 | 1e+13 483 | 1 484 | 0.01 485 | 0 486 | 487 | 488 | 1 489 | -0.01 490 | 0 491 | 0.2 492 | 1e+13 493 | 1 494 | 495 | 496 | 497 | 498 | 499 | 1 500 | 1 501 | 1.16194 -0.085644 0 0 -0 0 502 | 503 | 504 | 505 | -0 -0 -0 0 -0 0 506 | 507 | 1 508 | 509 | 0.00166666 510 | 0 511 | 0 512 | 0.00166666 513 | 0 514 | 0.00166666 515 | 516 | 0 0 0 0 -0 0 517 | 518 | 1 519 | 0 520 | 0 521 | 522 | 0 0 0 0 -0 0 523 | 524 | 525 | 0.1 0.1 0.1 526 | 527 | 528 | 529 | 1 530 | 534 | 535 | __default__ 536 | 537 | 0.7 0.1 0.1 1 538 | 0.7 0.7 0.7 1 539 | 0.01 0.01 0.01 1 540 | 0 0 0 1 541 | 542 | 0 543 | 1 544 | 545 | 546 | 0 547 | 10 548 | 0 0 0 0 -0 0 549 | 550 | 551 | 0.1 0.1 0.1 552 | 553 | 554 | 555 | 556 | 557 | 1 558 | 1 559 | 0 0 0 560 | 0 561 | 0 562 | 563 | 564 | 1 565 | 0 566 | 0 567 | 1 568 | 569 | 0 570 | 571 | 572 | 573 | 574 | 0 575 | 1e+06 576 | 577 | 578 | 0 579 | 1 580 | 1 581 | 582 | 0 583 | 0.2 584 | 1e+13 585 | 1 586 | 0.01 587 | 0 588 | 589 | 590 | 1 591 | -0.01 592 | 0 593 | 0.2 594 | 1e+13 595 | 1 596 | 597 | 598 | 599 | 600 | 601 | 0 602 | 1 603 | 1.16175 -0.026455 0.565 0 0 0 604 | 605 | 606 | 607 | 0 0 0 0 -0 0 608 | 609 | 1 610 | 611 | 0.00166666 612 | 0 613 | 0 614 | 0.00166666 615 | 0 616 | 0.00166666 617 | 618 | 0 0 0 0 -0 0 619 | 620 | 1 621 | 0 622 | 0 623 | 624 | 0 0 0 0 -0 0 625 | 626 | 627 | 0.1 0.1 0.1 628 | 629 | 630 | 631 | 1 632 | 636 | 637 | __default__ 638 | 639 | 0.1 0.7 0.1 1 640 | 0.7 0.7 0.7 1 641 | 0.01 0.01 0.01 1 642 | 0 0 0 1 643 | 644 | 0 645 | 1 646 | 647 | 648 | 0 649 | 10 650 | 0 0 0 0 -0 0 651 | 652 | 653 | 0.1 0.1 0.1 654 | 655 | 656 | 657 | 658 | 659 | 1 660 | 1 661 | 0 0 0 662 | 0 663 | 0 664 | 665 | 666 | 1 667 | 0 668 | 0 669 | 1 670 | 671 | 0 672 | 673 | 674 | 675 | 676 | 0 677 | 1e+06 678 | 679 | 680 | 0 681 | 1 682 | 1 683 | 684 | 0 685 | 0.2 686 | 1e+13 687 | 1 688 | 0.01 689 | 0 690 | 691 | 692 | 1 693 | -0.01 694 | 0 695 | 0.2 696 | 1e+13 697 | 1 698 | 699 | 700 | 701 | 702 | 703 | 0 704 | 1 705 | 0.980338 -0.583138 0.565 0 -0 0 706 | 707 | 708 | 709 | 0 -0 0 0 -0 0 710 | 711 | 1 712 | 713 | 0.00166666 714 | 0 715 | 0 716 | 0.00166666 717 | 0 718 | 0.00166666 719 | 720 | 0 0 0 0 -0 0 721 | 722 | 1 723 | 0 724 | 0 725 | 726 | 0 0 0 0 -0 0 727 | 728 | 729 | 0.1 0.1 0.1 730 | 731 | 732 | 733 | 1 734 | 738 | 739 | __default__ 740 | 741 | 0.1 0.1 0.7 1 742 | 0.7 0.7 0.7 1 743 | 0.01 0.01 0.01 1 744 | 0 0 0 1 745 | 746 | 0 747 | 1 748 | 749 | 750 | 0 751 | 10 752 | 0 0 0 0 -0 0 753 | 754 | 755 | 0.1 0.1 0.1 756 | 757 | 758 | 759 | 760 | 761 | 1 762 | 1 763 | 0 0 0 764 | 0 765 | 0 766 | 767 | 768 | 1 769 | 0 770 | 0 771 | 1 772 | 773 | 0 774 | 775 | 776 | 777 | 778 | 0 779 | 1e+06 780 | 781 | 782 | 0 783 | 1 784 | 1 785 | 786 | 0 787 | 0.2 788 | 1e+13 789 | 1 790 | 0.01 791 | 0 792 | 793 | 794 | 1 795 | -0.01 796 | 0 797 | 0.2 798 | 1e+13 799 | 1 800 | 801 | 802 | 803 | 804 | 805 | 0 806 | 1 807 | 1.02026 0.284976 0.565 0 -0 0 808 | 809 | 810 | 811 | -4.43006 -2.99463 2.42854 0 0.366021 0.490777 812 | orbit 813 | perspective 814 | 815 | 816 | 817 | 818 | -------------------------------------------------------------------------------- /gym_gazebo_hsr/envs/assets/worlds/hsr_assembly.world: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1 5 | 0 0 10 0 -0 0 6 | 0.8 0.8 0.8 1 7 | 0.2 0.2 0.2 1 8 | 9 | 1000 10 | 0.9 11 | 0.01 12 | 0.001 13 | 14 | -0.5 0.1 -0.9 15 | 16 | 17 | 1 18 | 19 | 20 | 21 | 22 | 0 0 1 23 | 100 100 24 | 25 | 26 | 27 | 28 | 29 | 100 30 | 50 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 10 42 | 43 | 44 | 0 45 | 46 | 47 | 0 0 1 48 | 100 100 49 | 50 | 51 | 52 | 56 | 57 | 58 | 0 59 | 0 60 | 61 | 62 | 0 0 -9.8 63 | 6e-06 2.3e-05 -4.2e-05 64 | 65 | 66 | 0.001 67 | 1 68 | 1000 69 | 70 | 71 | 0.4 0.4 0.4 1 72 | 0.7 0.7 0.7 1 73 | 1 74 | 75 | 76 | EARTH_WGS84 77 | 0 78 | 0 79 | 0 80 | 0 81 | 82 | 83 | 84 | 0 0 0 0 0 -1.5708 85 | 86 | 1 87 | 0 0 0 0 -0 0 88 | 89 | 1 90 | 0 91 | 0 92 | 1 93 | 0 94 | 1 95 | 96 | 97 | 0 98 | 0 99 | 1 100 | 101 | 0 0 0.5 0 -0 0 102 | 103 | 104 | 1.5 0.8 0.03 105 | 106 | 107 | 108 | 112 | 113 | __default__ 114 | 115 | 1 1 1 1 116 | 1 1 1 1 117 | 0.2 0.2 0.2 1 118 | 0 0 0 1 119 | 120 | 0 121 | 1 122 | 123 | 124 | 0.68 -0.38 0.25 0 -0 0 125 | 126 | 127 | 0.02 128 | 0.5 129 | 130 | 131 | 132 | 136 | 137 | __default__ 138 | 139 | 0.3 0.3 0.3 1 140 | 0.7 0.7 0.7 1 141 | 0.01 0.01 0.01 1 142 | 0 0 0 1 143 | 144 | 0 145 | 1 146 | 147 | 148 | 0.68 0.38 0.25 0 -0 0 149 | 150 | 151 | 0.02 152 | 0.5 153 | 154 | 155 | 156 | 160 | 161 | __default__ 162 | 163 | 0.3 0.3 0.3 1 164 | 0.7 0.7 0.7 1 165 | 0.01 0.01 0.01 1 166 | 0 0 0 1 167 | 168 | 0 169 | 1 170 | 171 | 172 | -0.68 -0.38 0.25 0 -0 0 173 | 174 | 175 | 0.02 176 | 0.5 177 | 178 | 179 | 180 | 184 | 185 | __default__ 186 | 187 | 0.3 0.3 0.3 1 188 | 0.7 0.7 0.7 1 189 | 0.01 0.01 0.01 1 190 | 0 0 0 1 191 | 192 | 0 193 | 1 194 | 195 | 196 | -0.68 0.38 0.25 0 -0 0 197 | 198 | 199 | 0.02 200 | 0.5 201 | 202 | 203 | 204 | 208 | 209 | __default__ 210 | 211 | 0.3 0.3 0.3 1 212 | 0.7 0.7 0.7 1 213 | 0.01 0.01 0.01 1 214 | 0 0 0 1 215 | 216 | 0 217 | 1 218 | 219 | 220 | 0 221 | 10 222 | 0 0 0.5 0 -0 0 223 | 224 | 225 | 1.5 0.8 0.03 226 | 227 | 228 | 229 | 230 | 231 | 0.6 232 | 0.6 233 | 0 0 0 234 | 0 235 | 0 236 | 237 | 238 | 1 239 | 0 240 | 0 241 | 1 242 | 243 | 0 244 | 245 | 246 | 247 | 248 | 0 249 | 1e+06 250 | 251 | 252 | 0 253 | 1 254 | 1 255 | 256 | 0 257 | 0.2 258 | 1e+13 259 | 1 260 | 0.01 261 | 0 262 | 263 | 264 | 1 265 | -0.01 266 | 0 267 | 0.2 268 | 1e+13 269 | 1 270 | 271 | 272 | 273 | 274 | 275 | 0 276 | 10 277 | 0.68 0.38 0.25 0 -0 0 278 | 279 | 280 | 0.02 281 | 0.5 282 | 283 | 284 | 285 | 286 | 287 | 1 288 | 1 289 | 0 0 0 290 | 0 291 | 0 292 | 293 | 294 | 1 295 | 0 296 | 0 297 | 1 298 | 299 | 0 300 | 301 | 302 | 303 | 304 | 0 305 | 1e+06 306 | 307 | 308 | 0 309 | 1 310 | 1 311 | 312 | 0 313 | 0.2 314 | 1e+13 315 | 1 316 | 0.01 317 | 0 318 | 319 | 320 | 1 321 | -0.01 322 | 0 323 | 0.2 324 | 1e+13 325 | 1 326 | 327 | 328 | 329 | 330 | 331 | 0 332 | 10 333 | -0.68 -0.38 0.25 0 -0 0 334 | 335 | 336 | 0.02 337 | 0.5 338 | 339 | 340 | 341 | 342 | 343 | 1 344 | 1 345 | 0 0 0 346 | 0 347 | 0 348 | 349 | 350 | 1 351 | 0 352 | 0 353 | 1 354 | 355 | 0 356 | 357 | 358 | 359 | 360 | 0 361 | 1e+06 362 | 363 | 364 | 0 365 | 1 366 | 1 367 | 368 | 0 369 | 0.2 370 | 1e+13 371 | 1 372 | 0.01 373 | 0 374 | 375 | 376 | 1 377 | -0.01 378 | 0 379 | 0.2 380 | 1e+13 381 | 1 382 | 383 | 384 | 385 | 386 | 387 | 0 388 | 10 389 | 0.68 -0.38 0.25 0 -0 0 390 | 391 | 392 | 0.02 393 | 0.5 394 | 395 | 396 | 397 | 398 | 399 | 1 400 | 1 401 | 0 0 0 402 | 0 403 | 0 404 | 405 | 406 | 1 407 | 0 408 | 0 409 | 1 410 | 411 | 0 412 | 413 | 414 | 415 | 416 | 0 417 | 1e+06 418 | 419 | 420 | 0 421 | 1 422 | 1 423 | 424 | 0 425 | 0.2 426 | 1e+13 427 | 1 428 | 0.01 429 | 0 430 | 431 | 432 | 1 433 | -0.01 434 | 0 435 | 0.2 436 | 1e+13 437 | 1 438 | 439 | 440 | 441 | 442 | 443 | 0 444 | 10 445 | -0.68 0.38 0.25 0 -0 0 446 | 447 | 448 | 0.02 449 | 0.5 450 | 451 | 452 | 453 | 454 | 455 | 1 456 | 1 457 | 0 0 0 458 | 0 459 | 0 460 | 461 | 462 | 1 463 | 0 464 | 0 465 | 1 466 | 467 | 0 468 | 469 | 470 | 471 | 472 | 0 473 | 1e+06 474 | 475 | 476 | 0 477 | 1 478 | 1 479 | 480 | 0 481 | 0.2 482 | 1e+13 483 | 1 484 | 0.01 485 | 0 486 | 487 | 488 | 1 489 | -0.01 490 | 0 491 | 0.2 492 | 1e+13 493 | 1 494 | 495 | 496 | 497 | 498 | 499 | 1 500 | 1 501 | 1.1914 -0.007726 0 0 -0 0 502 | 503 | 504 | 505 | 0 0 0 0 0 0 506 | 507 | 0.02 508 | 509 | 0.166667 510 | 0 511 | 0 512 | 0.166667 513 | 0 514 | 0.166667 515 | 516 | 0 0 0 0 -0 0 517 | 518 | 1 519 | 0 520 | 0 521 | 522 | 0 0 0 0 -0 0 523 | 524 | 525 | model://base_plate.stl 526 | 0.02 0.02 0.02 527 | 528 | 529 | 530 | 1 531 | 535 | 536 | __default__ 537 | 538 | 0.3 0.3 0.3 1 539 | 0.7 0.7 0.7 1 540 | 0.01 0.01 0.01 1 541 | 0 0 0 1 542 | 543 | 0 544 | 1 545 | 546 | 547 | 0 548 | 10 549 | 0 0 0 0 -0 0 550 | 551 | 552 | model://base_plate.stl 553 | 0.02 0.02 0.02 554 | 555 | 556 | 557 | 558 | 559 | 1 560 | 1 561 | 0 0 0 562 | 0 563 | 0 564 | 565 | 566 | 1 567 | 0 568 | 0 569 | 1 570 | 571 | 0 572 | 573 | 574 | 575 | 576 | 0 577 | 1e+06 578 | 579 | 580 | 0 581 | 1 582 | 1 583 | 584 | 0 585 | 0.2 586 | 1e+13 587 | 1 588 | 0.01 589 | 0 590 | 591 | 592 | 1 593 | -0.01 594 | 0 595 | 0.2 596 | 1e+13 597 | 1 598 | 599 | 600 | 601 | 602 | 603 | 0 604 | 1 605 | 1.18072 -0.529223 0.515 0 0 0 606 | 607 | 608 | 609 | 0 0 0 0 0 0 0 610 | 611 | 0.02 612 | 613 | 0.166667 614 | 0 615 | 0 616 | 0.166667 617 | 0 618 | 0.166667 619 | 620 | 0 0 0 0 -0 0 621 | 622 | 1 623 | 0 624 | 0 625 | 626 | 0 0 0 0 -0 0 627 | 628 | 629 | model://compound_gear.stl 630 | 0.02 0.02 0.02 631 | 632 | 633 | 634 | 1 635 | 639 | 640 | __default__ 641 | 642 | 0.3 0.3 0.3 1 643 | 0.7 0.7 0.7 1 644 | 0.01 0.01 0.01 1 645 | 0 0 0 1 646 | 647 | 0 648 | 1 649 | 650 | 651 | 0 652 | 10 653 | 0 0 0 0 -0 0 654 | 655 | 656 | model://compound_gear.stl 657 | 0.02 0.02 0.02 658 | 659 | 660 | 661 | 662 | 663 | 1 664 | 1 665 | 0 0 0 666 | 0 667 | 0 668 | 669 | 670 | 1 671 | 0 672 | 0 673 | 1 674 | 675 | 0 676 | 677 | 678 | 679 | 680 | 0 681 | 1e+06 682 | 683 | 684 | 0 685 | 1 686 | 1 687 | 688 | 0 689 | 0.2 690 | 1e+13 691 | 1 692 | 0.01 693 | 0 694 | 695 | 696 | 1 697 | -0.01 698 | 0 699 | 0.2 700 | 1e+13 701 | 1 702 | 703 | 704 | 705 | 706 | 707 | 0 708 | 1 709 | 1.02565 -0.282021 0.515011 0 0 0 710 | 711 | 712 | 713 | 0 -0 0 0 -0 0 714 | 715 | 0.02 716 | 717 | 0.166667 718 | 0 719 | 0 720 | 0.166667 721 | 0 722 | 0.166667 723 | 724 | 0 0 0 0 -0 0 725 | 726 | 1 727 | 0 728 | 0 729 | 730 | 0 0 0 0 -0 0 731 | 732 | 733 | model://gear1.stl 734 | 0.02 0.02 0.02 735 | 736 | 737 | 738 | 1 739 | 743 | 744 | __default__ 745 | 746 | 0.3 0.3 0.3 1 747 | 0.7 0.7 0.7 1 748 | 0.01 0.01 0.01 1 749 | 0 0 0 1 750 | 751 | 0 752 | 1 753 | 754 | 755 | 0 756 | 10 757 | 0 0 0 0 -0 0 758 | 759 | 760 | model://gear1.stl 761 | 0.02 0.02 0.02 762 | 763 | 764 | 765 | 766 | 767 | 1 768 | 1 769 | 0 0 0 770 | 0 771 | 0 772 | 773 | 774 | 1 775 | 0 776 | 0 777 | 1 778 | 779 | 0 780 | 781 | 782 | 783 | 784 | 0 785 | 1e+06 786 | 787 | 788 | 0 789 | 1 790 | 1 791 | 792 | 0 793 | 0.2 794 | 1e+13 795 | 1 796 | 0.01 797 | 0 798 | 799 | 800 | 1 801 | -0.01 802 | 0 803 | 0.2 804 | 1e+13 805 | 1 806 | 807 | 808 | 809 | 810 | 811 | 0 812 | 1 813 | 0.981978 -0.003389 0.515017 0 0 0 814 | 815 | 816 | 817 | -0 0 0 0 -0 0 818 | 819 | 0.02 820 | 821 | 0.166667 822 | 0 823 | 0 824 | 0.166667 825 | 0 826 | 0.166667 827 | 828 | 0 0 0 0 -0 0 829 | 830 | 1 831 | 0 832 | 0 833 | 834 | 0 0 0 0 -0 0 835 | 836 | 837 | model://gear2.stl 838 | 0.02 0.02 0.02 839 | 840 | 841 | 842 | 1 843 | 847 | 848 | __default__ 849 | 850 | 0.3 0.3 0.3 1 851 | 0.7 0.7 0.7 1 852 | 0.01 0.01 0.01 1 853 | 0 0 0 1 854 | 855 | 0 856 | 1 857 | 858 | 859 | 0 860 | 10 861 | 0 0 0 0 -0 0 862 | 863 | 864 | model://gear2.stl 865 | 0.02 0.02 0.02 866 | 867 | 868 | 869 | 870 | 871 | 1 872 | 1 873 | 0 0 0 874 | 0 875 | 0 876 | 877 | 878 | 1 879 | 0 880 | 0 881 | 1 882 | 883 | 0 884 | 885 | 886 | 887 | 888 | 0 889 | 1e+06 890 | 891 | 892 | 0 893 | 1 894 | 1 895 | 896 | 0 897 | 0.2 898 | 1e+13 899 | 1 900 | 0.01 901 | 0 902 | 903 | 904 | 1 905 | -0.01 906 | 0 907 | 0.2 908 | 1e+13 909 | 1 910 | 911 | 912 | 913 | 914 | 915 | 0 916 | 1 917 | 1.14726 -0.078692 0.515044 0 -0 0 918 | 919 | 920 | 921 | -0 0 0 0 -0 0 922 | 923 | 0.02 924 | 925 | 0.166667 926 | 0 927 | 0 928 | 0.166667 929 | 0 930 | 0.166667 931 | 932 | 0 0 0 0 -0 0 933 | 934 | 1 935 | 0 936 | 0 937 | 938 | 0 0 0 0 -0 0 939 | 940 | 941 | model://gear2_1.stl 942 | 0.02 0.02 0.02 943 | 944 | 945 | 946 | 1 947 | 951 | 952 | __default__ 953 | 954 | 0.3 0.3 0.3 1 955 | 0.7 0.7 0.7 1 956 | 0.01 0.01 0.01 1 957 | 0 0 0 1 958 | 959 | 0 960 | 1 961 | 962 | 963 | 0 964 | 10 965 | 0 0 0 0 -0 0 966 | 967 | 968 | model://gear2_1.stl 969 | 0.02 0.02 0.02 970 | 971 | 972 | 973 | 974 | 975 | 1 976 | 1 977 | 0 0 0 978 | 0 979 | 0 980 | 981 | 982 | 1 983 | 0 984 | 0 985 | 1 986 | 987 | 0 988 | 989 | 990 | 991 | 992 | 0 993 | 1e+06 994 | 995 | 996 | 0 997 | 1 998 | 1 999 | 1000 | 0 1001 | 0.2 1002 | 1e+13 1003 | 1 1004 | 0.01 1005 | 0 1006 | 1007 | 1008 | 1 1009 | -0.01 1010 | 0 1011 | 0.2 1012 | 1e+13 1013 | 1 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 0 1020 | 1 1021 | 1.1164 0.206339 0.515131 0 0 0 1022 | 1023 | 1024 | 1025 | 0 0 0 0 -0 0 1026 | 1027 | 0.02 1028 | 1029 | 0.166667 1030 | 0 1031 | 0 1032 | 0.166667 1033 | 0 1034 | 0.166667 1035 | 1036 | 0 0 0 0 -0 0 1037 | 1038 | 1 1039 | 0 1040 | 0 1041 | 1042 | 0 0 0 0 -0 0 1043 | 1044 | 1045 | model://shaft1.stl 1046 | 0.02 0.02 0.02 1047 | 1048 | 1049 | 1050 | 1 1051 | 1055 | 1056 | __default__ 1057 | 1058 | 0.3 0.3 0.3 1 1059 | 0.7 0.7 0.7 1 1060 | 0.01 0.01 0.01 1 1061 | 0 0 0 1 1062 | 1063 | 0 1064 | 1 1065 | 1066 | 1067 | 0 1068 | 10 1069 | 0 0 0 0 -0 0 1070 | 1071 | 1072 | model://shaft1.stl 1073 | 0.02 0.02 0.02 1074 | 1075 | 1076 | 1077 | 1078 | 1079 | 1 1080 | 1 1081 | 0 0 0 1082 | 0 1083 | 0 1084 | 1085 | 1086 | 1 1087 | 0 1088 | 0 1089 | 1 1090 | 1091 | 0 1092 | 1093 | 1094 | 1095 | 1096 | 0 1097 | 1e+06 1098 | 1099 | 1100 | 0 1101 | 1 1102 | 1 1103 | 1104 | 0 1105 | 0.2 1106 | 1e+13 1107 | 1 1108 | 0.01 1109 | 0 1110 | 1111 | 1112 | 1 1113 | -0.01 1114 | 0 1115 | 0.2 1116 | 1e+13 1117 | 1 1118 | 1119 | 1120 | 1121 | 1122 | 1123 | 0 1124 | 1 1125 | 1.01296 0.518672 0.514991 0 0 0 1126 | 1127 | 1128 | 1129 | 0 0 0 0 -0 0 1130 | 1131 | 0.02 1132 | 1133 | 0.166667 1134 | 0 1135 | 0 1136 | 0.166667 1137 | 0 1138 | 0.166667 1139 | 1140 | 0 0 0 0 -0 0 1141 | 1142 | 1 1143 | 0 1144 | 0 1145 | 1146 | 0 0 0 0 -0 0 1147 | 1148 | 1149 | model://shaft2.stl 1150 | 0.02 0.02 0.02 1151 | 1152 | 1153 | 1154 | 1 1155 | 1159 | 1160 | __default__ 1161 | 1162 | 0.3 0.3 0.3 1 1163 | 0.7 0.7 0.7 1 1164 | 0.01 0.01 0.01 1 1165 | 0 0 0 1 1166 | 1167 | 0 1168 | 1 1169 | 1170 | 1171 | 0 1172 | 10 1173 | 0 0 0 0 -0 0 1174 | 1175 | 1176 | model://shaft2.stl 1177 | 0.02 0.02 0.02 1178 | 1179 | 1180 | 1181 | 1182 | 1183 | 1 1184 | 1 1185 | 0 0 0 1186 | 0 1187 | 0 1188 | 1189 | 1190 | 1 1191 | 0 1192 | 0 1193 | 1 1194 | 1195 | 0 1196 | 1197 | 1198 | 1199 | 1200 | 0 1201 | 1e+06 1202 | 1203 | 1204 | 0 1205 | 1 1206 | 1 1207 | 1208 | 0 1209 | 0.2 1210 | 1e+13 1211 | 1 1212 | 0.01 1213 | 0 1214 | 1215 | 1216 | 1 1217 | -0.01 1218 | 0 1219 | 0.2 1220 | 1e+13 1221 | 1 1222 | 1223 | 1224 | 1225 | 1226 | 1227 | 0 1228 | 1 1229 | 0.956814 0.402356 0.514998 0 0 0 1230 | 1231 | 1232 | 1233 | -4.15532 2.27229 2.08831 0 0.194049 -0.429965 1234 | orbit 1235 | perspective 1236 | 1237 | 1238 | 1239 | 1240 | --------------------------------------------------------------------------------