├── .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 |
--------------------------------------------------------------------------------