This view is limited to 50 files because it contains too many changes. See the raw diff here.
Files changed (50) hide show
  1. .gitattributes +0 -22
  2. CAMERA_README.md +256 -0
  3. README.md +165 -3
  4. assets/exo_left.urdf +0 -347
  5. assets/exo_right.urdf +0 -347
  6. assets/{g1_29dof_no_hand.xml → g1_29dof_old.xml} +0 -0
  7. assets/g1_29dof_with_hand_original.xml +748 -0
  8. assets/g1_body29_hand14.urdf +0 -1476
  9. assets/meshes_exo_left/part_4.stl +0 -0
  10. assets/meshes_exo_left/shoulder.stl +0 -3
  11. assets/meshes_exo_left/shoulder__2.stl +0 -3
  12. assets/meshes_exo_left/shoulder__3.stl +0 -3
  13. assets/meshes_exo_left/shoulder__4.stl +0 -3
  14. assets/meshes_exo_left/shoulder__5.stl +0 -3
  15. assets/meshes_exo_left/wrist.stl +0 -3
  16. assets/meshes_exo_left/wrist__2.stl +0 -3
  17. assets/meshes_exo_left/wrist__3.stl +0 -3
  18. assets/meshes_exo_left/wrist__4.stl +0 -3
  19. assets/meshes_exo_left/wrist__5.stl +0 -3
  20. assets/meshes_exo_left/wrist__6.stl +0 -3
  21. assets/meshes_exo_left/x.stl +0 -0
  22. assets/meshes_exo_left/y.stl +0 -0
  23. assets/meshes_exo_left/z.stl +0 -0
  24. assets/meshes_exo_right/part_4.stl +0 -0
  25. assets/meshes_exo_right/shoulder.stl +0 -3
  26. assets/meshes_exo_right/shoulder__2.stl +0 -3
  27. assets/meshes_exo_right/shoulder__3.stl +0 -3
  28. assets/meshes_exo_right/shoulder__4.stl +0 -3
  29. assets/meshes_exo_right/shoulder__5.stl +0 -3
  30. assets/meshes_exo_right/wrist.stl +0 -3
  31. assets/meshes_exo_right/wrist__2.stl +0 -3
  32. assets/meshes_exo_right/wrist__3.stl +0 -3
  33. assets/meshes_exo_right/wrist__4.stl +0 -3
  34. assets/meshes_exo_right/wrist__5.stl +0 -3
  35. assets/meshes_exo_right/wrist__6.stl +0 -3
  36. assets/meshes_exo_right/x.stl +0 -0
  37. assets/meshes_exo_right/y.stl +0 -0
  38. assets/meshes_exo_right/z.stl +0 -0
  39. assets/scene_29dof.xml +1 -1
  40. config.yaml +409 -35
  41. env.py +40 -116
  42. run_sim.py +23 -16
  43. sim/base_sim.py +144 -29
  44. sim/image_publish_utils.py +2 -0
  45. sim/metric_utils.py +1 -1
  46. sim/sensor_utils.py +6 -5
  47. sim/{sim_utils.py → sim_utilts.py} +1 -1
  48. sim/simulator_factory.py +90 -0
  49. sim/unitree_sdk2py_bridge.py +73 -27
  50. view_cameras_live.py +1 -1
.gitattributes CHANGED
@@ -86,25 +86,3 @@ assets/meshes/waist_constraint_R.STL filter=lfs diff=lfs merge=lfs -text
86
  assets/meshes/waist_support_link.STL filter=lfs diff=lfs merge=lfs -text
87
  assets/meshes/waist_yaw_link.STL filter=lfs diff=lfs merge=lfs -text
88
  assets/meshes/waist_yaw_link_rev_1_0.STL filter=lfs diff=lfs merge=lfs -text
89
- assets/meshes_exo_left/shoulder__2.stl filter=lfs diff=lfs merge=lfs -text
90
- assets/meshes_exo_left/shoulder__3.stl filter=lfs diff=lfs merge=lfs -text
91
- assets/meshes_exo_left/shoulder__4.stl filter=lfs diff=lfs merge=lfs -text
92
- assets/meshes_exo_left/shoulder__5.stl filter=lfs diff=lfs merge=lfs -text
93
- assets/meshes_exo_left/shoulder.stl filter=lfs diff=lfs merge=lfs -text
94
- assets/meshes_exo_left/wrist__2.stl filter=lfs diff=lfs merge=lfs -text
95
- assets/meshes_exo_left/wrist__3.stl filter=lfs diff=lfs merge=lfs -text
96
- assets/meshes_exo_left/wrist__4.stl filter=lfs diff=lfs merge=lfs -text
97
- assets/meshes_exo_left/wrist__5.stl filter=lfs diff=lfs merge=lfs -text
98
- assets/meshes_exo_left/wrist__6.stl filter=lfs diff=lfs merge=lfs -text
99
- assets/meshes_exo_left/wrist.stl filter=lfs diff=lfs merge=lfs -text
100
- assets/meshes_exo_right/shoulder__2.stl filter=lfs diff=lfs merge=lfs -text
101
- assets/meshes_exo_right/shoulder__3.stl filter=lfs diff=lfs merge=lfs -text
102
- assets/meshes_exo_right/shoulder__4.stl filter=lfs diff=lfs merge=lfs -text
103
- assets/meshes_exo_right/shoulder__5.stl filter=lfs diff=lfs merge=lfs -text
104
- assets/meshes_exo_right/shoulder.stl filter=lfs diff=lfs merge=lfs -text
105
- assets/meshes_exo_right/wrist__2.stl filter=lfs diff=lfs merge=lfs -text
106
- assets/meshes_exo_right/wrist__3.stl filter=lfs diff=lfs merge=lfs -text
107
- assets/meshes_exo_right/wrist__4.stl filter=lfs diff=lfs merge=lfs -text
108
- assets/meshes_exo_right/wrist__5.stl filter=lfs diff=lfs merge=lfs -text
109
- assets/meshes_exo_right/wrist__6.stl filter=lfs diff=lfs merge=lfs -text
110
- assets/meshes_exo_right/wrist.stl filter=lfs diff=lfs merge=lfs -text
 
86
  assets/meshes/waist_support_link.STL filter=lfs diff=lfs merge=lfs -text
87
  assets/meshes/waist_yaw_link.STL filter=lfs diff=lfs merge=lfs -text
88
  assets/meshes/waist_yaw_link_rev_1_0.STL filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
CAMERA_README.md ADDED
@@ -0,0 +1,256 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Camera System for MuJoCo G1 Simulator
2
+
3
+ ## Overview
4
+
5
+ The simulator has two cameras defined:
6
+
7
+ ### 1. **`head_camera`** - Robot Ego-View
8
+ - **Location**: Attached to `torso_link` body
9
+ - **Position**: `[0.06, 0.0, 0.45]` relative to torso (6cm forward, 45cm up)
10
+ - **Orientation**: `euler="0 -0.8 -1.57"` (facing forward, slightly tilted down)
11
+ - **FOV**: 90 degrees
12
+ - **Purpose**: First-person view from the robot's perspective (like a head-mounted camera)
13
+
14
+ ### 2. **`global_view`** - Third-Person View
15
+ - **Location**: Fixed in world coordinates
16
+ - **Position**: `[2.910, -5.040, 3.860]` (behind and above the robot)
17
+ - **Purpose**: External observer view for visualization
18
+
19
+ ## How Camera Publishing Works
20
+
21
+ The camera system uses a **zero-copy architecture** with three components:
22
+
23
+ ```
24
+ ┌─────────────────────┐
25
+ │ MuJoCo Simulator │
26
+ │ (Main Process) │
27
+ │ │
28
+ │ 1. Render cameras │
29
+ │ 2. Copy to shmem │──┐
30
+ └─────────────────────┘ │
31
+ │ Shared Memory
32
+ │ (fast IPC)
33
+ ┌────▼────────────────┐
34
+ │ Image Publisher │
35
+ │ (Subprocess) │
36
+ │ │
37
+ │ 3. Encode images │
38
+ │ 4. ZMQ publish │
39
+ └─────────┬───────────┘
40
+
41
+ │ TCP (ZMQ)
42
+ │ port 5555
43
+
44
+ ┌─────────────────────┐
45
+ │ Your Policy/Client │
46
+ │ (Subscribe) │
47
+ └─────────────────────┘
48
+ ```
49
+
50
+ ### Key Technologies:
51
+ - **MuJoCo Renderer**: Captures RGB images from virtual cameras
52
+ - **Shared Memory (`multiprocessing.shared_memory`)**: Zero-copy transfer between processes
53
+ - **ZMQ (ZeroMQ)**: Network socket for publishing images (TCP)
54
+ - **No ROS2 required!** Pure Python multiprocessing
55
+
56
+ ## Usage
57
+
58
+ ### Basic Simulation (No Camera Publishing)
59
+ ```bash
60
+ python run_sim.py
61
+ ```
62
+
63
+ ### With Camera Publishing
64
+ ```bash
65
+ # Publish head camera on default port 5555
66
+ python run_sim.py --publish-images
67
+
68
+ # Publish multiple cameras
69
+ python run_sim.py --publish-images --cameras head_camera global_view
70
+
71
+ # Custom port
72
+ python run_sim.py --publish-images --camera-port 6000
73
+ ```
74
+
75
+ ### Viewing Camera Streams
76
+
77
+ In a **separate terminal**, run the camera viewer:
78
+
79
+ ```bash
80
+ # Basic usage (default: localhost:5555)
81
+ python view_cameras.py
82
+
83
+ # Custom host/port
84
+ python view_cameras.py --host 192.168.1.100 --port 6000
85
+
86
+ # Save images to directory
87
+ python view_cameras.py --save ./camera_recordings
88
+
89
+ # Adjust display rate
90
+ python view_cameras.py --fps 60
91
+ ```
92
+
93
+ **Keyboard Controls:**
94
+ - `q`: Quit viewer
95
+ - `s`: Save snapshot of current frame
96
+
97
+ **Example Workflow:**
98
+ ```bash
99
+ # Terminal 1: Start simulator with camera publishing
100
+ python run_sim.py --publish-images
101
+
102
+ # Terminal 2: View the camera feed
103
+ python view_cameras.py
104
+ ```
105
+
106
+ ### Receiving Images in Your Code
107
+
108
+ ```python
109
+ import zmq
110
+ import numpy as np
111
+ from gr00t_wbc.control.sensor.sensor_server import ImageMessageSchema
112
+
113
+ # Connect to camera publisher
114
+ context = zmq.Context()
115
+ socket = context.socket(zmq.SUB)
116
+ socket.connect("tcp://localhost:5555")
117
+ socket.setsockopt(zmq.SUBSCRIBE, b"") # Subscribe to all messages
118
+
119
+ while True:
120
+ # Receive serialized image data
121
+ data = socket.recv_pyobj()
122
+
123
+ # Decode images
124
+ if "head_camera" in data:
125
+ # Decode image (returns numpy array HxWx3 uint8)
126
+ img = decode_image(data["head_camera"])
127
+
128
+ # Use image for your policy
129
+ process_observation(img)
130
+ ```
131
+
132
+ ## Camera Configuration
133
+
134
+ Edit `config.yaml` to change camera settings:
135
+
136
+ ```yaml
137
+ IMAGE_DT: 0.033333 # Publishing rate (30 Hz)
138
+ ENABLE_OFFSCREEN: false # Enable for camera rendering
139
+ MP_START_METHOD: "spawn" # Multiprocessing method
140
+ ```
141
+
142
+ Or programmatically in `run_sim.py`:
143
+
144
+ ```python
145
+ camera_configs = {
146
+ "head_camera": {
147
+ "height": 480,
148
+ "width": 640
149
+ },
150
+ "custom_camera": {
151
+ "height": 224,
152
+ "width": 224
153
+ }
154
+ }
155
+ ```
156
+
157
+ ## Adding Custom Cameras
158
+
159
+ Edit `assets/g1_29dof_with_hand.xml` or `assets/scene_43dof.xml`:
160
+
161
+ ```xml
162
+ <!-- Camera attached to robot body -->
163
+ <body name="torso_link" pos="0 0 0.019">
164
+ <camera name="my_camera" pos="0.1 0.0 0.5" euler="0 0 0" fovy="60"/>
165
+ </body>
166
+
167
+ <!-- Camera in world coordinates -->
168
+ <worldbody>
169
+ <camera name="side_view" pos="0 -3.0 1.5" xyaxes="1 0 0 0 0.5 0.866"/>
170
+ </worldbody>
171
+ ```
172
+
173
+ Then publish it:
174
+ ```bash
175
+ python run_sim.py --publish-images --cameras my_camera
176
+ ```
177
+
178
+ ## Performance Notes
179
+
180
+ - **Rendering overhead**: ~5-10ms per camera per frame @ 640x480
181
+ - **Publishing overhead**: ~2-3ms for encoding + network
182
+ - Image publishing runs in **separate subprocess** to not block simulation
183
+ - Uses **shared memory** for fast inter-process image transfer
184
+ - Target: 30 FPS camera publishing while maintaining 500 Hz simulation
185
+
186
+ ## Troubleshooting
187
+
188
+ ### No images received?
189
+ 1. Check if offscreen rendering is enabled (`--publish-images` flag)
190
+ 2. Verify ZMQ port is not blocked
191
+ 3. Check camera exists in scene XML
192
+
193
+ ### Images are delayed?
194
+ - Reduce `IMAGE_DT` in config
195
+ - Lower camera resolution
196
+ - Use fewer cameras
197
+
198
+ ### "Camera not found" error?
199
+ - Verify camera name in XML matches config
200
+ - Check XML syntax is valid
201
+ - Ensure MuJoCo model loads successfully
202
+
203
+ ## Quick Reference
204
+
205
+ ### File Structure
206
+ ```
207
+ mujoco_sim_g1/
208
+ ├── run_sim.py # Simulator launcher
209
+ ├── view_cameras.py # Camera viewer (this file!)
210
+ ├── config.yaml # Simulator config
211
+ ├── assets/
212
+ │ ├── scene_43dof.xml # Scene with global_view camera
213
+ │ └── g1_29dof_with_hand.xml # Robot model with head_camera
214
+ └── sim/
215
+ ├── base_sim.py # MuJoCo environment
216
+ ├── sensor_utils.py # ZMQ camera server/client
217
+ └── image_publish_utils.py # Multiprocessing image publisher
218
+ ```
219
+
220
+ ### Camera Definitions
221
+
222
+ Edit these files to modify cameras:
223
+
224
+ **`assets/g1_29dof_with_hand.xml`** - Robot-attached cameras:
225
+ ```xml
226
+ <body name="torso_link" pos="0 0 0.019">
227
+ <camera name="head_camera" pos="0.06 0.0 0.45" euler="0 -0.8 -1.57" fovy="90"/>
228
+ </body>
229
+ ```
230
+
231
+ **`assets/scene_43dof.xml`** - World-frame cameras:
232
+ ```xml
233
+ <worldbody>
234
+ <camera name="global_view" pos="2.910 -5.040 3.860" xyaxes="0.866 0.500 0.000 -0.250 0.433 0.866" fovy="45"/>
235
+ </worldbody>
236
+ ```
237
+
238
+ ### Complete Example
239
+
240
+ ```bash
241
+ # Terminal 1: Start simulator with camera publishing
242
+ cd mujoco_sim_g1
243
+ python run_sim.py --publish-images --cameras head_camera global_view
244
+
245
+ # Terminal 2: View cameras in real-time
246
+ python view_cameras.py
247
+
248
+ # Terminal 3: Use in your policy (Python code)
249
+ from sim.sensor_utils import SensorClient, ImageUtils
250
+ client = SensorClient()
251
+ client.start_client("localhost", 5555)
252
+ data = client.receive_message()
253
+ img = ImageUtils.decode_image(data["head_camera"])
254
+ # img is now numpy array (H, W, 3) in BGR format
255
+ ```
256
+
README.md CHANGED
@@ -1,5 +1,167 @@
1
- # MuJoCo Sim for Unitree G1
2
 
3
- Standalone MuJoCo physics simulator for the Unitree G1 robot, adapted from gr00t_wbc. Currently supports G1_29dof.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
 
5
- set use joystick to 1 to control the robot
 
1
+ # Standalone MuJoCo Simulator for Unitree G1
2
 
3
+ This is a standalone MuJoCo physics simulator for the Unitree G1 robot, extracted from the GR00T-WholeBodyControl repository.
4
+
5
+ ## Features
6
+
7
+ - **Physics Simulation**: Runs G1 robot in MuJoCo at 500Hz (2ms timestep)
8
+ - **DDS Communication**: Uses Unitree SDK2 DDS for robot communication
9
+ - **Compatible**: Works with existing `unitree_g1.py` control code via DDS
10
+ - **Visualization**: Real-time 3D visualization of robot motion
11
+
12
+ ## Directory Structure
13
+
14
+ ```
15
+ mujoco_sim_g1/
16
+ ├── requirements.txt # Python dependencies
17
+ ├── run_sim.py # Main launcher script
18
+ ├── config.yaml # Simulation configuration
19
+ ├── sim/ # Simulation modules
20
+ │ ├── base_sim.py
21
+ │ ├── simulator_factory.py
22
+ │ ├── unitree_sdk2py_bridge.py
23
+ │ └── ...
24
+ └── assets/ # Robot models
25
+ ├── g1_29dof_with_hand.xml
26
+ └── meshes/*.STL
27
+ ```
28
+
29
+ ## Installation
30
+
31
+ ### 1. Create Virtual Environment (Recommended)
32
+
33
+ ```bash
34
+ cd mujoco_sim_g1
35
+ python3 -m venv venv
36
+ source venv/bin/activate # On Windows: venv\Scripts\activate
37
+ ```
38
+
39
+ ### 2. Install Dependencies
40
+
41
+ ```bash
42
+ pip install -r requirements.txt
43
+ ```
44
+
45
+ **Note**: If you encounter issues with `rclpy`, you can comment out the ROS2 imports in `sim/base_sim.py` (lines 11, 609-617) if you don't need camera publishing.
46
+
47
+ ## Usage
48
+
49
+ ### Basic Usage
50
+
51
+ ```bash
52
+ # Activate environment
53
+ source venv/bin/activate
54
+
55
+ # Run the simulator
56
+ python run_sim.py
57
+ ```
58
+
59
+ The simulator will:
60
+ 1. Load the G1 robot model
61
+ 2. Initialize DDS communication on domain 0
62
+ 3. Open a MuJoCo visualization window
63
+ 4. Start listening for motor commands via DDS
64
+
65
+ ### Running with Your Robot Control Code
66
+
67
+ Once the simulator is running, you can control it from another terminal:
68
+
69
+ ```bash
70
+ # In another terminal
71
+ cd /home/yope/Documents/lerobot
72
+ conda activate unitree_lerobot
73
+
74
+ # Run your existing control code
75
+ python test_locomotion_minimal.py
76
+ ```
77
+
78
+ Your `unitree_g1.py` code will automatically connect to the simulator via DDS!
79
+
80
+ ## Configuration
81
+
82
+ Edit `config.yaml` to customize:
83
+
84
+ - **SIMULATE_DT**: Simulation timestep (default: 0.002s = 500Hz)
85
+ - **DOMAIN_ID**: DDS domain ID (default: 0)
86
+ - **ENABLE_ONSCREEN**: Show visualization (default: true)
87
+ - **USE_JOYSTICK**: Enable gamepad control (default: false)
88
+ - **ROBOT_SCENE**: Path to MuJoCo XML scene
89
+
90
+ ### PD Gains
91
+
92
+ The simulator uses the following PD gains (matching NVIDIA GR00T):
93
+
94
+ **Legs (indices 0-11):**
95
+ - Hip joints: KP=150, KD=2
96
+ - Knee joints: KP=300, KD=4
97
+ - Ankle joints: KP=40, KD=2
98
+
99
+ **Waist (indices 12-14):**
100
+ - All waist joints: KP=250, KD=5
101
+
102
+ **Arms (indices 15-28):**
103
+ - Shoulders: KP=100, KD=2-5
104
+ - Elbows/Wrists: KP=20-40, KD=1-2
105
+
106
+ ## Troubleshooting
107
+
108
+ ### ImportError: cannot import name 'ChannelFactoryInitialize'
109
+
110
+ ```bash
111
+ pip install --upgrade unitree-sdk2py
112
+ ```
113
+
114
+ ### ROS2/rclpy errors
115
+
116
+ If you don't need camera publishing, edit `sim/base_sim.py`:
117
+ - Comment out line 11: `import rclpy`
118
+ - Comment out lines 609-617 (ROS2 initialization)
119
+
120
+ ### Meshes not found
121
+
122
+ Make sure mesh paths in `assets/g1_29dof_with_hand.xml` are relative:
123
+ ```xml
124
+ <mesh file="meshes/pelvis.STL"/> <!-- Not absolute path -->
125
+ ```
126
+
127
+ ### Robot falls immediately
128
+
129
+ Check that:
130
+ 1. PD gains match NVIDIA's values (see config.yaml)
131
+ 2. Velocity command scaling is correct (ang_vel_scale=0.25, cmd_scale=[2.0, 2.0, 0.25])
132
+ 3. Observations for missing joints are zeroed out (indices 12, 14, 20, 21, 27, 28)
133
+
134
+ ## Technical Details
135
+
136
+ ### Communication
137
+
138
+ The simulator publishes:
139
+ - **`rt/lowstate`**: Robot state (joint positions, velocities, IMU, etc.)
140
+ - **`rt/wirelesscontroller`**: Wireless remote controller state (if joystick enabled)
141
+
142
+ The simulator subscribes to:
143
+ - **`rt/lowcmd`**: Motor commands (position, velocity, torque, KP, KD)
144
+
145
+ ### Coordinate Frames
146
+
147
+ - **World frame**: Z-up
148
+ - **Joint ordering**: 29 DOF (12 legs + 3 waist + 14 arms)
149
+ - **IMU**: Quaternion in [w, x, y, z] format
150
+
151
+ ### Performance
152
+
153
+ - Simulation runs at ~500Hz (2ms timestep)
154
+ - Viewer updates at ~50Hz (20ms)
155
+ - Typical CPU usage: 20-40% on single core
156
+
157
+ ## Files from GR00T-WholeBodyControl
158
+
159
+ This standalone simulator was extracted from:
160
+ - `gr00t_wbc/control/envs/g1/sim/` (simulation modules)
161
+ - `gr00t_wbc/control/robot_model/model_data/g1/` (robot model files)
162
+ - `gr00t_wbc/control/main/teleop/configs/g1_29dof_gear_wbc.yaml` (configuration)
163
+
164
+ ## License
165
+
166
+ Follows the license of the original GR00T-WholeBodyControl repository.
167
 
 
assets/exo_left.urdf DELETED
@@ -1,347 +0,0 @@
1
- <?xml version="1.0" ?>
2
- <!-- Generated using onshape-to-robot -->
3
- <!-- Onshape https://cad.onshape.com/documents/30647899d0efca800f6a0b61/w/6367c32608b1610b986f4220/e/82448bde0644faba4511c9d2 -->
4
- <robot name="my-robot">
5
- <link name="base_link"/>
6
- <joint name="base_to_shoulder_pitch" type="fixed">
7
- <origin xyz="-0.600072 -0.15 0.3178" rpy="0 0 0"/>
8
- <parent link="base_link"/>
9
- <child link="shoulder_pitch"/>
10
- </joint>
11
- <!-- Link shoulder_pitch -->
12
- <link name="shoulder_pitch">
13
- <inertial>
14
- <origin xyz="0 0 0" rpy="0 0 0"/>
15
- <mass value="1e-09"/>
16
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
17
- </inertial>
18
- <!-- Part shoulder -->
19
- <visual>
20
- <origin xyz="-0.319917 -0.188041 -0.0739695" rpy="1.73941e-11 -2.77556e-17 -3.14159"/>
21
- <geometry>
22
- <mesh filename="package://meshes_exo_left/shoulder.stl"/>
23
- </geometry>
24
- <material name="shoulder_material">
25
- <color rgba="1 1 1 1"/>
26
- </material>
27
- </visual>
28
- <collision>
29
- <origin xyz="-0.319917 -0.188041 -0.0739695" rpy="1.73941e-11 -2.77556e-17 -3.14159"/>
30
- <geometry>
31
- <mesh filename="package://meshes_exo_left/shoulder.stl"/>
32
- </geometry>
33
- </collision>
34
- <!-- Part shoulder_2 -->
35
- <visual>
36
- <origin xyz="-0.319917 -0.188041 -0.0739695" rpy="1.73941e-11 1.7367e-11 3.14159"/>
37
- <geometry>
38
- <mesh filename="package://meshes_exo_left/shoulder__2.stl"/>
39
- </geometry>
40
- <material name="shoulder_2_material">
41
- <color rgba="1 1 1 1"/>
42
- </material>
43
- </visual>
44
- <collision>
45
- <origin xyz="-0.319917 -0.188041 -0.0739695" rpy="1.73941e-11 1.7367e-11 3.14159"/>
46
- <geometry>
47
- <mesh filename="package://meshes_exo_left/shoulder__2.stl"/>
48
- </geometry>
49
- </collision>
50
- </link>
51
- <!-- Link shoulder_yaw -->
52
- <link name="shoulder_yaw">
53
- <inertial>
54
- <origin xyz="0 0 0" rpy="0 0 0"/>
55
- <mass value="1e-09"/>
56
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
57
- </inertial>
58
- <!-- Part shoulder_3 -->
59
- <visual>
60
- <origin xyz="0.337111 0.085895 0.174004" rpy="1.5708 4.85145e-12 -5.68355e-18"/>
61
- <geometry>
62
- <mesh filename="package://meshes_exo_left/shoulder__3.stl"/>
63
- </geometry>
64
- <material name="shoulder_3_material">
65
- <color rgba="1 1 1 1"/>
66
- </material>
67
- </visual>
68
- <collision>
69
- <origin xyz="0.337111 0.085895 0.174004" rpy="1.5708 4.85145e-12 -5.68355e-18"/>
70
- <geometry>
71
- <mesh filename="package://meshes_exo_left/shoulder__3.stl"/>
72
- </geometry>
73
- </collision>
74
- </link>
75
- <!-- Link shoulder_roll -->
76
- <link name="shoulder_roll">
77
- <inertial>
78
- <origin xyz="0 0 0" rpy="0 0 0"/>
79
- <mass value="1e-09"/>
80
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
81
- </inertial>
82
- <!-- Part shoulder_4 -->
83
- <visual>
84
- <origin xyz="0.188947 -0.0970719 0.361641" rpy="-1.62911 -1.5708 0"/>
85
- <geometry>
86
- <mesh filename="package://meshes_exo_left/shoulder__4.stl"/>
87
- </geometry>
88
- <material name="shoulder_4_material">
89
- <color rgba="1 1 1 1"/>
90
- </material>
91
- </visual>
92
- <collision>
93
- <origin xyz="0.188947 -0.0970719 0.361641" rpy="-1.62911 -1.5708 0"/>
94
- <geometry>
95
- <mesh filename="package://meshes_exo_left/shoulder__4.stl"/>
96
- </geometry>
97
- </collision>
98
- </link>
99
- <!-- Link elbow_flex -->
100
- <link name="elbow_flex">
101
- <inertial>
102
- <origin xyz="0 0 0" rpy="0 0 0"/>
103
- <mass value="1e-09"/>
104
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
105
- </inertial>
106
- <!-- Part shoulder_5 -->
107
- <visual>
108
- <origin xyz="0.358661 0.193894 -0.0611064" rpy="1.78388e-17 2.53007e-17 3.50616e-18"/>
109
- <geometry>
110
- <mesh filename="package://meshes_exo_left/shoulder__5.stl"/>
111
- </geometry>
112
- <material name="shoulder_5_material">
113
- <color rgba="1 1 1 1"/>
114
- </material>
115
- </visual>
116
- <collision>
117
- <origin xyz="0.358661 0.193894 -0.0611064" rpy="1.78388e-17 2.53007e-17 3.50616e-18"/>
118
- <geometry>
119
- <mesh filename="package://meshes_exo_left/shoulder__5.stl"/>
120
- </geometry>
121
- </collision>
122
- </link>
123
- <!-- Link wrist_roll -->
124
- <link name="wrist_roll">
125
- <inertial>
126
- <origin xyz="0 0 0" rpy="0 0 0"/>
127
- <mass value="1e-09"/>
128
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
129
- </inertial>
130
- <!-- Part wrist -->
131
- <visual>
132
- <origin xyz="0.370176 -0.154734 0.203442" rpy="1.5708 2.12442e-12 0.0687143"/>
133
- <geometry>
134
- <mesh filename="package://meshes_exo_left/wrist.stl"/>
135
- </geometry>
136
- <material name="wrist_material">
137
- <color rgba="1 1 1 1"/>
138
- </material>
139
- </visual>
140
- <collision>
141
- <origin xyz="0.370176 -0.154734 0.203442" rpy="1.5708 2.12442e-12 0.0687143"/>
142
- <geometry>
143
- <mesh filename="package://meshes_exo_left/wrist.stl"/>
144
- </geometry>
145
- </collision>
146
- </link>
147
- <!-- Link end_effector -->
148
- <link name="end_effector">
149
- <inertial>
150
- <origin xyz="0 0 0" rpy="0 0 0"/>
151
- <mass value="1e-09"/>
152
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
153
- </inertial>
154
- <!-- Part wrist_2 -->
155
- <visual>
156
- <origin xyz="0.189619 0.17695 -0.583114" rpy="0.0540298 1.5708 0"/>
157
- <geometry>
158
- <mesh filename="package://meshes_exo_left/wrist__2.stl"/>
159
- </geometry>
160
- <material name="wrist_2_material">
161
- <color rgba="0.964706 0.964706 0.952941 1"/>
162
- </material>
163
- </visual>
164
- <collision>
165
- <origin xyz="0.189619 0.17695 -0.583114" rpy="0.0540298 1.5708 0"/>
166
- <geometry>
167
- <mesh filename="package://meshes_exo_left/wrist__2.stl"/>
168
- </geometry>
169
- </collision>
170
- <!-- Part wrist_3 -->
171
- <visual>
172
- <origin xyz="0.189345 0.176964 -0.583114" rpy="0.0540298 1.5708 0"/>
173
- <geometry>
174
- <mesh filename="package://meshes_exo_left/wrist__3.stl"/>
175
- </geometry>
176
- <material name="wrist_3_material">
177
- <color rgba="1 1 1 1"/>
178
- </material>
179
- </visual>
180
- <collision>
181
- <origin xyz="0.189345 0.176964 -0.583114" rpy="0.0540298 1.5708 0"/>
182
- <geometry>
183
- <mesh filename="package://meshes_exo_left/wrist__3.stl"/>
184
- </geometry>
185
- </collision>
186
- <!-- Part wrist_4 -->
187
- <visual>
188
- <origin xyz="0.192193 0.173682 -0.583216" rpy="0.0688698 1.5708 0"/>
189
- <geometry>
190
- <mesh filename="package://meshes_exo_left/wrist__4.stl"/>
191
- </geometry>
192
- <material name="wrist_4_material">
193
- <color rgba="1 1 1 1"/>
194
- </material>
195
- </visual>
196
- <collision>
197
- <origin xyz="0.192193 0.173682 -0.583216" rpy="0.0688698 1.5708 0"/>
198
- <geometry>
199
- <mesh filename="package://meshes_exo_left/wrist__4.stl"/>
200
- </geometry>
201
- </collision>
202
- <!-- Part wrist_5 -->
203
- <visual>
204
- <origin xyz="0.189768 0.177109 -0.583122" rpy="-1.57084 1.57074 -1.62483"/>
205
- <geometry>
206
- <mesh filename="package://meshes_exo_left/wrist__5.stl"/>
207
- </geometry>
208
- <material name="wrist_5_material">
209
- <color rgba="0.964706 0.964706 0.952941 1"/>
210
- </material>
211
- </visual>
212
- <collision>
213
- <origin xyz="0.189768 0.177109 -0.583122" rpy="-1.57084 1.57074 -1.62483"/>
214
- <geometry>
215
- <mesh filename="package://meshes_exo_left/wrist__5.stl"/>
216
- </geometry>
217
- </collision>
218
- <!-- Part wrist_6 -->
219
- <visual>
220
- <origin xyz="0.189348 0.177132 -0.583124" rpy="-1.57084 1.57074 -1.62483"/>
221
- <geometry>
222
- <mesh filename="package://meshes_exo_left/wrist__6.stl"/>
223
- </geometry>
224
- <material name="wrist_6_material">
225
- <color rgba="0.964706 0.964706 0.952941 1"/>
226
- </material>
227
- </visual>
228
- <collision>
229
- <origin xyz="0.189348 0.177132 -0.583124" rpy="-1.57084 1.57074 -1.62483"/>
230
- <geometry>
231
- <mesh filename="package://meshes_exo_left/wrist__6.stl"/>
232
- </geometry>
233
- </collision>
234
- <!-- Part z -->
235
- <visual>
236
- <origin xyz="0.0115311 0.0274691 0.0397266" rpy="3.08756 -1.5708 0"/>
237
- <geometry>
238
- <mesh filename="package://meshes_exo_left/z.stl"/>
239
- </geometry>
240
- <material name="z_material">
241
- <color rgba="0.231373 0.380392 0.705882 1"/>
242
- </material>
243
- </visual>
244
- <collision>
245
- <origin xyz="0.0115311 0.0274691 0.0397266" rpy="3.08756 -1.5708 0"/>
246
- <geometry>
247
- <mesh filename="package://meshes_exo_left/z.stl"/>
248
- </geometry>
249
- </collision>
250
- <!-- Part y -->
251
- <visual>
252
- <origin xyz="0.0115311 0.0274691 0.0397266" rpy="3.08756 -1.5708 0"/>
253
- <geometry>
254
- <mesh filename="package://meshes_exo_left/y.stl"/>
255
- </geometry>
256
- <material name="y_material">
257
- <color rgba="0.372549 0.654902 0.239216 1"/>
258
- </material>
259
- </visual>
260
- <collision>
261
- <origin xyz="0.0115311 0.0274691 0.0397266" rpy="3.08756 -1.5708 0"/>
262
- <geometry>
263
- <mesh filename="package://meshes_exo_left/y.stl"/>
264
- </geometry>
265
- </collision>
266
- <!-- Part part_4 -->
267
- <visual>
268
- <origin xyz="0.0115311 0.0274691 0.0397266" rpy="3.08756 -1.5708 0"/>
269
- <geometry>
270
- <mesh filename="package://meshes_exo_left/part_4.stl"/>
271
- </geometry>
272
- <material name="part_4_material">
273
- <color rgba="0.917647 0.917647 0.917647 1"/>
274
- </material>
275
- </visual>
276
- <collision>
277
- <origin xyz="0.0115311 0.0274691 0.0397266" rpy="3.08756 -1.5708 0"/>
278
- <geometry>
279
- <mesh filename="package://meshes_exo_left/part_4.stl"/>
280
- </geometry>
281
- </collision>
282
- <!-- Part x -->
283
- <visual>
284
- <origin xyz="0.0115311 0.0274691 0.0397266" rpy="3.08756 -1.5708 0"/>
285
- <geometry>
286
- <mesh filename="package://meshes_exo_left/x.stl"/>
287
- </geometry>
288
- <material name="x_material">
289
- <color rgba="1 0 0 1"/>
290
- </material>
291
- </visual>
292
- <collision>
293
- <origin xyz="0.0115311 0.0274691 0.0397266" rpy="3.08756 -1.5708 0"/>
294
- <geometry>
295
- <mesh filename="package://meshes_exo_left/x.stl"/>
296
- </geometry>
297
- </collision>
298
- </link>
299
- <!-- Joint from wrist_roll to end_effector -->
300
- <joint name="wrist_roll" type="revolute">
301
- <origin xyz="-0.224547 -0.0154537 0.0169453" rpy="1.5708 0.139345 -1.50208"/>
302
- <parent link="wrist_roll"/>
303
- <child link="end_effector"/>
304
- <axis xyz="0 0 1"/>
305
- <limit effort="10" velocity="10" lower="-0.716528" upper="0.854268"/>
306
- </joint>
307
- <!-- Joint from elbow_flex to wrist_roll -->
308
- <joint name="elbow_flex" type="revolute">
309
- <origin xyz="-1.7424e-05 -0.00788072 -0.240892" rpy="-1.5708 2.53007e-17 3.50616e-18"/>
310
- <parent link="elbow_flex"/>
311
- <child link="wrist_roll"/>
312
- <axis xyz="0 0 1"/>
313
- <limit effort="10" velocity="10" lower="-1.11591" upper="1.32755"/>
314
- </joint>
315
- <!-- Joint from shoulder_roll to elbow_flex -->
316
- <joint name="shoulder_roll" type="revolute">
317
- <origin xyz="-0.00144298 -0.0247172 0.00296278" rpy="-1.5708 -1.56793 -0.0583134"/>
318
- <parent link="shoulder_roll"/>
319
- <child link="elbow_flex"/>
320
- <axis xyz="0 0 1"/>
321
- <limit effort="10" velocity="10" lower="-1.57366" upper="1.56793"/>
322
- </joint>
323
- <!-- Joint from shoulder_yaw to shoulder_roll -->
324
- <joint name="shoulder_yaw" type="revolute">
325
- <origin xyz="-0.0247593 7.34308e-15 -0.0202799" rpy="3.14159 -1.5708 0"/>
326
- <parent link="shoulder_yaw"/>
327
- <child link="shoulder_roll"/>
328
- <axis xyz="0 0 1"/>
329
- <limit effort="10" velocity="10" lower="-0.290752" upper="1.62911"/>
330
- </joint>
331
- <!-- Joint from shoulder_pitch to shoulder_yaw -->
332
- <joint name="shoulder_pitch" type="revolute">
333
- <origin xyz="0.017217 -0.0139551 0.0119912" rpy="-1.5708 0.142264 -3.14159"/>
334
- <parent link="shoulder_pitch"/>
335
- <child link="shoulder_yaw"/>
336
- <axis xyz="0 0 1"/>
337
- <limit effort="10" velocity="10" lower="-1.18946" upper="1.254"/>
338
- </joint>
339
- <link name="ee"/>
340
-
341
- <joint name="end_effector_to_ee" type="fixed">
342
- <parent link="end_effector"/>
343
- <child link="ee"/>
344
- <!-- rotate tcp here -->
345
- <origin xyz="0 0 0" rpy="1.5708 -1.5708 1.5708"/>
346
- </joint>
347
- </robot>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/exo_right.urdf DELETED
@@ -1,347 +0,0 @@
1
- <?xml version="1.0" ?>
2
- <!-- Generated using onshape-to-robot -->
3
- <!-- Onshape https://cad.onshape.com/documents/30647899d0efca800f6a0b61/w/6367c32608b1610b986f4220/e/82448bde0644faba4511c9d2 -->
4
- <robot name="my-robot-right">
5
- <link name="base_link"/>
6
- <joint name="base_to_shoulder_pitch" type="fixed">
7
- <origin xyz="-0.60072 0.15 0.3178" rpy="-0.0 0.0 -0.0"/>
8
- <parent link="base_link"/>
9
- <child link="shoulder_pitch"/>
10
- </joint>
11
- <!-- Link shoulder_pitch -->
12
- <link name="shoulder_pitch">
13
- <inertial>
14
- <origin xyz="0.0 -0.0 0.0" rpy="-0.0 0.0 -0.0"/>
15
- <mass value="1e-09"/>
16
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
17
- </inertial>
18
- <!-- Part shoulder -->
19
- <visual>
20
- <origin xyz="-0.319917 0.188041 -0.0739695" rpy="-1.73941e-11 -2.77556e-17 3.14159"/>
21
- <geometry>
22
- <mesh filename="package://meshes_exo_right/shoulder.stl"/>
23
- </geometry>
24
- <material name="shoulder_material">
25
- <color rgba="1 1 1 1"/>
26
- </material>
27
- </visual>
28
- <collision>
29
- <origin xyz="-0.319917 0.188041 -0.0739695" rpy="-1.73941e-11 -2.77556e-17 3.14159"/>
30
- <geometry>
31
- <mesh filename="package://meshes_exo_right/shoulder.stl"/>
32
- </geometry>
33
- </collision>
34
- <!-- Part shoulder_2 -->
35
- <visual>
36
- <origin xyz="-0.319917 0.188041 -0.0739695" rpy="-1.73941e-11 1.7367e-11 -3.14159"/>
37
- <geometry>
38
- <mesh filename="package://meshes_exo_right/shoulder__2.stl"/>
39
- </geometry>
40
- <material name="shoulder_2_material">
41
- <color rgba="1 1 1 1"/>
42
- </material>
43
- </visual>
44
- <collision>
45
- <origin xyz="-0.319917 0.188041 -0.0739695" rpy="-1.73941e-11 1.7367e-11 -3.14159"/>
46
- <geometry>
47
- <mesh filename="package://meshes_exo_right/shoulder__2.stl"/>
48
- </geometry>
49
- </collision>
50
- </link>
51
- <!-- Link shoulder_yaw -->
52
- <link name="shoulder_yaw">
53
- <inertial>
54
- <origin xyz="0.0 -0.0 0.0" rpy="-0.0 0.0 -0.0"/>
55
- <mass value="1e-09"/>
56
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
57
- </inertial>
58
- <!-- Part shoulder_3 -->
59
- <visual>
60
- <origin xyz="0.337111 -0.085895 0.174004" rpy="-1.5708 4.85145e-12 5.68355e-18"/>
61
- <geometry>
62
- <mesh filename="package://meshes_exo_right/shoulder__3.stl"/>
63
- </geometry>
64
- <material name="shoulder_3_material">
65
- <color rgba="1 1 1 1"/>
66
- </material>
67
- </visual>
68
- <collision>
69
- <origin xyz="0.337111 -0.085895 0.174004" rpy="-1.5708 4.85145e-12 5.68355e-18"/>
70
- <geometry>
71
- <mesh filename="package://meshes_exo_right/shoulder__3.stl"/>
72
- </geometry>
73
- </collision>
74
- </link>
75
- <!-- Link shoulder_roll -->
76
- <link name="shoulder_roll">
77
- <inertial>
78
- <origin xyz="0.0 -0.0 0.0" rpy="-0.0 0.0 -0.0"/>
79
- <mass value="1e-09"/>
80
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
81
- </inertial>
82
- <!-- Part shoulder_4 -->
83
- <visual>
84
- <origin xyz="0.188947 0.0970719 0.361641" rpy="1.62911 -1.5708 -0.0"/>
85
- <geometry>
86
- <mesh filename="package://meshes_exo_right/shoulder__4.stl"/>
87
- </geometry>
88
- <material name="shoulder_4_material">
89
- <color rgba="1 1 1 1"/>
90
- </material>
91
- </visual>
92
- <collision>
93
- <origin xyz="0.188947 0.0970719 0.361641" rpy="1.62911 -1.5708 -0.0"/>
94
- <geometry>
95
- <mesh filename="package://meshes_exo_right/shoulder__4.stl"/>
96
- </geometry>
97
- </collision>
98
- </link>
99
- <!-- Link elbow_flex -->
100
- <link name="elbow_flex">
101
- <inertial>
102
- <origin xyz="0.0 -0.0 0.0" rpy="-0.0 0.0 -0.0"/>
103
- <mass value="1e-09"/>
104
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
105
- </inertial>
106
- <!-- Part shoulder_5 -->
107
- <visual>
108
- <origin xyz="0.358661 -0.193894 -0.0611064" rpy="-1.78388e-17 2.53007e-17 -3.50616e-18"/>
109
- <geometry>
110
- <mesh filename="package://meshes_exo_right/shoulder__5.stl"/>
111
- </geometry>
112
- <material name="shoulder_5_material">
113
- <color rgba="1 1 1 1"/>
114
- </material>
115
- </visual>
116
- <collision>
117
- <origin xyz="0.358661 -0.193894 -0.0611064" rpy="-1.78388e-17 2.53007e-17 -3.50616e-18"/>
118
- <geometry>
119
- <mesh filename="package://meshes_exo_right/shoulder__5.stl"/>
120
- </geometry>
121
- </collision>
122
- </link>
123
- <!-- Link wrist_roll -->
124
- <link name="wrist_roll">
125
- <inertial>
126
- <origin xyz="0.0 -0.0 0.0" rpy="-0.0 0.0 -0.0"/>
127
- <mass value="1e-09"/>
128
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
129
- </inertial>
130
- <!-- Part wrist -->
131
- <visual>
132
- <origin xyz="0.370176 0.154734 0.203442" rpy="-1.5708 2.12442e-12 -0.0687143"/>
133
- <geometry>
134
- <mesh filename="package://meshes_exo_right/wrist.stl"/>
135
- </geometry>
136
- <material name="wrist_material">
137
- <color rgba="1 1 1 1"/>
138
- </material>
139
- </visual>
140
- <collision>
141
- <origin xyz="0.370176 0.154734 0.203442" rpy="-1.5708 2.12442e-12 -0.0687143"/>
142
- <geometry>
143
- <mesh filename="package://meshes_exo_right/wrist.stl"/>
144
- </geometry>
145
- </collision>
146
- </link>
147
- <!-- Link end_effector -->
148
- <link name="end_effector">
149
- <inertial>
150
- <origin xyz="0.0 -0.0 0.0" rpy="-0.0 0.0 -0.0"/>
151
- <mass value="1e-09"/>
152
- <inertia ixx="1e-09" ixy="0" ixz="0" iyy="1e-09" iyz="0" izz="1e-09"/>
153
- </inertial>
154
- <!-- Part wrist_2 -->
155
- <visual>
156
- <origin xyz="0.189619 -0.17695 -0.583114" rpy="-0.0540298 1.5708 -0.0"/>
157
- <geometry>
158
- <mesh filename="package://meshes_exo_right/wrist__2.stl"/>
159
- </geometry>
160
- <material name="wrist_2_material">
161
- <color rgba="0.964706 0.964706 0.952941 1"/>
162
- </material>
163
- </visual>
164
- <collision>
165
- <origin xyz="0.189619 -0.17695 -0.583114" rpy="-0.0540298 1.5708 -0.0"/>
166
- <geometry>
167
- <mesh filename="package://meshes_exo_right/wrist__2.stl"/>
168
- </geometry>
169
- </collision>
170
- <!-- Part wrist_3 -->
171
- <visual>
172
- <origin xyz="0.189345 -0.176964 -0.583114" rpy="-0.0540298 1.5708 -0.0"/>
173
- <geometry>
174
- <mesh filename="package://meshes_exo_right/wrist__3.stl"/>
175
- </geometry>
176
- <material name="wrist_3_material">
177
- <color rgba="1 1 1 1"/>
178
- </material>
179
- </visual>
180
- <collision>
181
- <origin xyz="0.189345 -0.176964 -0.583114" rpy="-0.0540298 1.5708 -0.0"/>
182
- <geometry>
183
- <mesh filename="package://meshes_exo_right/wrist__3.stl"/>
184
- </geometry>
185
- </collision>
186
- <!-- Part wrist_4 -->
187
- <visual>
188
- <origin xyz="0.192193 -0.173682 -0.583216" rpy="-0.0688698 1.5708 -0.0"/>
189
- <geometry>
190
- <mesh filename="package://meshes_exo_right/wrist__4.stl"/>
191
- </geometry>
192
- <material name="wrist_4_material">
193
- <color rgba="1 1 1 1"/>
194
- </material>
195
- </visual>
196
- <collision>
197
- <origin xyz="0.192193 -0.173682 -0.583216" rpy="-0.0688698 1.5708 -0.0"/>
198
- <geometry>
199
- <mesh filename="package://meshes_exo_right/wrist__4.stl"/>
200
- </geometry>
201
- </collision>
202
- <!-- Part wrist_5 -->
203
- <visual>
204
- <origin xyz="0.189768 -0.177109 -0.583122" rpy="1.57084 1.57074 1.62483"/>
205
- <geometry>
206
- <mesh filename="package://meshes_exo_right/wrist__5.stl"/>
207
- </geometry>
208
- <material name="wrist_5_material">
209
- <color rgba="0.964706 0.964706 0.952941 1"/>
210
- </material>
211
- </visual>
212
- <collision>
213
- <origin xyz="0.189768 -0.177109 -0.583122" rpy="1.57084 1.57074 1.62483"/>
214
- <geometry>
215
- <mesh filename="package://meshes_exo_right/wrist__5.stl"/>
216
- </geometry>
217
- </collision>
218
- <!-- Part wrist_6 -->
219
- <visual>
220
- <origin xyz="0.189348 -0.177132 -0.583124" rpy="1.57084 1.57074 1.62483"/>
221
- <geometry>
222
- <mesh filename="package://meshes_exo_right/wrist__6.stl"/>
223
- </geometry>
224
- <material name="wrist_6_material">
225
- <color rgba="0.964706 0.964706 0.952941 1"/>
226
- </material>
227
- </visual>
228
- <collision>
229
- <origin xyz="0.189348 -0.177132 -0.583124" rpy="1.57084 1.57074 1.62483"/>
230
- <geometry>
231
- <mesh filename="package://meshes_exo_right/wrist__6.stl"/>
232
- </geometry>
233
- </collision>
234
- <!-- Part z -->
235
- <visual>
236
- <origin xyz="0.0115311 -0.0274691 0.0397266" rpy="-3.08756 -1.5708 -0.0"/>
237
- <geometry>
238
- <mesh filename="package://meshes_exo_right/z.stl"/>
239
- </geometry>
240
- <material name="z_material">
241
- <color rgba="0.231373 0.380392 0.705882 1"/>
242
- </material>
243
- </visual>
244
- <collision>
245
- <origin xyz="0.0115311 -0.0274691 0.0397266" rpy="-3.08756 -1.5708 -0.0"/>
246
- <geometry>
247
- <mesh filename="package://meshes_exo_right/z.stl"/>
248
- </geometry>
249
- </collision>
250
- <!-- Part y -->
251
- <visual>
252
- <origin xyz="0.0115311 -0.0274691 0.0397266" rpy="-3.08756 -1.5708 -0.0"/>
253
- <geometry>
254
- <mesh filename="package://meshes_exo_right/y.stl"/>
255
- </geometry>
256
- <material name="y_material">
257
- <color rgba="0.372549 0.654902 0.239216 1"/>
258
- </material>
259
- </visual>
260
- <collision>
261
- <origin xyz="0.0115311 -0.0274691 0.0397266" rpy="-3.08756 -1.5708 -0.0"/>
262
- <geometry>
263
- <mesh filename="package://meshes_exo_right/y.stl"/>
264
- </geometry>
265
- </collision>
266
- <!-- Part part_4 -->
267
- <visual>
268
- <origin xyz="0.0115311 -0.0274691 0.0397266" rpy="-3.08756 -1.5708 -0.0"/>
269
- <geometry>
270
- <mesh filename="package://meshes_exo_right/part_4.stl"/>
271
- </geometry>
272
- <material name="part_4_material">
273
- <color rgba="0.917647 0.917647 0.917647 1"/>
274
- </material>
275
- </visual>
276
- <collision>
277
- <origin xyz="0.0115311 -0.0274691 0.0397266" rpy="-3.08756 -1.5708 -0.0"/>
278
- <geometry>
279
- <mesh filename="package://meshes_exo_right/part_4.stl"/>
280
- </geometry>
281
- </collision>
282
- <!-- Part x -->
283
- <visual>
284
- <origin xyz="0.0115311 -0.0274691 0.0397266" rpy="-3.08756 -1.5708 -0.0"/>
285
- <geometry>
286
- <mesh filename="package://meshes_exo_right/x.stl"/>
287
- </geometry>
288
- <material name="x_material">
289
- <color rgba="1 0 0 1"/>
290
- </material>
291
- </visual>
292
- <collision>
293
- <origin xyz="0.0115311 -0.0274691 0.0397266" rpy="-3.08756 -1.5708 -0.0"/>
294
- <geometry>
295
- <mesh filename="package://meshes_exo_right/x.stl"/>
296
- </geometry>
297
- </collision>
298
- </link>
299
- <!-- Joint from wrist_roll to end_effector -->
300
- <joint name="wrist_roll" type="revolute">
301
- <origin xyz="-0.224547 0.0154537 0.0169453" rpy="-1.5708 0.139345 1.50208"/>
302
- <parent link="wrist_roll"/>
303
- <child link="end_effector"/>
304
- <axis xyz="0 0 1"/>
305
- <limit effort="10" velocity="10" lower="-0.716528" upper="0.854268"/>
306
- </joint>
307
- <!-- Joint from elbow_flex to wrist_roll -->
308
- <joint name="elbow_flex" type="revolute">
309
- <origin xyz="-1.7424e-05 0.00788072 -0.240892" rpy="1.5708 2.53007e-17 -3.50616e-18"/>
310
- <parent link="elbow_flex"/>
311
- <child link="wrist_roll"/>
312
- <axis xyz="0 0 1"/>
313
- <limit effort="10" velocity="10" lower="-1.11591" upper="1.32755"/>
314
- </joint>
315
- <!-- Joint from shoulder_roll to elbow_flex -->
316
- <joint name="shoulder_roll" type="revolute">
317
- <origin xyz="-0.00144298 0.0247172 0.00296278" rpy="1.5708 -1.56793 0.0583134"/>
318
- <parent link="shoulder_roll"/>
319
- <child link="elbow_flex"/>
320
- <axis xyz="0 0 1"/>
321
- <limit effort="10" velocity="10" lower="-1.57366" upper="1.56793"/>
322
- </joint>
323
- <!-- Joint from shoulder_yaw to shoulder_roll -->
324
- <joint name="shoulder_yaw" type="revolute">
325
- <origin xyz="-0.0247593 -7.34308e-15 -0.0202799" rpy="-3.14159 -1.5708 -0.0"/>
326
- <parent link="shoulder_yaw"/>
327
- <child link="shoulder_roll"/>
328
- <axis xyz="0 0 1"/>
329
- <limit effort="10" velocity="10" lower="-0.290752" upper="1.62911"/>
330
- </joint>
331
- <!-- Joint from shoulder_pitch to shoulder_yaw -->
332
- <joint name="shoulder_pitch" type="revolute">
333
- <origin xyz="0.017217 0.0139551 0.0119912" rpy="1.5708 0.142264 3.14159"/>
334
- <parent link="shoulder_pitch"/>
335
- <child link="shoulder_yaw"/>
336
- <axis xyz="0 0 1"/>
337
- <limit effort="10" velocity="10" lower="-1.18946" upper="1.254"/>
338
- </joint>
339
- <link name="ee"/>
340
-
341
- <joint name="end_effector_to_ee" type="fixed">
342
- <parent link="end_effector"/>
343
- <child link="ee"/>
344
- <!-- rotate tcp here -->
345
- <origin xyz="0.0 -0.0 0.0" rpy="-1.5708 -1.5708 -1.5708"/>
346
- </joint>
347
- </robot>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/{g1_29dof_no_hand.xml → g1_29dof_old.xml} RENAMED
File without changes
assets/g1_29dof_with_hand_original.xml ADDED
@@ -0,0 +1,748 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <mujoco model="g1_29dof_with_hand">
2
+ <compiler angle="radian" meshdir="meshes" />
3
+
4
+ <default>
5
+ <default class="torso_motor">
6
+ <joint damping="0.05" armature="0.01" frictionloss="0.2"/>
7
+ </default>
8
+ <default class="leg_motor">
9
+ <joint damping="0.05" armature="0.01" frictionloss="0.2"/>
10
+ </default>
11
+ <default class="ankle_motor">
12
+ <joint damping="0.05" armature="0.01" frictionloss="0.2"/>
13
+ </default>
14
+ <default class="arm_motor">
15
+ <joint damping="0.05" armature="0.01" frictionloss="0.2"/>
16
+ </default>
17
+ <default class="wrist_motor">
18
+ <joint damping="0.05" armature="0.01" frictionloss="0.1"/>
19
+ </default>
20
+ <default class="finger_motor">
21
+ <joint damping="0.05" armature="0.01" frictionloss="0.1"/>
22
+ </default>
23
+ </default>
24
+ <asset>
25
+ <mesh name="pelvis" file="pelvis.STL" />
26
+ <mesh name="pelvis_contour_link" file="pelvis_contour_link.STL" />
27
+ <mesh name="left_hip_pitch_link" file="left_hip_pitch_link.STL" />
28
+ <mesh name="left_hip_roll_link" file="left_hip_roll_link.STL" />
29
+ <mesh name="left_hip_yaw_link" file="left_hip_yaw_link.STL" />
30
+ <mesh name="left_knee_link" file="left_knee_link.STL" />
31
+ <mesh name="left_ankle_pitch_link" file="left_ankle_pitch_link.STL" />
32
+ <mesh name="left_ankle_roll_link" file="left_ankle_roll_link.STL" />
33
+ <mesh name="right_hip_pitch_link" file="right_hip_pitch_link.STL" />
34
+ <mesh name="right_hip_roll_link" file="right_hip_roll_link.STL" />
35
+ <mesh name="right_hip_yaw_link" file="right_hip_yaw_link.STL" />
36
+ <mesh name="right_knee_link" file="right_knee_link.STL" />
37
+ <mesh name="right_ankle_pitch_link" file="right_ankle_pitch_link.STL" />
38
+ <mesh name="right_ankle_roll_link" file="right_ankle_roll_link.STL" />
39
+ <mesh name="waist_yaw_link" file="waist_yaw_link.STL" />
40
+ <mesh name="waist_roll_link" file="waist_roll_link.STL" />
41
+ <mesh name="torso_link" file="torso_link.STL" />
42
+ <mesh name="logo_link" file="logo_link.STL" />
43
+ <mesh name="head_link" file="head_link.STL" />
44
+ <mesh name="waist_support_link" file="waist_support_link.STL" />
45
+ <mesh name="left_shoulder_pitch_link" file="left_shoulder_pitch_link.STL" />
46
+ <mesh name="left_shoulder_roll_link" file="left_shoulder_roll_link.STL" />
47
+ <mesh name="left_shoulder_yaw_link" file="left_shoulder_yaw_link.STL" />
48
+ <mesh name="left_elbow_link" file="left_elbow_link.STL" />
49
+ <mesh name="left_wrist_roll_link" file="left_wrist_roll_link.STL" />
50
+ <mesh name="left_wrist_pitch_link" file="left_wrist_pitch_link.STL" />
51
+ <mesh name="left_wrist_yaw_link" file="left_wrist_yaw_link.STL" />
52
+ <mesh name="left_hand_palm_link" file="left_hand_palm_link.STL" />
53
+ <mesh name="left_hand_thumb_0_link" file="left_hand_thumb_0_link.STL" />
54
+ <mesh name="left_hand_thumb_1_link" file="left_hand_thumb_1_link.STL" />
55
+ <mesh name="left_hand_thumb_2_link" file="left_hand_thumb_2_link.STL" />
56
+ <mesh name="left_hand_middle_0_link" file="left_hand_middle_0_link.STL" />
57
+ <mesh name="left_hand_middle_1_link" file="left_hand_middle_1_link.STL" />
58
+ <mesh name="left_hand_index_0_link" file="left_hand_index_0_link.STL" />
59
+ <mesh name="left_hand_index_1_link" file="left_hand_index_1_link.STL" />
60
+ <mesh name="right_shoulder_pitch_link" file="right_shoulder_pitch_link.STL" />
61
+ <mesh name="right_shoulder_roll_link" file="right_shoulder_roll_link.STL" />
62
+ <mesh name="right_shoulder_yaw_link" file="right_shoulder_yaw_link.STL" />
63
+ <mesh name="right_elbow_link" file="right_elbow_link.STL" />
64
+ <mesh name="right_wrist_roll_link" file="right_wrist_roll_link.STL" />
65
+ <mesh name="right_wrist_pitch_link" file="right_wrist_pitch_link.STL" />
66
+ <mesh name="right_wrist_yaw_link" file="right_wrist_yaw_link.STL" />
67
+ <mesh name="right_hand_palm_link" file="right_hand_palm_link.STL" />
68
+ <mesh name="right_hand_thumb_0_link" file="right_hand_thumb_0_link.STL" />
69
+ <mesh name="right_hand_thumb_1_link" file="right_hand_thumb_1_link.STL" />
70
+ <mesh name="right_hand_thumb_2_link" file="right_hand_thumb_2_link.STL" />
71
+ <mesh name="right_hand_middle_0_link" file="right_hand_middle_0_link.STL" />
72
+ <mesh name="right_hand_middle_1_link" file="right_hand_middle_1_link.STL" />
73
+ <mesh name="right_hand_index_0_link" file="right_hand_index_0_link.STL" />
74
+ <mesh name="right_hand_index_1_link" file="right_hand_index_1_link.STL" />
75
+ </asset>
76
+
77
+ <worldbody>
78
+ <body name="pelvis" pos="0 0 0.793">
79
+ <inertial pos="0 0 -0.07605" quat="1 0 -0.000399148 0" mass="3.813"
80
+ diaginertia="0.010549 0.0093089 0.0079184" />
81
+ <joint name="floating_base_joint" type="free" limited="false" actuatorfrclimited="false" />
82
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="0.2 0.2 0.2 1"
83
+ mesh="pelvis" />
84
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="0.7 0.7 0.7 1"
85
+ mesh="pelvis_contour_link" />
86
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="pelvis_contour_link" />
87
+ <body name="left_hip_pitch_link" pos="0 0.064452 -0.1027">
88
+ <inertial pos="0.002741 0.047791 -0.02606" quat="0.954862 0.293964 0.0302556 0.030122"
89
+ mass="1.35" diaginertia="0.00181517 0.00153422 0.00116212" />
90
+ <joint name="left_hip_pitch_joint" pos="0 0 0" axis="0 1 0" range="-2.5307 2.8798"
91
+ actuatorfrcrange="-88 88" class="leg_motor" />
92
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="0.2 0.2 0.2 1"
93
+ mesh="left_hip_pitch_link" />
94
+ <geom type="mesh" rgba="0.2 0.2 0.2 1" mesh="left_hip_pitch_link" />
95
+ <body name="left_hip_roll_link" pos="0 0.052 -0.030465" quat="0.996179 0 -0.0873386 0">
96
+ <inertial pos="0.029812 -0.001045 -0.087934"
97
+ quat="0.977808 -1.97119e-05 0.205576 -0.0403793" mass="1.52"
98
+ diaginertia="0.00254986 0.00241169 0.00148755" />
99
+ <joint name="left_hip_roll_joint" pos="0 0 0" axis="1 0 0" range="-0.5236 2.9671"
100
+ actuatorfrcrange="-88 88" class="leg_motor" />
101
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="0.7 0.7 0.7 1"
102
+ mesh="left_hip_roll_link" />
103
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_hip_roll_link" />
104
+ <body name="left_hip_yaw_link" pos="0.025001 0 -0.12412">
105
+ <inertial pos="-0.057709 -0.010981 -0.15078" quat="0.600598 0.15832 0.223482 0.751181"
106
+ mass="1.702" diaginertia="0.00776166 0.00717575 0.00160139" />
107
+ <joint name="left_hip_yaw_joint" pos="0 0 0" axis="0 0 1" range="-2.7576 2.7576"
108
+ actuatorfrcrange="-88 88" class="leg_motor" />
109
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="0.7 0.7 0.7 1"
110
+ mesh="left_hip_yaw_link" />
111
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_hip_yaw_link" />
112
+ <body name="left_knee_link" pos="-0.078273 0.0021489 -0.17734"
113
+ quat="0.996179 0 0.0873386 0">
114
+ <inertial pos="0.005457 0.003964 -0.12074"
115
+ quat="0.923418 -0.0327699 0.0158246 0.382067" mass="1.932"
116
+ diaginertia="0.0113804 0.0112778 0.00146458" />
117
+ <joint name="left_knee_joint" pos="0 0 0" axis="0 1 0" range="-0.087267 2.8798"
118
+ actuatorfrcrange="-139 139" class="leg_motor" />
119
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
120
+ rgba="0.7 0.7 0.7 1" mesh="left_knee_link" />
121
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_knee_link" />
122
+ <body name="left_ankle_pitch_link" pos="0 -9.4445e-05 -0.30001">
123
+ <inertial pos="-0.007269 0 0.011137" quat="0.603053 0.369225 0.369225 0.603053"
124
+ mass="0.074" diaginertia="1.89e-05 1.40805e-05 6.9195e-06" />
125
+ <joint name="left_ankle_pitch_joint" pos="0 0 0" axis="0 1 0"
126
+ range="-0.87267 0.5236" actuatorfrcrange="-50 50" class="ankle_motor" />
127
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
128
+ rgba="0.7 0.7 0.7 1" mesh="left_ankle_pitch_link" />
129
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_ankle_pitch_link" />
130
+ <body name="left_ankle_roll_link" pos="0 0 -0.017558">
131
+ <inertial pos="0.026505 0 -0.016425"
132
+ quat="-0.000481092 0.728482 -0.000618967 0.685065" mass="0.608"
133
+ diaginertia="0.00167218 0.0016161 0.000217621" />
134
+ <joint name="left_ankle_roll_joint" pos="0 0 0" axis="1 0 0"
135
+ range="-0.2618 0.2618" actuatorfrcrange="-50 50" class="ankle_motor" />
136
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
137
+ rgba="0.2 0.2 0.2 1" mesh="left_ankle_roll_link" />
138
+ <geom size="0.005" pos="-0.05 0.025 -0.03" rgba="0.2 0.2 0.2 1" />
139
+ <geom size="0.005" pos="-0.05 -0.025 -0.03" rgba="0.2 0.2 0.2 1" />
140
+ <geom size="0.005" pos="0.12 0.03 -0.03" rgba="0.2 0.2 0.2 1" />
141
+ <geom size="0.005" pos="0.12 -0.03 -0.03" rgba="0.2 0.2 0.2 1" />
142
+ </body>
143
+ </body>
144
+ </body>
145
+ </body>
146
+ </body>
147
+ </body>
148
+ <body name="right_hip_pitch_link" pos="0 -0.064452 -0.1027">
149
+ <inertial pos="0.002741 -0.047791 -0.02606" quat="0.954862 -0.293964 0.0302556 -0.030122"
150
+ mass="1.35" diaginertia="0.00181517 0.00153422 0.00116212" />
151
+ <joint name="right_hip_pitch_joint" pos="0 0 0" axis="0 1 0" range="-2.5307 2.8798"
152
+ actuatorfrcrange="-88 88" class="leg_motor" />
153
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="0.2 0.2 0.2 1"
154
+ mesh="right_hip_pitch_link" />
155
+ <geom type="mesh" rgba="0.2 0.2 0.2 1" mesh="right_hip_pitch_link" />
156
+ <body name="right_hip_roll_link" pos="0 -0.052 -0.030465" quat="0.996179 0 -0.0873386 0">
157
+ <inertial pos="0.029812 0.001045 -0.087934" quat="0.977808 1.97119e-05 0.205576 0.0403793"
158
+ mass="1.52" diaginertia="0.00254986 0.00241169 0.00148755" />
159
+ <joint name="right_hip_roll_joint" pos="0 0 0" axis="1 0 0" range="-2.9671 0.5236"
160
+ actuatorfrcrange="-88 88" class="leg_motor" />
161
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="0.7 0.7 0.7 1"
162
+ mesh="right_hip_roll_link" />
163
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_hip_roll_link" />
164
+ <body name="right_hip_yaw_link" pos="0.025001 0 -0.12412">
165
+ <inertial pos="-0.057709 0.010981 -0.15078" quat="0.751181 0.223482 0.15832 0.600598"
166
+ mass="1.702" diaginertia="0.00776166 0.00717575 0.00160139" />
167
+ <joint name="right_hip_yaw_joint" pos="0 0 0" axis="0 0 1" range="-2.7576 2.7576"
168
+ actuatorfrcrange="-88 88" class="leg_motor" />
169
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="0.7 0.7 0.7 1"
170
+ mesh="right_hip_yaw_link" />
171
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_hip_yaw_link" />
172
+ <body name="right_knee_link" pos="-0.078273 -0.0021489 -0.17734"
173
+ quat="0.996179 0 0.0873386 0">
174
+ <inertial pos="0.005457 -0.003964 -0.12074"
175
+ quat="0.923439 0.0345276 0.0116333 -0.382012" mass="1.932"
176
+ diaginertia="0.011374 0.0112843 0.00146452" />
177
+ <joint name="right_knee_joint" pos="0 0 0" axis="0 1 0" range="-0.087267 2.8798"
178
+ actuatorfrcrange="-139 139" class="leg_motor" />
179
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
180
+ rgba="0.7 0.7 0.7 1" mesh="right_knee_link" />
181
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_knee_link" />
182
+ <body name="right_ankle_pitch_link" pos="0 9.4445e-05 -0.30001">
183
+ <inertial pos="-0.007269 0 0.011137" quat="0.603053 0.369225 0.369225 0.603053"
184
+ mass="0.074" diaginertia="1.89e-05 1.40805e-05 6.9195e-06" />
185
+ <joint name="right_ankle_pitch_joint" pos="0 0 0" axis="0 1 0"
186
+ range="-0.87267 0.5236" actuatorfrcrange="-50 50" class="ankle_motor" />
187
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
188
+ rgba="0.7 0.7 0.7 1" mesh="right_ankle_pitch_link" />
189
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_ankle_pitch_link" />
190
+ <body name="right_ankle_roll_link" pos="0 0 -0.017558">
191
+ <inertial pos="0.026505 0 -0.016425"
192
+ quat="0.000481092 0.728482 0.000618967 0.685065" mass="0.608"
193
+ diaginertia="0.00167218 0.0016161 0.000217621" />
194
+ <joint name="right_ankle_roll_joint" pos="0 0 0" axis="1 0 0"
195
+ range="-0.2618 0.2618" actuatorfrcrange="-50 50" class="ankle_motor" />
196
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
197
+ rgba="0.2 0.2 0.2 1" mesh="right_ankle_roll_link" />
198
+ <geom size="0.005" pos="-0.05 0.025 -0.03" rgba="0.2 0.2 0.2 1" />
199
+ <geom size="0.005" pos="-0.05 -0.025 -0.03" rgba="0.2 0.2 0.2 1" />
200
+ <geom size="0.005" pos="0.12 0.03 -0.03" rgba="0.2 0.2 0.2 1" />
201
+ <geom size="0.005" pos="0.12 -0.03 -0.03" rgba="0.2 0.2 0.2 1" />
202
+ </body>
203
+ </body>
204
+ </body>
205
+ </body>
206
+ </body>
207
+ </body>
208
+ <body name="waist_yaw_link">
209
+ <inertial pos="0.003964 0 0.018769" quat="-0.0178291 0.628464 0.0282471 0.777121"
210
+ mass="0.244" diaginertia="0.000158561 0.000124229 9.67669e-05" />
211
+ <joint name="waist_yaw_joint" pos="0 0 0" axis="0 0 1" range="-2.618 2.618"
212
+ actuatorfrcrange="-88 88" class="torso_motor" />
213
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="0.7 0.7 0.7 1"
214
+ mesh="waist_yaw_link" />
215
+ <body name="waist_roll_link" pos="-0.0039635 0 0.035">
216
+ <inertial pos="0 -0.000236 0.010111" quat="0.99979 0.020492 0 0" mass="0.047"
217
+ diaginertia="7.515e-06 6.40206e-06 3.98394e-06" />
218
+ <joint name="waist_roll_joint" pos="0 0 0" axis="1 0 0" range="-0.52 0.52"
219
+ actuatorfrcrange="-50 50" class="torso_motor"/>
220
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="0.7 0.7 0.7 1"
221
+ mesh="waist_roll_link" />
222
+ <body name="torso_link" pos="0 0 0.019">
223
+ <inertial pos="0.00331658 0.000261533 0.179856"
224
+ quat="0.999831 0.000376204 0.0179895 -0.00377704" mass="9.598"
225
+ diaginertia="0.12407 0.111951 0.0325382" />
226
+ <joint name="waist_pitch_joint" pos="0 0 0" axis="0 1 0" range="-0.52 0.52"
227
+ actuatorfrcrange="-50 50" class="torso_motor"/>
228
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0" rgba="0.7 0.7 0.7 1"
229
+ mesh="torso_link" />
230
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="torso_link" />
231
+ <geom pos="0.0039635 0 -0.054" quat="1 0 0 0" type="mesh" contype="0" conaffinity="0"
232
+ group="1" density="0" rgba="0.2 0.2 0.2 1" mesh="logo_link" />
233
+ <geom pos="0.0039635 0 -0.054" quat="1 0 0 0" type="mesh" rgba="0.2 0.2 0.2 1"
234
+ mesh="logo_link" />
235
+ <geom pos="0.0039635 0 -0.054" type="mesh" contype="0" conaffinity="0" group="1"
236
+ density="0" rgba="0.2 0.2 0.2 1" mesh="head_link" />
237
+ <geom pos="0.0039635 0 -0.054" type="mesh" rgba="0.2 0.2 0.2 1" mesh="head_link" />
238
+ <geom pos="0.0039635 0 -0.054" quat="1 0 0 0" type="mesh" contype="0" conaffinity="0"
239
+ group="1" density="0" rgba="0.7 0.7 0.7 1" mesh="waist_support_link" />
240
+ <geom pos="0.0039635 0 -0.054" quat="1 0 0 0" type="mesh" rgba="0.7 0.7 0.7 1"
241
+ mesh="waist_support_link" />
242
+ <site name="imu" size="0.01" pos="-0.03959 -0.00224 0.13792" />
243
+ <body name="left_shoulder_pitch_link" pos="0.0039563 0.10022 0.23778"
244
+ quat="0.990264 0.139201 1.38722e-05 -9.86868e-05">
245
+ <inertial pos="0 0.035892 -0.011628" quat="0.654152 0.0130458 -0.326267 0.68225"
246
+ mass="0.718" diaginertia="0.000465864 0.000432842 0.000406394" />
247
+ <joint name="left_shoulder_pitch_joint" pos="0 0 0" axis="0 1 0"
248
+ range="-3.0892 2.6704" actuatorfrcrange="-25 25" class="arm_motor" />
249
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
250
+ rgba="0.7 0.7 0.7 1" mesh="left_shoulder_pitch_link" />
251
+ <geom size="0.03 0.025" pos="0 0.04 -0.01" quat="0.707107 0 0.707107 0"
252
+ type="cylinder" rgba="0.7 0.7 0.7 1" />
253
+ <body name="left_shoulder_roll_link" pos="0 0.038 -0.013831"
254
+ quat="0.990268 -0.139172 0 0">
255
+ <inertial pos="-0.000227 0.00727 -0.063243"
256
+ quat="0.701256 -0.0196223 -0.00710317 0.712604" mass="0.643"
257
+ diaginertia="0.000691311 0.000618011 0.000388977" />
258
+ <joint name="left_shoulder_roll_joint" pos="0 0 0" axis="1 0 0"
259
+ range="-1.5882 2.2515" actuatorfrcrange="-25 25" class="arm_motor" />
260
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
261
+ rgba="0.7 0.7 0.7 1" mesh="left_shoulder_roll_link" />
262
+ <geom size="0.03 0.015" pos="-0.004 0.006 -0.053" type="cylinder"
263
+ rgba="0.7 0.7 0.7 1" />
264
+ <body name="left_shoulder_yaw_link" pos="0 0.00624 -0.1032">
265
+ <inertial pos="0.010773 -0.002949 -0.072009"
266
+ quat="0.716879 -0.0964829 -0.0679942 0.687134" mass="0.734"
267
+ diaginertia="0.00106187 0.00103217 0.000400661" />
268
+ <joint name="left_shoulder_yaw_joint" pos="0 0 0" axis="0 0 1"
269
+ range="-2.618 2.618" actuatorfrcrange="-25 25" class="arm_motor" />
270
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
271
+ rgba="0.7 0.7 0.7 1" mesh="left_shoulder_yaw_link" />
272
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_shoulder_yaw_link" />
273
+ <body name="left_elbow_link" pos="0.015783 0 -0.080518">
274
+ <inertial pos="0.064956 0.004454 -0.010062"
275
+ quat="0.541765 0.636132 0.388821 0.388129" mass="0.6"
276
+ diaginertia="0.000443035 0.000421612 0.000259353" />
277
+ <joint name="left_elbow_joint" pos="0 0 0" axis="0 1 0" range="-1.0472 2.0944"
278
+ actuatorfrcrange="-25 25" class="arm_motor" />
279
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
280
+ rgba="0.7 0.7 0.7 1" mesh="left_elbow_link" />
281
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_elbow_link" />
282
+ <body name="left_wrist_roll_link" pos="0.1 0.00188791 -0.01">
283
+ <inertial pos="0.0171394 0.000537591 4.8864e-07"
284
+ quat="0.575338 0.411667 -0.574906 0.411094" mass="0.085445"
285
+ diaginertia="5.48211e-05 4.96646e-05 3.57798e-05" />
286
+ <joint name="left_wrist_roll_joint" pos="0 0 0" axis="1 0 0"
287
+ range="-1.97222 1.97222" actuatorfrcrange="-25 25" class="arm_motor" />
288
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
289
+ rgba="0.7 0.7 0.7 1" mesh="left_wrist_roll_link" />
290
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_wrist_roll_link" />
291
+ <body name="left_wrist_pitch_link" pos="0.038 0 0">
292
+ <inertial pos="0.0229999 -0.00111685 -0.00111658"
293
+ quat="0.249998 0.661363 0.293036 0.643608" mass="0.48405"
294
+ diaginertia="0.000430353 0.000429873 0.000164648" />
295
+ <joint name="left_wrist_pitch_joint" pos="0 0 0" axis="0 1 0"
296
+ range="-1.61443 1.61443" actuatorfrcrange="-5 5" class="wrist_motor" />
297
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
298
+ rgba="0.7 0.7 0.7 1" mesh="left_wrist_pitch_link" />
299
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_wrist_pitch_link" />
300
+ <body name="left_wrist_yaw_link" pos="0.046 0 0">
301
+ <inertial pos="0.0885506 0.00212216 -0.000374562"
302
+ quat="0.487149 0.493844 0.513241 0.505358" mass="0.457415"
303
+ diaginertia="0.00105989 0.000895419 0.000323842" />
304
+ <joint name="left_wrist_yaw_joint" pos="0 0 0" axis="0 0 1"
305
+ range="-1.61443 1.61443" actuatorfrcrange="-5 5" class="wrist_motor" />
306
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
307
+ rgba="0.7 0.7 0.7 1" mesh="left_wrist_yaw_link" />
308
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_wrist_yaw_link" />
309
+ <geom pos="0.0415 0.003 0" quat="1 0 0 0" type="mesh" contype="0"
310
+ conaffinity="0" group="1" density="0" rgba="0.7 0.7 0.7 1"
311
+ mesh="left_hand_palm_link" />
312
+ <geom pos="0.0415 0.003 0" quat="1 0 0 0" type="mesh" rgba="0.7 0.7 0.7 1"
313
+ mesh="left_hand_palm_link" />
314
+ <body name="left_hand_thumb_0_link" pos="0.067 0.003 0">
315
+ <inertial pos="-0.000884246 -0.00863407 0.000944293"
316
+ quat="0.462991 0.643965 -0.460173 0.398986" mass="0.0862366"
317
+ diaginertia="1.6546e-05 1.60058e-05 1.43741e-05" />
318
+ <joint name="left_hand_thumb_0_joint" pos="0 0 0" axis="0 1 0"
319
+ range="-1.0472 1.0472" actuatorfrcrange="-2.45 2.45"
320
+ class="finger_motor" />
321
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
322
+ rgba="0.7 0.7 0.7 1" mesh="left_hand_thumb_0_link" />
323
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_hand_thumb_0_link" />
324
+ <body name="left_hand_thumb_1_link" pos="-0.0025 -0.0193 0">
325
+ <inertial pos="-0.000827888 -0.0354744 -0.0003809"
326
+ quat="0.685598 0.705471 -0.15207 0.0956069" mass="0.0588507"
327
+ diaginertia="1.28514e-05 1.22902e-05 5.9666e-06" />
328
+ <joint name="left_hand_thumb_1_joint" pos="0 0 0" axis="0 0 1"
329
+ range="-0.724312 1.0472" actuatorfrcrange="-1.4 1.4"
330
+ class="finger_motor" />
331
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
332
+ rgba="0.7 0.7 0.7 1" mesh="left_hand_thumb_1_link" />
333
+ <geom size="0.01 0.015 0.01" pos="-0.001 -0.032 0" type="box"
334
+ rgba="0.7 0.7 0.7 1" />
335
+ <body name="left_hand_thumb_2_link" pos="0 -0.0458 0">
336
+ <inertial pos="-0.00171735 -0.0262819 0.000107789"
337
+ quat="0.703174 0.710977 -0.00017564 -0.00766553" mass="0.0203063"
338
+ diaginertia="4.61314e-06 3.86645e-06 1.53495e-06" />
339
+ <joint name="left_hand_thumb_2_joint" pos="0 0 0" axis="0 0 1"
340
+ range="0 1.74533" actuatorfrcrange="-1.4 1.4" class="finger_motor" />
341
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
342
+ rgba="0.7 0.7 0.7 1" mesh="left_hand_thumb_2_link" />
343
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_hand_thumb_2_link" />
344
+ </body>
345
+ </body>
346
+ </body>
347
+ <body name="left_hand_middle_0_link" pos="0.1192 0.0046 -0.0285">
348
+ <inertial pos="0.0354744 0.000827888 0.0003809"
349
+ quat="0.391313 0.552395 0.417187 0.606373" mass="0.0588507"
350
+ diaginertia="1.28514e-05 1.22902e-05 5.9666e-06" />
351
+ <joint name="left_hand_middle_0_joint" pos="0 0 0" axis="0 0 1"
352
+ range="-1.5708 0" actuatorfrcrange="-1.4 1.4" class="finger_motor" />
353
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
354
+ rgba="0.7 0.7 0.7 1" mesh="left_hand_middle_0_link" />
355
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_hand_middle_0_link" />
356
+ <body name="left_hand_middle_1_link" pos="0.0458 0 0">
357
+ <inertial pos="0.0262819 0.00171735 -0.000107789"
358
+ quat="0.502612 0.491799 0.502639 0.502861" mass="0.0203063"
359
+ diaginertia="4.61314e-06 3.86645e-06 1.53495e-06" />
360
+ <joint name="left_hand_middle_1_joint" pos="0 0 0" axis="0 0 1"
361
+ range="-1.74533 0" actuatorfrcrange="-1.4 1.4" class="finger_motor" />
362
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
363
+ rgba="0.7 0.7 0.7 1" mesh="left_hand_middle_1_link" />
364
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_hand_middle_1_link" />
365
+ </body>
366
+ </body>
367
+ <body name="left_hand_index_0_link" pos="0.1192 0.0046 0.0285">
368
+ <inertial pos="0.0354744 0.000827888 0.0003809"
369
+ quat="0.391313 0.552395 0.417187 0.606373" mass="0.0588507"
370
+ diaginertia="1.28514e-05 1.22902e-05 5.9666e-06" />
371
+ <joint name="left_hand_index_0_joint" pos="0 0 0" axis="0 0 1"
372
+ range="-1.5708 0" actuatorfrcrange="-1.4 1.4" class="finger_motor" />
373
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
374
+ rgba="0.7 0.7 0.7 1" mesh="left_hand_index_0_link" />
375
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_hand_index_0_link" />
376
+ <body name="left_hand_index_1_link" pos="0.0458 0 0">
377
+ <inertial pos="0.0262819 0.00171735 -0.000107789"
378
+ quat="0.502612 0.491799 0.502639 0.502861" mass="0.0203063"
379
+ diaginertia="4.61314e-06 3.86645e-06 1.53495e-06" />
380
+ <joint name="left_hand_index_1_joint" pos="0 0 0" axis="0 0 1"
381
+ range="-1.74533 0" actuatorfrcrange="-1.4 1.4" class="finger_motor" />
382
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
383
+ rgba="0.7 0.7 0.7 1" mesh="left_hand_index_1_link" />
384
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="left_hand_index_1_link" />
385
+ </body>
386
+ </body>
387
+ </body>
388
+ </body>
389
+ </body>
390
+ </body>
391
+ </body>
392
+ </body>
393
+ </body>
394
+ <body name="right_shoulder_pitch_link" pos="0.0039563 -0.10021 0.23778"
395
+ quat="0.990264 -0.139201 1.38722e-05 9.86868e-05">
396
+ <inertial pos="0 -0.035892 -0.011628" quat="0.68225 -0.326267 0.0130458 0.654152"
397
+ mass="0.718" diaginertia="0.000465864 0.000432842 0.000406394" />
398
+ <joint name="right_shoulder_pitch_joint" pos="0 0 0" axis="0 1 0"
399
+ range="-3.0892 2.6704" actuatorfrcrange="-25 25" class="arm_motor" />
400
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
401
+ rgba="0.7 0.7 0.7 1" mesh="right_shoulder_pitch_link" />
402
+ <geom size="0.03 0.025" pos="0 -0.04 -0.01" quat="0.707107 0 0.707107 0"
403
+ type="cylinder" rgba="0.7 0.7 0.7 1" />
404
+ <body name="right_shoulder_roll_link" pos="0 -0.038 -0.013831"
405
+ quat="0.990268 0.139172 0 0">
406
+ <inertial pos="-0.000227 -0.00727 -0.063243"
407
+ quat="0.712604 -0.00710317 -0.0196223 0.701256" mass="0.643"
408
+ diaginertia="0.000691311 0.000618011 0.000388977" />
409
+ <joint name="right_shoulder_roll_joint" pos="0 0 0" axis="1 0 0"
410
+ range="-2.2515 1.5882" actuatorfrcrange="-25 25" class="arm_motor" />
411
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
412
+ rgba="0.7 0.7 0.7 1" mesh="right_shoulder_roll_link" />
413
+ <geom size="0.03 0.015" pos="-0.004 -0.006 -0.053" type="cylinder"
414
+ rgba="0.7 0.7 0.7 1" />
415
+ <body name="right_shoulder_yaw_link" pos="0 -0.00624 -0.1032">
416
+ <inertial pos="0.010773 0.002949 -0.072009"
417
+ quat="0.687134 -0.0679942 -0.0964829 0.716879" mass="0.734"
418
+ diaginertia="0.00106187 0.00103217 0.000400661" />
419
+ <joint name="right_shoulder_yaw_joint" pos="0 0 0" axis="0 0 1"
420
+ range="-2.618 2.618" actuatorfrcrange="-25 25" class="arm_motor" />
421
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
422
+ rgba="0.7 0.7 0.7 1" mesh="right_shoulder_yaw_link" />
423
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_shoulder_yaw_link" />
424
+ <body name="right_elbow_link" pos="0.015783 0 -0.080518">
425
+ <inertial pos="0.064956 -0.004454 -0.010062"
426
+ quat="0.388129 0.388821 0.636132 0.541765" mass="0.6"
427
+ diaginertia="0.000443035 0.000421612 0.000259353" />
428
+ <joint name="right_elbow_joint" pos="0 0 0" axis="0 1 0" range="-1.0472 2.0944"
429
+ actuatorfrcrange="-25 25" class="arm_motor" />
430
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
431
+ rgba="0.7 0.7 0.7 1" mesh="right_elbow_link" />
432
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_elbow_link" />
433
+ <body name="right_wrist_roll_link" pos="0.1 -0.00188791 -0.01">
434
+ <inertial pos="0.0171394 -0.000537591 4.8864e-07"
435
+ quat="0.411667 0.575338 -0.411094 0.574906" mass="0.085445"
436
+ diaginertia="5.48211e-05 4.96646e-05 3.57798e-05" />
437
+ <joint name="right_wrist_roll_joint" pos="0 0 0" axis="1 0 0"
438
+ range="-1.97222 1.97222" actuatorfrcrange="-25 25" class="arm_motor" />
439
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
440
+ rgba="0.7 0.7 0.7 1" mesh="right_wrist_roll_link" />
441
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_wrist_roll_link" />
442
+ <body name="right_wrist_pitch_link" pos="0.038 0 0">
443
+ <inertial pos="0.0229999 0.00111685 -0.00111658"
444
+ quat="0.643608 0.293036 0.661363 0.249998" mass="0.48405"
445
+ diaginertia="0.000430353 0.000429873 0.000164648" />
446
+ <joint name="right_wrist_pitch_joint" pos="0 0 0" axis="0 1 0"
447
+ range="-1.61443 1.61443" actuatorfrcrange="-5 5" class="wrist_motor" />
448
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
449
+ rgba="0.7 0.7 0.7 1" mesh="right_wrist_pitch_link" />
450
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_wrist_pitch_link" />
451
+ <body name="right_wrist_yaw_link" pos="0.046 0 0">
452
+ <inertial pos="0.0885506 -0.00212216 0.000573742"
453
+ quat="0.507224 0.511377 0.494292 0.486717" mass="0.457415"
454
+ diaginertia="0.0010598 0.000895373 0.0003238" />
455
+ <joint name="right_wrist_yaw_joint" pos="0 0 0" axis="0 0 1"
456
+ range="-1.61443 1.61443" actuatorfrcrange="-5 5" class="wrist_motor" />
457
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
458
+ rgba="0.7 0.7 0.7 1" mesh="right_wrist_yaw_link" />
459
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_wrist_yaw_link" />
460
+ <geom pos="0.0415 -0.003 0" quat="1 0 0 0" type="mesh" contype="0"
461
+ conaffinity="0" group="1" density="0" rgba="0.7 0.7 0.7 1"
462
+ mesh="right_hand_palm_link" />
463
+ <geom pos="0.0415 -0.003 0" quat="1 0 0 0" type="mesh"
464
+ rgba="0.7 0.7 0.7 1" mesh="right_hand_palm_link" />
465
+ <body name="right_hand_thumb_0_link" pos="0.067 -0.003 0">
466
+ <inertial pos="-0.000884246 0.00863407 0.000944293"
467
+ quat="0.643965 0.462991 -0.398986 0.460173" mass="0.0862366"
468
+ diaginertia="1.6546e-05 1.60058e-05 1.43741e-05" />
469
+ <joint name="right_hand_thumb_0_joint" pos="0 0 0" axis="0 1 0"
470
+ range="-1.0472 1.0472" actuatorfrcrange="-2.45 2.45"
471
+ class="finger_motor" />
472
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
473
+ rgba="0.7 0.7 0.7 1" mesh="right_hand_thumb_0_link" />
474
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_hand_thumb_0_link" />
475
+ <body name="right_hand_thumb_1_link" pos="-0.0025 0.0193 0">
476
+ <inertial pos="-0.000827888 0.0354744 -0.0003809"
477
+ quat="0.705471 0.685598 -0.0956069 0.15207" mass="0.0588507"
478
+ diaginertia="1.28514e-05 1.22902e-05 5.9666e-06" />
479
+ <joint name="right_hand_thumb_1_joint" pos="0 0 0" axis="0 0 1"
480
+ range="-1.0472 0.724312" actuatorfrcrange="-1.4 1.4"
481
+ class="finger_motor" />
482
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
483
+ rgba="0.7 0.7 0.7 1" mesh="right_hand_thumb_1_link" />
484
+ <geom size="0.01 0.015 0.01" pos="-0.001 0.032 0" type="box"
485
+ rgba="0.7 0.7 0.7 1" />
486
+ <body name="right_hand_thumb_2_link" pos="0 0.0458 0">
487
+ <inertial pos="-0.00171735 0.0262819 0.000107789"
488
+ quat="0.710977 0.703174 0.00766553 0.00017564" mass="0.0203063"
489
+ diaginertia="4.61314e-06 3.86645e-06 1.53495e-06" />
490
+ <joint name="right_hand_thumb_2_joint" pos="0 0 0" axis="0 0 1"
491
+ range="-1.74533 0" actuatorfrcrange="-1.4 1.4"
492
+ class="finger_motor" />
493
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
494
+ rgba="0.7 0.7 0.7 1" mesh="right_hand_thumb_2_link" />
495
+ <geom type="mesh" rgba="0.7 0.7 0.7 1"
496
+ mesh="right_hand_thumb_2_link" />
497
+ </body>
498
+ </body>
499
+ </body>
500
+ <body name="right_hand_middle_0_link" pos="0.1192 -0.0046 -0.0285">
501
+ <inertial pos="0.0354744 -0.000827888 0.0003809"
502
+ quat="0.606373 0.417187 0.552395 0.391313" mass="0.0588507"
503
+ diaginertia="1.28514e-05 1.22902e-05 5.9666e-06" />
504
+ <joint name="right_hand_middle_0_joint" pos="0 0 0" axis="0 0 1"
505
+ range="0 1.5708" actuatorfrcrange="-1.4 1.4" class="finger_motor" />
506
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
507
+ rgba="0.7 0.7 0.7 1" mesh="right_hand_middle_0_link" />
508
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_hand_middle_0_link" />
509
+ <body name="right_hand_middle_1_link" pos="0.0458 0 0">
510
+ <inertial pos="0.0262819 -0.00171735 -0.000107789"
511
+ quat="0.502861 0.502639 0.491799 0.502612" mass="0.0203063"
512
+ diaginertia="4.61314e-06 3.86645e-06 1.53495e-06" />
513
+ <joint name="right_hand_middle_1_joint" pos="0 0 0" axis="0 0 1"
514
+ range="0 1.74533" actuatorfrcrange="-1.4 1.4" class="finger_motor" />
515
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
516
+ rgba="0.7 0.7 0.7 1" mesh="right_hand_middle_1_link" />
517
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_hand_middle_1_link" />
518
+ </body>
519
+ </body>
520
+ <body name="right_hand_index_0_link" pos="0.1192 -0.0046 0.0285">
521
+ <inertial pos="0.0354744 -0.000827888 0.0003809"
522
+ quat="0.606373 0.417187 0.552395 0.391313" mass="0.0588507"
523
+ diaginertia="1.28514e-05 1.22902e-05 5.9666e-06" />
524
+ <joint name="right_hand_index_0_joint" pos="0 0 0" axis="0 0 1"
525
+ range="0 1.5708" actuatorfrcrange="-1.4 1.4" class="finger_motor" />
526
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
527
+ rgba="0.7 0.7 0.7 1" mesh="right_hand_index_0_link" />
528
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_hand_index_0_link" />
529
+ <body name="right_hand_index_1_link" pos="0.0458 0 0">
530
+ <inertial pos="0.0262819 -0.00171735 -0.000107789"
531
+ quat="0.502861 0.502639 0.491799 0.502612" mass="0.0203063"
532
+ diaginertia="4.61314e-06 3.86645e-06 1.53495e-06" />
533
+ <joint name="right_hand_index_1_joint" pos="0 0 0" axis="0 0 1"
534
+ range="0 1.74533" actuatorfrcrange="-1.4 1.4" class="finger_motor" />
535
+ <geom type="mesh" contype="0" conaffinity="0" group="1" density="0"
536
+ rgba="0.7 0.7 0.7 1" mesh="right_hand_index_1_link" />
537
+ <geom type="mesh" rgba="0.7 0.7 0.7 1" mesh="right_hand_index_1_link" />
538
+ </body>
539
+ </body>
540
+ </body>
541
+ </body>
542
+ </body>
543
+ </body>
544
+ </body>
545
+ </body>
546
+ </body>
547
+ </body>
548
+ </body>
549
+ </body>
550
+ </body>
551
+ </worldbody>
552
+
553
+ <actuator>
554
+ <motor name="left_hip_pitch" joint="left_hip_pitch_joint" ctrlrange="-88 88" />
555
+ <motor name="left_hip_roll" joint="left_hip_roll_joint" ctrlrange="-88 88" />
556
+ <motor name="left_hip_yaw" joint="left_hip_yaw_joint" ctrlrange="-88 88" />
557
+ <motor name="left_knee" joint="left_knee_joint" ctrlrange="-139 139" />
558
+ <motor name="left_ankle_pitch" joint="left_ankle_pitch_joint" ctrlrange="-50 50" />
559
+ <motor name="left_ankle_roll" joint="left_ankle_roll_joint" ctrlrange="-50 50" />
560
+
561
+ <motor name="right_hip_pitch" joint="right_hip_pitch_joint" ctrlrange="-88 88" />
562
+ <motor name="right_hip_roll" joint="right_hip_roll_joint" ctrlrange="-88 88" />
563
+ <motor name="right_hip_yaw" joint="right_hip_yaw_joint" ctrlrange="-88 88" />
564
+ <motor name="right_knee" joint="right_knee_joint" ctrlrange="-139 139" />
565
+ <motor name="right_ankle_pitch" joint="right_ankle_pitch_joint" ctrlrange="-50 50" />
566
+ <motor name="right_ankle_roll" joint="right_ankle_roll_joint" ctrlrange="-50 50" />
567
+
568
+ <motor name="waist_yaw" joint="waist_yaw_joint" ctrlrange="-88 88" />
569
+ <motor name="waist_roll" joint="waist_roll_joint" ctrlrange="-50 50" />
570
+ <motor name="waist_pitch" joint="waist_pitch_joint" ctrlrange="-50 50" />
571
+
572
+ <motor name="left_shoulder_pitch" joint="left_shoulder_pitch_joint" ctrlrange="-25 25" />
573
+ <motor name="left_shoulder_roll" joint="left_shoulder_roll_joint" ctrlrange="-25 25" />
574
+ <motor name="left_shoulder_yaw" joint="left_shoulder_yaw_joint" ctrlrange="-25 25" />
575
+ <motor name="left_elbow" joint="left_elbow_joint" ctrlrange="-25 25" />
576
+ <motor name="left_wrist_roll" joint="left_wrist_roll_joint" ctrlrange="-25 25" />
577
+ <motor name="left_wrist_pitch" joint="left_wrist_pitch_joint" ctrlrange="-5 5" />
578
+ <motor name="left_wrist_yaw" joint="left_wrist_yaw_joint" ctrlrange="-5 5" />
579
+
580
+ <motor name="left_hand_thumb_0" joint="left_hand_thumb_0_joint" ctrlrange="-2.45 2.45" />
581
+ <motor name="left_hand_thumb_1" joint="left_hand_thumb_1_joint" ctrlrange="-1.4 1.4" />
582
+ <motor name="left_hand_thumb_2" joint="left_hand_thumb_2_joint" ctrlrange="-1.4 1.4" />
583
+ <motor name="left_hand_middle_0" joint="left_hand_middle_0_joint" ctrlrange="-1.4 1.4" />
584
+ <motor name="left_hand_middle_1" joint="left_hand_middle_1_joint" ctrlrange="-1.4 1.4" />
585
+ <motor name="left_hand_index_0" joint="left_hand_index_0_joint" ctrlrange="-1.4 1.4" />
586
+ <motor name="left_hand_index_1" joint="left_hand_index_1_joint" ctrlrange="-1.4 1.4" />
587
+
588
+ <motor name="right_shoulder_pitch" joint="right_shoulder_pitch_joint" ctrlrange="-25 25" />
589
+ <motor name="right_shoulder_roll" joint="right_shoulder_roll_joint" ctrlrange="-25 25" />
590
+ <motor name="right_shoulder_yaw" joint="right_shoulder_yaw_joint" ctrlrange="-25 25" />
591
+ <motor name="right_elbow" joint="right_elbow_joint" ctrlrange="-25 25" />
592
+ <motor name="right_wrist_roll" joint="right_wrist_roll_joint" ctrlrange="-25 25" />
593
+ <motor name="right_wrist_pitch" joint="right_wrist_pitch_joint" ctrlrange="-5 5" />
594
+ <motor name="right_wrist_yaw" joint="right_wrist_yaw_joint" ctrlrange="-5 5" />
595
+
596
+ <motor name="right_hand_thumb_0" joint="right_hand_thumb_0_joint" ctrlrange="-2.45 2.45" />
597
+ <motor name="right_hand_thumb_1" joint="right_hand_thumb_1_joint" ctrlrange="-1.4 1.4" />
598
+ <motor name="right_hand_thumb_2" joint="right_hand_thumb_2_joint" ctrlrange="-1.4 1.4" />
599
+ <motor name="right_hand_middle_0" joint="right_hand_middle_0_joint" ctrlrange="-1.4 1.4" />
600
+ <motor name="right_hand_middle_1" joint="right_hand_middle_1_joint" ctrlrange="-1.4 1.4" />
601
+ <motor name="right_hand_index_0" joint="right_hand_index_0_joint" ctrlrange="-1.4 1.4" />
602
+ <motor name="right_hand_index_1" joint="right_hand_index_1_joint" ctrlrange="-1.4 1.4" />
603
+ </actuator>
604
+
605
+ <sensor>
606
+ <jointpos name="left_hip_pitch_pos" joint="left_hip_pitch_joint" />
607
+ <jointpos name="left_hip_roll_pos" joint="left_hip_roll_joint" />
608
+ <jointpos name="left_hip_yaw_pos" joint="left_hip_yaw_joint" />
609
+ <jointpos name="left_knee_pos" joint="left_knee_joint" />
610
+ <jointpos name="left_ankle_pitch_pos" joint="left_ankle_pitch_joint" />
611
+ <jointpos name="left_ankle_roll_pos" joint="left_ankle_roll_joint" />
612
+ <jointpos name="right_hip_pitch_pos" joint="right_hip_pitch_joint" />
613
+ <jointpos name="right_hip_roll_pos" joint="right_hip_roll_joint" />
614
+ <jointpos name="right_hip_yaw_pos" joint="right_hip_yaw_joint" />
615
+ <jointpos name="right_knee_pos" joint="right_knee_joint" />
616
+ <jointpos name="right_ankle_pitch_pos" joint="right_ankle_pitch_joint" />
617
+ <jointpos name="right_ankle_roll_pos" joint="right_ankle_roll_joint" />
618
+ <jointpos name="waist_yaw_pos" joint="waist_yaw_joint" />
619
+ <jointpos name="waist_roll_pos" joint="waist_roll_joint" />
620
+ <jointpos name="waist_pitch_pos" joint="waist_pitch_joint" />
621
+ <jointpos name="left_shoulder_pitch_pos" joint="left_shoulder_pitch_joint" />
622
+ <jointpos name="left_shoulder_roll_pos" joint="left_shoulder_roll_joint" />
623
+ <jointpos name="left_shoulder_yaw_pos" joint="left_shoulder_yaw_joint" />
624
+ <jointpos name="left_elbow_pos" joint="left_elbow_joint" />
625
+ <jointpos name="left_wrist_roll_pos" joint="left_wrist_roll_joint" />
626
+ <jointpos name="left_wrist_pitch_pos" joint="left_wrist_pitch_joint" />
627
+ <jointpos name="left_wrist_yaw_pos" joint="left_wrist_yaw_joint" />
628
+ <jointpos name="right_shoulder_pitch_pos" joint="right_shoulder_pitch_joint" />
629
+ <jointpos name="right_shoulder_roll_pos" joint="right_shoulder_roll_joint" />
630
+ <jointpos name="right_shoulder_yaw_pos" joint="right_shoulder_yaw_joint" />
631
+ <jointpos name="right_elbow_pos" joint="right_elbow_joint" />
632
+ <jointpos name="right_wrist_roll_pos" joint="right_wrist_roll_joint" />
633
+ <jointpos name="right_wrist_pitch_pos" joint="right_wrist_pitch_joint" />
634
+ <jointpos name="right_wrist_yaw_pos" joint="right_wrist_yaw_joint" />
635
+
636
+ <jointpos name="left_hand_thumb_0_pos" joint="left_hand_thumb_0_joint" />
637
+ <jointpos name="left_hand_thumb_1_pos" joint="left_hand_thumb_1_joint" />
638
+ <jointpos name="left_hand_thumb_2_pos" joint="left_hand_thumb_2_joint" />
639
+ <jointpos name="left_hand_middle_0_pos" joint="left_hand_middle_0_joint" />
640
+ <jointpos name="left_hand_middle_1_pos" joint="left_hand_middle_1_joint" />
641
+ <jointpos name="left_hand_index_0_pos" joint="left_hand_index_0_joint" />
642
+ <jointpos name="left_hand_index_1_pos" joint="left_hand_index_1_joint" />
643
+ <jointpos name="right_hand_thumb_0_pos" joint="right_hand_thumb_0_joint" />
644
+ <jointpos name="right_hand_thumb_1_pos" joint="right_hand_thumb_1_joint" />
645
+ <jointpos name="right_hand_thumb_2_pos" joint="right_hand_thumb_2_joint" />
646
+ <jointpos name="right_hand_middle_0_pos" joint="right_hand_middle_0_joint" />
647
+ <jointpos name="right_hand_middle_1_pos" joint="right_hand_middle_1_joint" />
648
+ <jointpos name="right_hand_index_0_pos" joint="right_hand_index_0_joint" />
649
+ <jointpos name="right_hand_index_1_pos" joint="right_hand_index_1_joint" />
650
+
651
+ <jointvel name="left_hip_pitch_vel" joint="left_hip_pitch_joint" />
652
+ <jointvel name="left_hip_roll_vel" joint="left_hip_roll_joint" />
653
+ <jointvel name="left_hip_yaw_vel" joint="left_hip_yaw_joint" />
654
+ <jointvel name="left_knee_vel" joint="left_knee_joint" />
655
+ <jointvel name="left_ankle_pitch_vel" joint="left_ankle_pitch_joint" />
656
+ <jointvel name="left_ankle_roll_vel" joint="left_ankle_roll_joint" />
657
+ <jointvel name="right_hip_pitch_vel" joint="right_hip_pitch_joint" />
658
+ <jointvel name="right_hip_roll_vel" joint="right_hip_roll_joint" />
659
+ <jointvel name="right_hip_yaw_vel" joint="right_hip_yaw_joint" />
660
+ <jointvel name="right_knee_vel" joint="right_knee_joint" />
661
+ <jointvel name="right_ankle_pitch_vel" joint="right_ankle_pitch_joint" />
662
+ <jointvel name="right_ankle_roll_vel" joint="right_ankle_roll_joint" />
663
+ <jointvel name="waist_yaw_vel" joint="waist_yaw_joint" />
664
+ <jointvel name="waist_roll_vel" joint="waist_roll_joint" />
665
+ <jointvel name="waist_pitch_vel" joint="waist_pitch_joint" />
666
+ <jointvel name="left_shoulder_pitch_vel" joint="left_shoulder_pitch_joint" />
667
+ <jointvel name="left_shoulder_roll_vel" joint="left_shoulder_roll_joint" />
668
+ <jointvel name="left_shoulder_yaw_vel" joint="left_shoulder_yaw_joint" />
669
+ <jointvel name="left_elbow_vel" joint="left_elbow_joint" />
670
+ <jointvel name="left_wrist_roll_vel" joint="left_wrist_roll_joint" />
671
+ <jointvel name="left_wrist_pitch_vel" joint="left_wrist_pitch_joint" />
672
+ <jointvel name="left_wrist_yaw_vel" joint="left_wrist_yaw_joint" />
673
+ <jointvel name="right_shoulder_pitch_vel" joint="right_shoulder_pitch_joint" />
674
+ <jointvel name="right_shoulder_roll_vel" joint="right_shoulder_roll_joint" />
675
+ <jointvel name="right_shoulder_yaw_vel" joint="right_shoulder_yaw_joint" />
676
+ <jointvel name="right_elbow_vel" joint="right_elbow_joint" />
677
+ <jointvel name="right_wrist_roll_vel" joint="right_wrist_roll_joint" />
678
+ <jointvel name="right_wrist_pitch_vel" joint="right_wrist_pitch_joint" />
679
+ <jointvel name="right_wrist_yaw_vel" joint="right_wrist_yaw_joint" />
680
+
681
+ <jointvel name="left_hand_thumb_0_vel" joint="left_hand_thumb_0_joint" />
682
+ <jointvel name="left_hand_thumb_1_vel" joint="left_hand_thumb_1_joint" />
683
+ <jointvel name="left_hand_thumb_2_vel" joint="left_hand_thumb_2_joint" />
684
+ <jointvel name="left_hand_middle_0_vel" joint="left_hand_middle_0_joint" />
685
+ <jointvel name="left_hand_middle_1_vel" joint="left_hand_middle_1_joint" />
686
+ <jointvel name="left_hand_index_0_vel" joint="left_hand_index_0_joint" />
687
+ <jointvel name="left_hand_index_1_vel" joint="left_hand_index_1_joint" />
688
+ <jointvel name="right_hand_thumb_0_vel" joint="right_hand_thumb_0_joint" />
689
+ <jointvel name="right_hand_thumb_1_vel" joint="right_hand_thumb_1_joint" />
690
+ <jointvel name="right_hand_thumb_2_vel" joint="right_hand_thumb_2_joint" />
691
+ <jointvel name="right_hand_middle_0_vel" joint="right_hand_middle_0_joint" />
692
+ <jointvel name="right_hand_middle_1_vel" joint="right_hand_middle_1_joint" />
693
+ <jointvel name="right_hand_index_0_vel" joint="right_hand_index_0_joint" />
694
+ <jointvel name="right_hand_index_1_vel" joint="right_hand_index_1_joint" />
695
+
696
+ <jointactuatorfrc name="left_hip_pitch_torque" joint="left_hip_pitch_joint" />
697
+ <jointactuatorfrc name="left_hip_roll_torque" joint="left_hip_roll_joint" />
698
+ <jointactuatorfrc name="left_hip_yaw_torque" joint="left_hip_yaw_joint" />
699
+ <jointactuatorfrc name="left_knee_torque" joint="left_knee_joint" />
700
+ <jointactuatorfrc name="left_ankle_pitch_torque" joint="left_ankle_pitch_joint" />
701
+ <jointactuatorfrc name="left_ankle_roll_torque" joint="left_ankle_roll_joint" />
702
+ <jointactuatorfrc name="right_hip_pitch_torque" joint="right_hip_pitch_joint" />
703
+ <jointactuatorfrc name="right_hip_roll_torque" joint="right_hip_roll_joint" />
704
+ <jointactuatorfrc name="right_hip_yaw_torque" joint="right_hip_yaw_joint" />
705
+ <jointactuatorfrc name="right_knee_torque" joint="right_knee_joint" />
706
+ <jointactuatorfrc name="right_ankle_pitch_torque" joint="right_ankle_pitch_joint" />
707
+ <jointactuatorfrc name="right_ankle_roll_torque" joint="right_ankle_roll_joint" />
708
+ <jointactuatorfrc name="waist_yaw_torque" joint="waist_yaw_joint" />
709
+ <jointactuatorfrc name="waist_roll_torque" joint="waist_roll_joint" />
710
+ <jointactuatorfrc name="waist_pitch_torque" joint="waist_pitch_joint" />
711
+ <jointactuatorfrc name="left_shoulder_pitch_torque" joint="left_shoulder_pitch_joint" />
712
+ <jointactuatorfrc name="left_shoulder_roll_torque" joint="left_shoulder_roll_joint" />
713
+ <jointactuatorfrc name="left_shoulder_yaw_torque" joint="left_shoulder_yaw_joint" />
714
+ <jointactuatorfrc name="left_elbow_torque" joint="left_elbow_joint" />
715
+ <jointactuatorfrc name="left_wrist_roll_torque" joint="left_wrist_roll_joint" />
716
+ <jointactuatorfrc name="left_wrist_pitch_torque" joint="left_wrist_pitch_joint" />
717
+ <jointactuatorfrc name="left_wrist_yaw_torque" joint="left_wrist_yaw_joint" />
718
+ <jointactuatorfrc name="right_shoulder_pitch_torque" joint="right_shoulder_pitch_joint" />
719
+ <jointactuatorfrc name="right_shoulder_roll_torque" joint="right_shoulder_roll_joint" />
720
+ <jointactuatorfrc name="right_shoulder_yaw_torque" joint="right_shoulder_yaw_joint" />
721
+ <jointactuatorfrc name="right_elbow_torque" joint="right_elbow_joint" />
722
+ <jointactuatorfrc name="right_wrist_roll_torque" joint="right_wrist_roll_joint" />
723
+ <jointactuatorfrc name="right_wrist_pitch_torque" joint="right_wrist_pitch_joint" />
724
+ <jointactuatorfrc name="right_wrist_yaw_torque" joint="right_wrist_yaw_joint" />
725
+
726
+ <jointactuatorfrc name="left_hand_thumb_0_torque" joint="left_hand_thumb_0_joint" />
727
+ <jointactuatorfrc name="left_hand_thumb_1_torque" joint="left_hand_thumb_1_joint" />
728
+ <jointactuatorfrc name="left_hand_thumb_2_torque" joint="left_hand_thumb_2_joint" />
729
+ <jointactuatorfrc name="left_hand_middle_0_torque" joint="left_hand_middle_0_joint" />
730
+ <jointactuatorfrc name="left_hand_middle_1_torque" joint="left_hand_middle_1_joint" />
731
+ <jointactuatorfrc name="left_hand_index_0_torque" joint="left_hand_index_0_joint" />
732
+ <jointactuatorfrc name="left_hand_index_1_torque" joint="left_hand_index_1_joint" />
733
+ <jointactuatorfrc name="right_hand_thumb_0_torque" joint="right_hand_thumb_0_joint" />
734
+ <jointactuatorfrc name="right_hand_thumb_1_torque" joint="right_hand_thumb_1_joint" />
735
+ <jointactuatorfrc name="right_hand_thumb_2_torque" joint="right_hand_thumb_2_joint" />
736
+ <jointactuatorfrc name="right_hand_middle_0_torque" joint="right_hand_middle_0_joint" />
737
+ <jointactuatorfrc name="right_hand_middle_1_torque" joint="right_hand_middle_1_joint" />
738
+ <jointactuatorfrc name="right_hand_index_0_torque" joint="right_hand_index_0_joint" />
739
+ <jointactuatorfrc name="right_hand_index_1_torque" joint="right_hand_index_1_joint" />
740
+
741
+ <framequat name="imu_quat" objtype="site" objname="imu" />
742
+ <gyro name="imu_gyro" site="imu" />
743
+ <accelerometer name="imu_acc" site="imu" />
744
+
745
+ <framepos name="frame_pos" objtype="site" objname="imu" />
746
+ <framelinvel name="frame_vel" objtype="site" objname="imu" />
747
+ </sensor>
748
+ </mujoco>
assets/g1_body29_hand14.urdf DELETED
@@ -1,1476 +0,0 @@
1
- <robot name="g1">
2
- <mujoco>
3
- <compiler meshdir="meshes" discardvisual="false"/>
4
- </mujoco>
5
-
6
- <!-- [CAUTION] uncomment when convert to mujoco -->
7
- <!-- <link name="world"></link>
8
- <joint name="floating_base_joint" type="floating">
9
- <parent link="world"/>
10
- <child link="pelvis"/>
11
- </joint> -->
12
-
13
- <link name="pelvis">
14
- <inertial>
15
- <origin xyz="0 0 -0.07605" rpy="0 0 0"/>
16
- <mass value="3.813"/>
17
- <inertia ixx="0.010549" ixy="0" ixz="2.1E-06" iyy="0.0093089" iyz="0" izz="0.0079184"/>
18
- </inertial>
19
- <visual>
20
- <origin xyz="0 0 0" rpy="0 0 0"/>
21
- <geometry>
22
- <mesh filename="meshes/pelvis.STL"/>
23
- </geometry>
24
- <material name="dark">
25
- <color rgba="0.2 0.2 0.2 1"/>
26
- </material>
27
- </visual>
28
- </link>
29
- <link name="pelvis_contour_link">
30
- <inertial>
31
- <origin xyz="0 0 0" rpy="0 0 0"/>
32
- <mass value="0.001"/>
33
- <inertia ixx="1e-7" ixy="0" ixz="0" iyy="1e-7" iyz="0" izz="1e-7"/>
34
- </inertial>
35
- <visual>
36
- <origin xyz="0 0 0" rpy="0 0 0"/>
37
- <geometry>
38
- <mesh filename="meshes/pelvis_contour_link.STL"/>
39
- </geometry>
40
- <material name="white">
41
- <color rgba="0.7 0.7 0.7 1"/>
42
- </material>
43
- </visual>
44
- <collision>
45
- <origin xyz="0 0 0" rpy="0 0 0"/>
46
- <geometry>
47
- <mesh filename="meshes/pelvis_contour_link.STL"/>
48
- </geometry>
49
- </collision>
50
- </link>
51
- <joint name="pelvis_contour_joint" type="fixed">
52
- <parent link="pelvis"/>
53
- <child link="pelvis_contour_link"/>
54
- </joint>
55
-
56
- <!-- Legs -->
57
- <link name="left_hip_pitch_link">
58
- <inertial>
59
- <origin xyz="0.002741 0.047791 -0.02606" rpy="0 0 0"/>
60
- <mass value="1.35"/>
61
- <inertia ixx="0.001811" ixy="3.68E-05" ixz="-3.44E-05" iyy="0.0014193" iyz="0.000171" izz="0.0012812"/>
62
- </inertial>
63
- <visual>
64
- <origin xyz="0 0 0" rpy="0 0 0"/>
65
- <geometry>
66
- <mesh filename="meshes/left_hip_pitch_link.STL"/>
67
- </geometry>
68
- <material name="dark">
69
- <color rgba="0.2 0.2 0.2 1"/>
70
- </material>
71
- </visual>
72
- <collision>
73
- <origin xyz="0 0 0" rpy="0 0 0"/>
74
- <geometry>
75
- <mesh filename="meshes/left_hip_pitch_link.STL"/>
76
- </geometry>
77
- </collision>
78
- </link>
79
- <joint name="left_hip_pitch_joint" type="revolute">
80
- <origin xyz="0 0.064452 -0.1027" rpy="0 0 0"/>
81
- <parent link="pelvis"/>
82
- <child link="left_hip_pitch_link"/>
83
- <axis xyz="0 1 0"/>
84
- <limit lower="-2.5307" upper="2.8798" effort="88" velocity="32"/>
85
- </joint>
86
- <link name="left_hip_roll_link">
87
- <inertial>
88
- <origin xyz="0.029812 -0.001045 -0.087934" rpy="0 0 0"/>
89
- <mass value="1.52"/>
90
- <inertia ixx="0.0023773" ixy="-3.8E-06" ixz="-0.0003908" iyy="0.0024123" iyz="1.84E-05" izz="0.0016595"/>
91
- </inertial>
92
- <visual>
93
- <origin xyz="0 0 0" rpy="0 0 0"/>
94
- <geometry>
95
- <mesh filename="meshes/left_hip_roll_link.STL"/>
96
- </geometry>
97
- <material name="white">
98
- <color rgba="0.7 0.7 0.7 1"/>
99
- </material>
100
- </visual>
101
- <collision>
102
- <origin xyz="0 0 0" rpy="0 0 0"/>
103
- <geometry>
104
- <mesh filename="meshes/left_hip_roll_link.STL"/>
105
- </geometry>
106
- </collision>
107
- </link>
108
- <joint name="left_hip_roll_joint" type="revolute">
109
- <origin xyz="0 0.052 -0.030465" rpy="0 -0.1749 0"/>
110
- <parent link="left_hip_pitch_link"/>
111
- <child link="left_hip_roll_link"/>
112
- <axis xyz="1 0 0"/>
113
- <limit lower="-0.5236" upper="2.9671" effort="139" velocity="20"/>
114
- </joint>
115
- <link name="left_hip_yaw_link">
116
- <inertial>
117
- <origin xyz="-0.057709 -0.010981 -0.15078" rpy="0 0 0"/>
118
- <mass value="1.702"/>
119
- <inertia ixx="0.0057774" ixy="-0.0005411" ixz="-0.0023948" iyy="0.0076124" iyz="-0.0007072" izz="0.003149"/>
120
- </inertial>
121
- <visual>
122
- <origin xyz="0 0 0" rpy="0 0 0"/>
123
- <geometry>
124
- <mesh filename="meshes/left_hip_yaw_link.STL"/>
125
- </geometry>
126
- <material name="white">
127
- <color rgba="0.7 0.7 0.7 1"/>
128
- </material>
129
- </visual>
130
- <collision>
131
- <origin xyz="0 0 0" rpy="0 0 0"/>
132
- <geometry>
133
- <mesh filename="meshes/left_hip_yaw_link.STL"/>
134
- </geometry>
135
- </collision>
136
- </link>
137
- <joint name="left_hip_yaw_joint" type="revolute">
138
- <origin xyz="0.025001 0 -0.12412" rpy="0 0 0"/>
139
- <parent link="left_hip_roll_link"/>
140
- <child link="left_hip_yaw_link"/>
141
- <axis xyz="0 0 1"/>
142
- <limit lower="-2.7576" upper="2.7576" effort="88" velocity="32"/>
143
- </joint>
144
- <link name="left_knee_link">
145
- <inertial>
146
- <origin xyz="0.005457 0.003964 -0.12074" rpy="0 0 0"/>
147
- <mass value="1.932"/>
148
- <inertia ixx="0.011329" ixy="4.82E-05" ixz="-4.49E-05" iyy="0.011277" iyz="-0.0007146" izz="0.0015168"/>
149
- </inertial>
150
- <visual>
151
- <origin xyz="0 0 0" rpy="0 0 0"/>
152
- <geometry>
153
- <mesh filename="meshes/left_knee_link.STL"/>
154
- </geometry>
155
- <material name="white">
156
- <color rgba="0.7 0.7 0.7 1"/>
157
- </material>
158
- </visual>
159
- <collision>
160
- <origin xyz="0 0 0" rpy="0 0 0"/>
161
- <geometry>
162
- <mesh filename="meshes/left_knee_link.STL"/>
163
- </geometry>
164
- </collision>
165
- </link>
166
- <joint name="left_knee_joint" type="revolute">
167
- <origin xyz="-0.078273 0.0021489 -0.17734" rpy="0 0.1749 0"/>
168
- <parent link="left_hip_yaw_link"/>
169
- <child link="left_knee_link"/>
170
- <axis xyz="0 1 0"/>
171
- <limit lower="-0.087267" upper="2.8798" effort="139" velocity="20"/>
172
- </joint>
173
- <link name="left_ankle_pitch_link">
174
- <inertial>
175
- <origin xyz="-0.007269 0 0.011137" rpy="0 0 0"/>
176
- <mass value="0.074"/>
177
- <inertia ixx="8.4E-06" ixy="0" ixz="-2.9E-06" iyy="1.89E-05" iyz="0" izz="1.26E-05"/>
178
- </inertial>
179
- <visual>
180
- <origin xyz="0 0 0" rpy="0 0 0"/>
181
- <geometry>
182
- <mesh filename="meshes/left_ankle_pitch_link.STL"/>
183
- </geometry>
184
- <material name="white">
185
- <color rgba="0.7 0.7 0.7 1"/>
186
- </material>
187
- </visual>
188
- <collision>
189
- <origin xyz="0 0 0" rpy="0 0 0"/>
190
- <geometry>
191
- <mesh filename="meshes/left_ankle_pitch_link.STL"/>
192
- </geometry>
193
- </collision>
194
- </link>
195
- <joint name="left_ankle_pitch_joint" type="revolute">
196
- <origin xyz="0 -9.4445E-05 -0.30001" rpy="0 0 0"/>
197
- <parent link="left_knee_link"/>
198
- <child link="left_ankle_pitch_link"/>
199
- <axis xyz="0 1 0"/>
200
- <limit lower="-0.87267" upper="0.5236" effort="50" velocity="37"/>
201
- </joint>
202
- <link name="left_ankle_roll_link">
203
- <inertial>
204
- <origin xyz="0.026505 0 -0.016425" rpy="0 0 0"/>
205
- <mass value="0.608"/>
206
- <inertia ixx="0.0002231" ixy="2E-07" ixz="8.91E-05" iyy="0.0016161" iyz="-1E-07" izz="0.0016667"/>
207
- </inertial>
208
- <visual>
209
- <origin xyz="0 0 0" rpy="0 0 0"/>
210
- <geometry>
211
- <mesh filename="meshes/left_ankle_roll_link.STL"/>
212
- </geometry>
213
- <material name="dark">
214
- <color rgba="0.2 0.2 0.2 1"/>
215
- </material>
216
- </visual>
217
- <collision>
218
- <origin xyz="-0.05 0.025 -0.03" rpy="0 0 0"/>
219
- <geometry>
220
- <sphere radius="0.005"/>
221
- </geometry>
222
- </collision>
223
- <collision>
224
- <origin xyz="-0.05 -0.025 -0.03" rpy="0 0 0"/>
225
- <geometry>
226
- <sphere radius="0.005"/>
227
- </geometry>
228
- </collision>
229
- <collision>
230
- <origin xyz="0.12 0.03 -0.03" rpy="0 0 0"/>
231
- <geometry>
232
- <sphere radius="0.005"/>
233
- </geometry>
234
- </collision>
235
- <collision>
236
- <origin xyz="0.12 -0.03 -0.03" rpy="0 0 0"/>
237
- <geometry>
238
- <sphere radius="0.005"/>
239
- </geometry>
240
- </collision>
241
- </link>
242
- <joint name="left_ankle_roll_joint" type="revolute">
243
- <origin xyz="0 0 -0.017558" rpy="0 0 0"/>
244
- <parent link="left_ankle_pitch_link"/>
245
- <child link="left_ankle_roll_link"/>
246
- <axis xyz="1 0 0"/>
247
- <limit lower="-0.2618" upper="0.2618" effort="50" velocity="37"/>
248
- </joint>
249
- <link name="right_hip_pitch_link">
250
- <inertial>
251
- <origin xyz="0.002741 -0.047791 -0.02606" rpy="0 0 0"/>
252
- <mass value="1.35"/>
253
- <inertia ixx="0.001811" ixy="-3.68E-05" ixz="-3.44E-05" iyy="0.0014193" iyz="-0.000171" izz="0.0012812"/>
254
- </inertial>
255
- <visual>
256
- <origin xyz="0 0 0" rpy="0 0 0"/>
257
- <geometry>
258
- <mesh filename="meshes/right_hip_pitch_link.STL"/>
259
- </geometry>
260
- <material name="dark">
261
- <color rgba="0.2 0.2 0.2 1"/>
262
- </material>
263
- </visual>
264
- <collision>
265
- <origin xyz="0 0 0" rpy="0 0 0"/>
266
- <geometry>
267
- <mesh filename="meshes/right_hip_pitch_link.STL"/>
268
- </geometry>
269
- </collision>
270
- </link>
271
- <joint name="right_hip_pitch_joint" type="revolute">
272
- <origin xyz="0 -0.064452 -0.1027" rpy="0 0 0"/>
273
- <parent link="pelvis"/>
274
- <child link="right_hip_pitch_link"/>
275
- <axis xyz="0 1 0"/>
276
- <limit lower="-2.5307" upper="2.8798" effort="88" velocity="32"/>
277
- </joint>
278
- <link name="right_hip_roll_link">
279
- <inertial>
280
- <origin xyz="0.029812 0.001045 -0.087934" rpy="0 0 0"/>
281
- <mass value="1.52"/>
282
- <inertia ixx="0.0023773" ixy="3.8E-06" ixz="-0.0003908" iyy="0.0024123" iyz="-1.84E-05" izz="0.0016595"/>
283
- </inertial>
284
- <visual>
285
- <origin xyz="0 0 0" rpy="0 0 0"/>
286
- <geometry>
287
- <mesh filename="meshes/right_hip_roll_link.STL"/>
288
- </geometry>
289
- <material name="white">
290
- <color rgba="0.7 0.7 0.7 1"/>
291
- </material>
292
- </visual>
293
- <collision>
294
- <origin xyz="0 0 0" rpy="0 0 0"/>
295
- <geometry>
296
- <mesh filename="meshes/right_hip_roll_link.STL"/>
297
- </geometry>
298
- </collision>
299
- </link>
300
- <joint name="right_hip_roll_joint" type="revolute">
301
- <origin xyz="0 -0.052 -0.030465" rpy="0 -0.1749 0"/>
302
- <parent link="right_hip_pitch_link"/>
303
- <child link="right_hip_roll_link"/>
304
- <axis xyz="1 0 0"/>
305
- <limit lower="-2.9671" upper="0.5236" effort="139" velocity="20"/>
306
- </joint>
307
- <link name="right_hip_yaw_link">
308
- <inertial>
309
- <origin xyz="-0.057709 0.010981 -0.15078" rpy="0 0 0"/>
310
- <mass value="1.702"/>
311
- <inertia ixx="0.0057774" ixy="0.0005411" ixz="-0.0023948" iyy="0.0076124" iyz="0.0007072" izz="0.003149"/>
312
- </inertial>
313
- <visual>
314
- <origin xyz="0 0 0" rpy="0 0 0"/>
315
- <geometry>
316
- <mesh filename="meshes/right_hip_yaw_link.STL"/>
317
- </geometry>
318
- <material name="white">
319
- <color rgba="0.7 0.7 0.7 1"/>
320
- </material>
321
- </visual>
322
- <collision>
323
- <origin xyz="0 0 0" rpy="0 0 0"/>
324
- <geometry>
325
- <mesh filename="meshes/right_hip_yaw_link.STL"/>
326
- </geometry>
327
- </collision>
328
- </link>
329
- <joint name="right_hip_yaw_joint" type="revolute">
330
- <origin xyz="0.025001 0 -0.12412" rpy="0 0 0"/>
331
- <parent link="right_hip_roll_link"/>
332
- <child link="right_hip_yaw_link"/>
333
- <axis xyz="0 0 1"/>
334
- <limit lower="-2.7576" upper="2.7576" effort="88" velocity="32"/>
335
- </joint>
336
- <link name="right_knee_link">
337
- <inertial>
338
- <origin xyz="0.005457 -0.003964 -0.12074" rpy="0 0 0"/>
339
- <mass value="1.932"/>
340
- <inertia ixx="0.011329" ixy="-4.82E-05" ixz="4.49E-05" iyy="0.011277" iyz="0.0007146" izz="0.0015168"/>
341
- </inertial>
342
- <visual>
343
- <origin xyz="0 0 0" rpy="0 0 0"/>
344
- <geometry>
345
- <mesh filename="meshes/right_knee_link.STL"/>
346
- </geometry>
347
- <material name="white">
348
- <color rgba="0.7 0.7 0.7 1"/>
349
- </material>
350
- </visual>
351
- <collision>
352
- <origin xyz="0 0 0" rpy="0 0 0"/>
353
- <geometry>
354
- <mesh filename="meshes/right_knee_link.STL"/>
355
- </geometry>
356
- </collision>
357
- </link>
358
- <joint name="right_knee_joint" type="revolute">
359
- <origin xyz="-0.078273 -0.0021489 -0.17734" rpy="0 0.1749 0"/>
360
- <parent link="right_hip_yaw_link"/>
361
- <child link="right_knee_link"/>
362
- <axis xyz="0 1 0"/>
363
- <limit lower="-0.087267" upper="2.8798" effort="139" velocity="20"/>
364
- </joint>
365
- <link name="right_ankle_pitch_link">
366
- <inertial>
367
- <origin xyz="-0.007269 0 0.011137" rpy="0 0 0"/>
368
- <mass value="0.074"/>
369
- <inertia ixx="8.4E-06" ixy="0" ixz="-2.9E-06" iyy="1.89E-05" iyz="0" izz="1.26E-05"/>
370
- </inertial>
371
- <visual>
372
- <origin xyz="0 0 0" rpy="0 0 0"/>
373
- <geometry>
374
- <mesh filename="meshes/right_ankle_pitch_link.STL"/>
375
- </geometry>
376
- <material name="white">
377
- <color rgba="0.7 0.7 0.7 1"/>
378
- </material>
379
- </visual>
380
- <collision>
381
- <origin xyz="0 0 0" rpy="0 0 0"/>
382
- <geometry>
383
- <mesh filename="meshes/right_ankle_pitch_link.STL"/>
384
- </geometry>
385
- </collision>
386
- </link>
387
- <joint name="right_ankle_pitch_joint" type="revolute">
388
- <origin xyz="0 9.4445E-05 -0.30001" rpy="0 0 0"/>
389
- <parent link="right_knee_link"/>
390
- <child link="right_ankle_pitch_link"/>
391
- <axis xyz="0 1 0"/>
392
- <limit lower="-0.87267" upper="0.5236" effort="50" velocity="37"/>
393
- </joint>
394
- <link name="right_ankle_roll_link">
395
- <inertial>
396
- <origin xyz="0.026505 0 -0.016425" rpy="0 0 0"/>
397
- <mass value="0.608"/>
398
- <inertia ixx="0.0002231" ixy="-2E-07" ixz="8.91E-05" iyy="0.0016161" iyz="1E-07" izz="0.0016667"/>
399
- </inertial>
400
- <visual>
401
- <origin xyz="0 0 0" rpy="0 0 0"/>
402
- <geometry>
403
- <mesh filename="meshes/right_ankle_roll_link.STL"/>
404
- </geometry>
405
- <material name="dark">
406
- <color rgba="0.2 0.2 0.2 1"/>
407
- </material>
408
- </visual>
409
- <collision>
410
- <origin xyz="-0.05 0.025 -0.03" rpy="0 0 0"/>
411
- <geometry>
412
- <sphere radius="0.005"/>
413
- </geometry>
414
- </collision>
415
- <collision>
416
- <origin xyz="-0.05 -0.025 -0.03" rpy="0 0 0"/>
417
- <geometry>
418
- <sphere radius="0.005"/>
419
- </geometry>
420
- </collision>
421
- <collision>
422
- <origin xyz="0.12 0.03 -0.03" rpy="0 0 0"/>
423
- <geometry>
424
- <sphere radius="0.005"/>
425
- </geometry>
426
- </collision>
427
- <collision>
428
- <origin xyz="0.12 -0.03 -0.03" rpy="0 0 0"/>
429
- <geometry>
430
- <sphere radius="0.005"/>
431
- </geometry>
432
- </collision>
433
- </link>
434
- <joint name="right_ankle_roll_joint" type="revolute">
435
- <origin xyz="0 0 -0.017558" rpy="0 0 0"/>
436
- <parent link="right_ankle_pitch_link"/>
437
- <child link="right_ankle_roll_link"/>
438
- <axis xyz="1 0 0"/>
439
- <limit lower="-0.2618" upper="0.2618" effort="50" velocity="37"/>
440
- </joint>
441
-
442
- <!-- Torso -->
443
- <link name="waist_yaw_link">
444
- <inertial>
445
- <origin xyz="0.003494 0.000233 0.018034" rpy="0 0 0"/>
446
- <mass value="0.214"/>
447
- <inertia ixx="0.00010673" ixy="2.703E-06" ixz="-7.631E-06" iyy="0.00010422" iyz="-2.01E-07" izz="0.0001625"/>
448
- </inertial>
449
- <visual>
450
- <origin xyz="0 0 0" rpy="0 0 0"/>
451
- <geometry>
452
- <mesh filename="meshes/waist_yaw_link_rev_1_0.STL"/>
453
- </geometry>
454
- <material name="white">
455
- <color rgba="0.7 0.7 0.7 1"/>
456
- </material>
457
- </visual>
458
- </link>
459
- <joint name="waist_yaw_joint" type="revolute">
460
- <origin xyz="0 0 0" rpy="0 0 0"/>
461
- <parent link="pelvis"/>
462
- <child link="waist_yaw_link"/>
463
- <axis xyz="0 0 1"/>
464
- <limit lower="-2.618" upper="2.618" effort="88" velocity="32"/>
465
- </joint>
466
- <link name="waist_roll_link">
467
- <inertial>
468
- <origin xyz="0 2.3E-05 0" rpy="0 0 0"/>
469
- <mass value="0.086"/>
470
- <inertia ixx="7.079E-06" ixy="0" ixz="0" iyy="6.339E-06" iyz="0" izz="8.245E-06"/>
471
- </inertial>
472
- <visual>
473
- <origin xyz="0 0 0" rpy="0 0 0"/>
474
- <geometry>
475
- <mesh filename="meshes/waist_roll_link_rev_1_0.STL"/>
476
- </geometry>
477
- <material name="white">
478
- <color rgba="0.7 0.7 0.7 1"/>
479
- </material>
480
- </visual>
481
- </link>
482
- <joint name="waist_roll_joint" type="revolute">
483
- <origin xyz="-0.0039635 0 0.044" rpy="0 0 0"/>
484
- <parent link="waist_yaw_link"/>
485
- <child link="waist_roll_link"/>
486
- <axis xyz="1 0 0"/>
487
- <limit lower="-0.52" upper="0.52" effort="50" velocity="37"/>
488
- </joint>
489
- <link name="torso_link">
490
- <inertial>
491
- <origin xyz="0.000931 0.000346 0.15082" rpy="0 0 0"/>
492
- <mass value="6.78"/>
493
- <inertia ixx="0.05905" ixy="3.3302E-05" ixz="-0.0017715" iyy="0.047014" iyz="-2.2399E-05" izz="0.025652"/>
494
- </inertial>
495
- <visual>
496
- <origin xyz="0 0 0" rpy="0 0 0"/>
497
- <geometry>
498
- <mesh filename="meshes/torso_link_rev_1_0.STL"/>
499
- </geometry>
500
- <material name="white">
501
- <color rgba="0.7 0.7 0.7 1"/>
502
- </material>
503
- </visual>
504
- <collision>
505
- <origin xyz="0 0 0" rpy="0 0 0"/>
506
- <geometry>
507
- <mesh filename="meshes/torso_link_rev_1_0.STL"/>
508
- </geometry>
509
- </collision>
510
- </link>
511
- <joint name="waist_pitch_joint" type="revolute">
512
- <origin xyz="0 0 0" rpy="0 0 0"/>
513
- <parent link="waist_roll_link"/>
514
- <child link="torso_link"/>
515
- <axis xyz="0 1 0"/>
516
- <limit lower="-0.52" upper="0.52" effort="50" velocity="37"/>
517
- </joint>
518
-
519
- <!-- LOGO -->
520
- <joint name="logo_joint" type="fixed">
521
- <origin xyz="0.0039635 0 -0.044" rpy="0 0 0"/>
522
- <parent link="torso_link"/>
523
- <child link="logo_link"/>
524
- </joint>
525
- <link name="logo_link">
526
- <inertial>
527
- <origin xyz="0 0 0" rpy="0 0 0"/>
528
- <mass value="0.001"/>
529
- <inertia ixx="1e-7" ixy="0" ixz="0" iyy="1e-7" iyz="0" izz="1e-7"/>
530
- </inertial>
531
- <visual>
532
- <origin xyz="0 0 0" rpy="0 0 0"/>
533
- <geometry>
534
- <mesh filename="meshes/logo_link.STL"/>
535
- </geometry>
536
- <material name="dark">
537
- <color rgba="0.2 0.2 0.2 1"/>
538
- </material>
539
- </visual>
540
- <collision>
541
- <origin xyz="0 0 0" rpy="0 0 0"/>
542
- <geometry>
543
- <mesh filename="meshes/logo_link.STL"/>
544
- </geometry>
545
- </collision>
546
- </link>
547
-
548
- <!-- Head -->
549
- <link name="head_link">
550
- <inertial>
551
- <origin xyz="0.005267 0.000299 0.449869" rpy="0 0 0"/>
552
- <mass value="1.036"/>
553
- <inertia ixx="0.004085051" ixy="-2.543E-06" ixz="-6.9455E-05" iyy="0.004185212" iyz="-3.726E-06" izz="0.001807911"/>
554
- </inertial>
555
- <visual>
556
- <origin xyz="0 0 0" rpy="0 0 0"/>
557
- <geometry>
558
- <mesh filename="meshes/head_link.STL"/>
559
- </geometry>
560
- <material name="dark">
561
- <color rgba="0.2 0.2 0.2 1"/>
562
- </material>
563
- </visual>
564
- <collision>
565
- <origin xyz="0 0 0" rpy="0 0 0"/>
566
- <geometry>
567
- <mesh filename="meshes/head_link.STL"/>
568
- </geometry>
569
- </collision>
570
- </link>
571
- <joint name="head_joint" type="fixed">
572
- <origin xyz="0.0039635 0 -0.044" rpy="0 0 0"/>
573
- <parent link="torso_link"/>
574
- <child link="head_link"/>
575
- </joint>
576
-
577
-
578
- <!-- IMU -->
579
- <link name="imu_in_torso"></link>
580
- <joint name="imu_in_torso_joint" type="fixed">
581
- <origin xyz="-0.03959 -0.00224 0.14792" rpy="0 0 0"/>
582
- <parent link="torso_link"/>
583
- <child link="imu_in_torso"/>
584
- </joint>
585
-
586
- <link name="imu_in_pelvis"></link>
587
- <joint name="imu_in_pelvis_joint" type="fixed">
588
- <origin xyz="0.04525 0 -0.08339" rpy="0 0 0"/>
589
- <parent link="pelvis"/>
590
- <child link="imu_in_pelvis"/>
591
- </joint>
592
-
593
- <!-- d435 -->
594
- <link name="d435_link"></link>
595
- <joint name="d435_joint" type="fixed">
596
- <origin xyz="0.0576235 0.01753 0.42987" rpy="0 0.8307767239493009 0"/>
597
- <parent link="torso_link"/>
598
- <child link="d435_link"/>
599
- </joint>
600
-
601
- <!-- mid360 -->
602
- <link name="mid360_link"></link>
603
- <joint name="mid360_joint" type="fixed">
604
- <origin xyz="0.0002835 0.00003 0.41618" rpy="0 0.04014257279586953 0"/>
605
- <parent link="torso_link"/>
606
- <child link="mid360_link"/>
607
- </joint>
608
-
609
- <!-- Arm -->
610
- <link name="left_shoulder_pitch_link">
611
- <inertial>
612
- <origin xyz="0 0.035892 -0.011628" rpy="0 0 0"/>
613
- <mass value="0.718"/>
614
- <inertia ixx="0.0004291" ixy="-9.2E-06" ixz="6.4E-06" iyy="0.000453" iyz="2.26E-05" izz="0.000423"/>
615
- </inertial>
616
- <visual>
617
- <origin xyz="0 0 0" rpy="0 0 0"/>
618
- <geometry>
619
- <mesh filename="meshes/left_shoulder_pitch_link.STL"/>
620
- </geometry>
621
- <material name="white">
622
- <color rgba="0.7 0.7 0.7 1"/>
623
- </material>
624
- </visual>
625
- <collision>
626
- <origin xyz="0 0.04 -0.01" rpy="0 1.5707963267948966 0"/>
627
- <geometry>
628
- <cylinder radius="0.03" length="0.05"/>
629
- </geometry>
630
- </collision>
631
- </link>
632
- <joint name="left_shoulder_pitch_joint" type="revolute">
633
- <origin xyz="0.0039563 0.10022 0.24778" rpy="0.27931 5.4949E-05 -0.00019159"/>
634
- <parent link="torso_link"/>
635
- <child link="left_shoulder_pitch_link"/>
636
- <axis xyz="0 1 0"/>
637
- <limit lower="-3.0892" upper="2.6704" effort="25" velocity="37"/>
638
- </joint>
639
- <link name="left_shoulder_roll_link">
640
- <inertial>
641
- <origin xyz="-0.000227 0.00727 -0.063243" rpy="0 0 0"/>
642
- <mass value="0.643"/>
643
- <inertia ixx="0.0006177" ixy="-1E-06" ixz="8.7E-06" iyy="0.0006912" iyz="-5.3E-06" izz="0.0003894"/>
644
- </inertial>
645
- <visual>
646
- <origin xyz="0 0 0" rpy="0 0 0"/>
647
- <geometry>
648
- <mesh filename="meshes/left_shoulder_roll_link.STL"/>
649
- </geometry>
650
- <material name="white">
651
- <color rgba="0.7 0.7 0.7 1"/>
652
- </material>
653
- </visual>
654
- <collision>
655
- <origin xyz="-0.004 0.006 -0.053" rpy="0 0 0"/>
656
- <geometry>
657
- <cylinder radius="0.03" length="0.03"/>
658
- </geometry>
659
- </collision>
660
- </link>
661
- <joint name="left_shoulder_roll_joint" type="revolute">
662
- <origin xyz="0 0.038 -0.013831" rpy="-0.27925 0 0"/>
663
- <parent link="left_shoulder_pitch_link"/>
664
- <child link="left_shoulder_roll_link"/>
665
- <axis xyz="1 0 0"/>
666
- <limit lower="-1.5882" upper="2.2515" effort="25" velocity="37"/>
667
- </joint>
668
- <link name="left_shoulder_yaw_link">
669
- <inertial>
670
- <origin xyz="0.010773 -0.002949 -0.072009" rpy="0 0 0"/>
671
- <mass value="0.734"/>
672
- <inertia ixx="0.0009988" ixy="7.9E-06" ixz="0.0001412" iyy="0.0010605" iyz="-2.86E-05" izz="0.0004354"/>
673
- </inertial>
674
- <visual>
675
- <origin xyz="0 0 0" rpy="0 0 0"/>
676
- <geometry>
677
- <mesh filename="meshes/left_shoulder_yaw_link.STL"/>
678
- </geometry>
679
- <material name="white">
680
- <color rgba="0.7 0.7 0.7 1"/>
681
- </material>
682
- </visual>
683
- <collision>
684
- <origin xyz="0 0 0" rpy="0 0 0"/>
685
- <geometry>
686
- <mesh filename="meshes/left_shoulder_yaw_link.STL"/>
687
- </geometry>
688
- </collision>
689
- </link>
690
- <joint name="left_shoulder_yaw_joint" type="revolute">
691
- <origin xyz="0 0.00624 -0.1032" rpy="0 0 0"/>
692
- <parent link="left_shoulder_roll_link"/>
693
- <child link="left_shoulder_yaw_link"/>
694
- <axis xyz="0 0 1"/>
695
- <limit lower="-2.618" upper="2.618" effort="25" velocity="37"/>
696
- </joint>
697
- <link name="left_elbow_link">
698
- <inertial>
699
- <origin xyz="0.064956 0.004454 -0.010062" rpy="0 0 0"/>
700
- <mass value="0.6"/>
701
- <inertia ixx="0.0002891" ixy="6.53E-05" ixz="1.72E-05" iyy="0.0004152" iyz="-5.6E-06" izz="0.0004197"/>
702
- </inertial>
703
- <visual>
704
- <origin xyz="0 0 0" rpy="0 0 0"/>
705
- <geometry>
706
- <mesh filename="meshes/left_elbow_link.STL"/>
707
- </geometry>
708
- <material name="white">
709
- <color rgba="0.7 0.7 0.7 1"/>
710
- </material>
711
- </visual>
712
- <collision>
713
- <origin xyz="0 0 0" rpy="0 0 0"/>
714
- <geometry>
715
- <mesh filename="meshes/left_elbow_link.STL"/>
716
- </geometry>
717
- </collision>
718
- </link>
719
- <joint name="left_elbow_joint" type="revolute">
720
- <origin xyz="0.015783 0 -0.080518" rpy="0 0 0"/>
721
- <parent link="left_shoulder_yaw_link"/>
722
- <child link="left_elbow_link"/>
723
- <axis xyz="0 1 0"/>
724
- <limit lower="-1.0472" upper="2.0944" effort="25" velocity="37"/>
725
- </joint>
726
- <joint name="left_wrist_roll_joint" type="revolute">
727
- <origin xyz="0.100 0.00188791 -0.010" rpy="0 0 0"/>
728
- <axis xyz="1 0 0"/>
729
- <parent link="left_elbow_link"/>
730
- <child link="left_wrist_roll_link"/>
731
- <limit effort="25" velocity="37" lower="-1.972222054" upper="1.972222054"/>
732
- </joint>
733
- <link name="left_wrist_roll_link">
734
- <inertial>
735
- <origin xyz="0.01713944778 0.00053759094 0.00000048864" rpy="0 0 0"/>
736
- <mass value="0.08544498"/>
737
- <inertia ixx="0.00004821544023" ixy="-0.00000424511021" ixz="0.00000000510599" iyy="0.00003722899093" iyz="-0.00000000123525" izz="0.00005482106541"/>
738
- </inertial>
739
- <visual>
740
- <origin xyz="0 0 0" rpy="0 0 0"/>
741
- <geometry>
742
- <mesh filename="meshes/left_wrist_roll_link.STL"/>
743
- </geometry>
744
- <material name="white">
745
- <color rgba="0.7 0.7 0.7 1"/>
746
- </material>
747
- </visual>
748
- <collision>
749
- <origin xyz="0 0 0" rpy="0 0 0"/>
750
- <geometry>
751
- <mesh filename="meshes/left_wrist_roll_link.STL"/>
752
- </geometry>
753
- </collision>
754
- </link>
755
- <joint name="left_wrist_pitch_joint" type="revolute">
756
- <origin xyz="0.038 0 0" rpy="0 0 0"/>
757
- <axis xyz="0 1 0"/>
758
- <parent link="left_wrist_roll_link"/>
759
- <child link="left_wrist_pitch_link"/>
760
- <limit effort="5" velocity="22" lower="-1.614429558" upper="1.614429558"/>
761
- </joint>
762
- <link name="left_wrist_pitch_link">
763
- <inertial>
764
- <origin xyz="0.02299989837 -0.00111685314 -0.00111658096" rpy="0 0 0"/>
765
- <mass value="0.48404956"/>
766
- <inertia ixx="0.00016579646273" ixy="-0.00001231206746" ixz="0.00001231699194" iyy="0.00042954057410" iyz="0.00000081417712" izz="0.00042953697654"/>
767
- </inertial>
768
- <visual>
769
- <origin xyz="0 0 0" rpy="0 0 0"/>
770
- <geometry>
771
- <mesh filename="meshes/left_wrist_pitch_link.STL"/>
772
- </geometry>
773
- <material name="white">
774
- <color rgba="0.7 0.7 0.7 1"/>
775
- </material>
776
- </visual>
777
- <collision>
778
- <origin xyz="0 0 0" rpy="0 0 0"/>
779
- <geometry>
780
- <mesh filename="meshes/left_wrist_pitch_link.STL"/>
781
- </geometry>
782
- </collision>
783
- </link>
784
- <joint name="left_wrist_yaw_joint" type="revolute">
785
- <origin xyz="0.046 0 0" rpy="0 0 0"/>
786
- <axis xyz="0 0 1"/>
787
- <parent link="left_wrist_pitch_link"/>
788
- <child link="left_wrist_yaw_link"/>
789
- <limit effort="5" velocity="22" lower="-1.614429558" upper="1.614429558"/>
790
- </joint>
791
- <link name="left_wrist_yaw_link">
792
- <inertial>
793
- <origin xyz="0.02200381568 0.00049485096 0.00053861123" rpy="0 0 0"/>
794
- <mass value="0.08457647"/>
795
- <inertia ixx="0.00004929128828" ixy="-0.00000045735494" ixz="0.00000445867591" iyy="0.00005973338134" iyz="0.00000043217198" izz="0.00003928083826"/>
796
- </inertial>
797
- <visual>
798
- <origin xyz="0 0 0" rpy="0 0 0"/>
799
- <geometry>
800
- <mesh filename="meshes/left_wrist_yaw_link.STL"/>
801
- </geometry>
802
- <material name="white">
803
- <color rgba="0.7 0.7 0.7 1"/>
804
- </material>
805
- </visual>
806
- <collision>
807
- <origin xyz="0 0 0" rpy="0 0 0"/>
808
- <geometry>
809
- <mesh filename="meshes/left_wrist_yaw_link.STL"/>
810
- </geometry>
811
- </collision>
812
- </link>
813
- <joint name="left_hand_palm_joint" type="fixed">
814
- <origin xyz="0.0415 0.003 0" rpy="0 0 0"/>
815
- <parent link="left_wrist_yaw_link"/>
816
- <child link="left_hand_palm_link"/>
817
- </joint>
818
- <link name="left_hand_palm_link">
819
- <inertial>
820
- <origin xyz="0.06214634836 -0.00050869656 -0.00058171093" rpy="0 0 0"/>
821
- <mass value="0.37283854"/>
822
- <inertia ixx="0.00027535181027" ixy="-0.00001595519465" ixz="-0.00000242161890" iyy="0.00053951827219" iyz="-0.00000042279435" izz="0.00039623390907"/>
823
- </inertial>
824
- <visual>
825
- <origin xyz="0 0 0" rpy="0 0 0"/>
826
- <geometry>
827
- <mesh filename="meshes/left_hand_palm_link.STL"/>
828
- </geometry>
829
- <material name="white">
830
- <color rgba="0.7 0.7 0.7 1"/>
831
- </material>
832
- </visual>
833
- <collision>
834
- <origin xyz="0 0 0" rpy="0 0 0"/>
835
- <geometry>
836
- <mesh filename="meshes/left_hand_palm_link.STL"/>
837
- </geometry>
838
- </collision>
839
- </link>
840
- <joint name="left_hand_thumb_0_joint" type="revolute">
841
- <origin xyz="0.0255 0 0" rpy="0 0 0"/>
842
- <axis xyz="0 1 0"/>
843
- <parent link="left_hand_palm_link"/>
844
- <child link="left_hand_thumb_0_link"/>
845
- <limit effort="2.45" velocity="6.857" lower="-1.04719755" upper="1.04719755"/>
846
- </joint>
847
- <link name="left_hand_thumb_0_link">
848
- <inertial>
849
- <origin xyz="-0.00088424580 -0.00863407079 0.00094429336" rpy="0 0 0"/>
850
- <mass value="0.08623657"/>
851
- <inertia ixx="0.00001602919238" ixy="0.00000010683177" ixz="0.00000016728875" iyy="0.00001451795012" iyz="-0.00000051094752" izz="0.00001637877663"/>
852
- </inertial>
853
- <visual>
854
- <origin xyz="0 0 0" rpy="0 0 0"/>
855
- <geometry>
856
- <mesh filename="meshes/left_hand_thumb_0_link.STL"/>
857
- </geometry>
858
- <material name="white">
859
- <color rgba="0.7 0.7 0.7 1"/>
860
- </material>
861
- </visual>
862
- <collision>
863
- <origin xyz="0 0 0" rpy="0 0 0"/>
864
- <geometry>
865
- <mesh filename="meshes/left_hand_thumb_0_link.STL"/>
866
- </geometry>
867
- </collision>
868
- </link>
869
- <joint name="left_hand_thumb_1_joint" type="revolute">
870
- <origin xyz="-0.0025 -0.0193 0" rpy="0 0 0"/>
871
- <axis xyz="0 0 1"/>
872
- <parent link="left_hand_thumb_0_link"/>
873
- <child link="left_hand_thumb_1_link"/>
874
- <limit effort="1.4" velocity="12" lower="-0.72431163" upper="1.04719755"/>
875
- </joint>
876
- <link name="left_hand_thumb_1_link">
877
- <inertial>
878
- <origin xyz="-0.00082788768 -0.03547435774 -0.00038089960" rpy="0 0 0"/>
879
- <mass value="0.05885070"/>
880
- <inertia ixx="0.00001274699945" ixy="-0.00000050770784" ixz="0.00000016088850" iyy="0.00000601573947" iyz="-0.00000027839003" izz="0.00001234543582"/>
881
- </inertial>
882
- <visual>
883
- <origin xyz="0 0 0" rpy="0 0 0"/>
884
- <geometry>
885
- <mesh filename="meshes/left_hand_thumb_1_link.STL"/>
886
- </geometry>
887
- <material name="white">
888
- <color rgba="0.7 0.7 0.7 1"/>
889
- </material>
890
- </visual>
891
- <collision>
892
- <origin xyz="-0.001 -0.032 0" rpy="0 0 0"/>
893
- <geometry>
894
- <box size="0.02 0.03 0.02"/>
895
- </geometry>
896
- </collision>
897
- </link>
898
- <joint name="left_hand_thumb_2_joint" type="revolute">
899
- <origin xyz="0 -0.0458 0" rpy="0 0 0"/>
900
- <axis xyz="0 0 1"/>
901
- <parent link="left_hand_thumb_1_link"/>
902
- <child link="left_hand_thumb_2_link"/>
903
- <limit effort="1.4" velocity="12" lower="0" upper="1.74532925"/>
904
- </joint>
905
- <link name="left_hand_thumb_2_link">
906
- <inertial>
907
- <origin xyz="-0.00171735242 -0.02628192939 0.00010778879" rpy="0 0 0"/>
908
- <mass value="0.02030626"/>
909
- <inertia ixx="0.00000461267817" ixy="-0.00000003422130" ixz="-0.00000000823881" iyy="0.00000153561368" iyz="-0.00000002549885" izz="0.00000386625776"/>
910
- </inertial>
911
- <visual>
912
- <origin xyz="0 0 0" rpy="0 0 0"/>
913
- <geometry>
914
- <mesh filename="meshes/left_hand_thumb_2_link.STL"/>
915
- </geometry>
916
- <material name="white">
917
- <color rgba="0.7 0.7 0.7 1"/>
918
- </material>
919
- </visual>
920
- <collision>
921
- <origin xyz="0 0 0" rpy="0 0 0"/>
922
- <geometry>
923
- <mesh filename="meshes/left_hand_thumb_2_link.STL"/>
924
- </geometry>
925
- </collision>
926
- </link>
927
- <joint name="left_hand_middle_0_joint" type="revolute">
928
- <origin xyz="0.0777 0.0016 -0.0285" rpy="0 0 0"/>
929
- <axis xyz="0 0 1"/>
930
- <parent link="left_hand_palm_link"/>
931
- <child link="left_hand_middle_0_link"/>
932
- <limit effort="1.4" velocity="12" lower="-1.57079632" upper="0"/>
933
- </joint>
934
- <link name="left_hand_middle_0_link">
935
- <inertial>
936
- <origin xyz="0.03547435774 0.00082788768 0.00038089960" rpy="0 0 0"/>
937
- <mass value="0.05885070"/>
938
- <inertia ixx="0.00000601573947" ixy="-0.00000050770784" ixz="-0.00000027839003" iyy="0.00001274699945" iyz="0.00000016088850" izz="0.00001234543582"/>
939
- </inertial>
940
- <visual>
941
- <origin xyz="0 0 0" rpy="0 0 0"/>
942
- <geometry>
943
- <mesh filename="meshes/left_hand_middle_0_link.STL"/>
944
- </geometry>
945
- <material name="white">
946
- <color rgba="0.7 0.7 0.7 1"/>
947
- </material>
948
- </visual>
949
- <collision>
950
- <origin xyz="0 0 0" rpy="0 0 0"/>
951
- <geometry>
952
- <mesh filename="meshes/left_hand_middle_0_link.STL"/>
953
- </geometry>
954
- </collision>
955
- </link>
956
- <joint name="left_hand_middle_1_joint" type="revolute">
957
- <origin xyz="0.0458 0 0" rpy="0 0 0"/>
958
- <axis xyz="0 0 1"/>
959
- <parent link="left_hand_middle_0_link"/>
960
- <child link="left_hand_middle_1_link"/>
961
- <limit effort="1.4" velocity="12" lower="-1.74532925" upper="0"/>
962
- </joint>
963
- <link name="left_hand_middle_1_link">
964
- <inertial>
965
- <origin xyz="0.02628192939 0.00171735242 -0.00010778879" rpy="0 0 0"/>
966
- <mass value="0.02030626"/>
967
- <inertia ixx="0.00000153561368" ixy="-0.00000003422130" ixz="-0.00000002549885" iyy="0.00000461267817" iyz="-0.00000000823881" izz="0.00000386625776"/>
968
- </inertial>
969
- <visual>
970
- <origin xyz="0 0 0" rpy="0 0 0"/>
971
- <geometry>
972
- <mesh filename="meshes/left_hand_middle_1_link.STL"/>
973
- </geometry>
974
- <material name="white">
975
- <color rgba="0.7 0.7 0.7 1"/>
976
- </material>
977
- </visual>
978
- <collision>
979
- <origin xyz="0 0 0" rpy="0 0 0"/>
980
- <geometry>
981
- <mesh filename="meshes/left_hand_middle_1_link.STL"/>
982
- </geometry>
983
- </collision>
984
- </link>
985
- <joint name="left_hand_index_0_joint" type="revolute">
986
- <origin xyz="0.0777 0.0016 0.0285" rpy="0 0 0"/>
987
- <axis xyz="0 0 1"/>
988
- <parent link="left_hand_palm_link"/>
989
- <child link="left_hand_index_0_link"/>
990
- <limit effort="1.4" velocity="12" lower="-1.57079632" upper="0"/>
991
- </joint>
992
- <link name="left_hand_index_0_link">
993
- <inertial>
994
- <origin xyz="0.03547435774 0.00082788768 0.00038089960" rpy="0 0 0"/>
995
- <mass value="0.05885070"/>
996
- <inertia ixx="0.00000601573947" ixy="-0.00000050770784" ixz="-0.00000027839003" iyy="0.00001274699945" iyz="0.00000016088850" izz="0.00001234543582"/>
997
- </inertial>
998
- <visual>
999
- <origin xyz="0 0 0" rpy="0 0 0"/>
1000
- <geometry>
1001
- <mesh filename="meshes/left_hand_index_0_link.STL"/>
1002
- </geometry>
1003
- <material name="white">
1004
- <color rgba="0.7 0.7 0.7 1"/>
1005
- </material>
1006
- </visual>
1007
- <collision>
1008
- <origin xyz="0 0 0" rpy="0 0 0"/>
1009
- <geometry>
1010
- <mesh filename="meshes/left_hand_index_0_link.STL"/>
1011
- </geometry>
1012
- </collision>
1013
- </link>
1014
- <joint name="left_hand_index_1_joint" type="revolute">
1015
- <origin xyz="0.0458 0 0" rpy="0 0 0"/>
1016
- <axis xyz="0 0 1"/>
1017
- <parent link="left_hand_index_0_link"/>
1018
- <child link="left_hand_index_1_link"/>
1019
- <limit effort="1.4" velocity="12" lower="-1.74532925" upper="0"/>
1020
- </joint>
1021
- <link name="left_hand_index_1_link">
1022
- <inertial>
1023
- <origin xyz="0.02628192939 0.00171735242 -0.00010778879" rpy="0 0 0"/>
1024
- <mass value="0.02030626"/>
1025
- <inertia ixx="0.00000153561368" ixy="-0.00000003422130" ixz="-0.00000002549885" iyy="0.00000461267817" iyz="-0.00000000823881" izz="0.00000386625776"/>
1026
- </inertial>
1027
- <visual>
1028
- <origin xyz="0 0 0" rpy="0 0 0"/>
1029
- <geometry>
1030
- <mesh filename="meshes/left_hand_index_1_link.STL"/>
1031
- </geometry>
1032
- <material name="white">
1033
- <color rgba="0.7 0.7 0.7 1"/>
1034
- </material>
1035
- </visual>
1036
- <collision>
1037
- <origin xyz="0 0 0" rpy="0 0 0"/>
1038
- <geometry>
1039
- <mesh filename="meshes/left_hand_index_1_link.STL"/>
1040
- </geometry>
1041
- </collision>
1042
- </link>
1043
- <link name="right_shoulder_pitch_link">
1044
- <inertial>
1045
- <origin xyz="0 -0.035892 -0.011628" rpy="0 0 0"/>
1046
- <mass value="0.718"/>
1047
- <inertia ixx="0.0004291" ixy="9.2E-06" ixz="6.4E-06" iyy="0.000453" iyz="-2.26E-05" izz="0.000423"/>
1048
- </inertial>
1049
- <visual>
1050
- <origin xyz="0 0 0" rpy="0 0 0"/>
1051
- <geometry>
1052
- <mesh filename="meshes/right_shoulder_pitch_link.STL"/>
1053
- </geometry>
1054
- <material name="white">
1055
- <color rgba="0.7 0.7 0.7 1"/>
1056
- </material>
1057
- </visual>
1058
- <collision>
1059
- <origin xyz="0 -0.04 -0.01" rpy="0 1.5707963267948966 0"/>
1060
- <geometry>
1061
- <cylinder radius="0.03" length="0.05"/>
1062
- </geometry>
1063
- </collision>
1064
- </link>
1065
- <joint name="right_shoulder_pitch_joint" type="revolute">
1066
- <origin xyz="0.0039563 -0.10021 0.24778" rpy="-0.27931 5.4949E-05 0.00019159"/>
1067
- <parent link="torso_link"/>
1068
- <child link="right_shoulder_pitch_link"/>
1069
- <axis xyz="0 1 0"/>
1070
- <limit lower="-3.0892" upper="2.6704" effort="25" velocity="37"/>
1071
- </joint>
1072
- <link name="right_shoulder_roll_link">
1073
- <inertial>
1074
- <origin xyz="-0.000227 -0.00727 -0.063243" rpy="0 0 0"/>
1075
- <mass value="0.643"/>
1076
- <inertia ixx="0.0006177" ixy="1E-06" ixz="8.7E-06" iyy="0.0006912" iyz="5.3E-06" izz="0.0003894"/>
1077
- </inertial>
1078
- <visual>
1079
- <origin xyz="0 0 0" rpy="0 0 0"/>
1080
- <geometry>
1081
- <mesh filename="meshes/right_shoulder_roll_link.STL"/>
1082
- </geometry>
1083
- <material name="white">
1084
- <color rgba="0.7 0.7 0.7 1"/>
1085
- </material>
1086
- </visual>
1087
- <collision>
1088
- <origin xyz="-0.004 -0.006 -0.053" rpy="0 0 0"/>
1089
- <geometry>
1090
- <cylinder radius="0.03" length="0.03"/>
1091
- </geometry>
1092
- </collision>
1093
- </link>
1094
- <joint name="right_shoulder_roll_joint" type="revolute">
1095
- <origin xyz="0 -0.038 -0.013831" rpy="0.27925 0 0"/>
1096
- <parent link="right_shoulder_pitch_link"/>
1097
- <child link="right_shoulder_roll_link"/>
1098
- <axis xyz="1 0 0"/>
1099
- <limit lower="-2.2515" upper="1.5882" effort="25" velocity="37"/>
1100
- </joint>
1101
- <link name="right_shoulder_yaw_link">
1102
- <inertial>
1103
- <origin xyz="0.010773 0.002949 -0.072009" rpy="0 0 0"/>
1104
- <mass value="0.734"/>
1105
- <inertia ixx="0.0009988" ixy="-7.9E-06" ixz="0.0001412" iyy="0.0010605" iyz="2.86E-05" izz="0.0004354"/>
1106
- </inertial>
1107
- <visual>
1108
- <origin xyz="0 0 0" rpy="0 0 0"/>
1109
- <geometry>
1110
- <mesh filename="meshes/right_shoulder_yaw_link.STL"/>
1111
- </geometry>
1112
- <material name="white">
1113
- <color rgba="0.7 0.7 0.7 1"/>
1114
- </material>
1115
- </visual>
1116
- <collision>
1117
- <origin xyz="0 0 0" rpy="0 0 0"/>
1118
- <geometry>
1119
- <mesh filename="meshes/right_shoulder_yaw_link.STL"/>
1120
- </geometry>
1121
- </collision>
1122
- </link>
1123
- <joint name="right_shoulder_yaw_joint" type="revolute">
1124
- <origin xyz="0 -0.00624 -0.1032" rpy="0 0 0"/>
1125
- <parent link="right_shoulder_roll_link"/>
1126
- <child link="right_shoulder_yaw_link"/>
1127
- <axis xyz="0 0 1"/>
1128
- <limit lower="-2.618" upper="2.618" effort="25" velocity="37"/>
1129
- </joint>
1130
- <link name="right_elbow_link">
1131
- <inertial>
1132
- <origin xyz="0.064956 -0.004454 -0.010062" rpy="0 0 0"/>
1133
- <mass value="0.6"/>
1134
- <inertia ixx="0.0002891" ixy="-6.53E-05" ixz="1.72E-05" iyy="0.0004152" iyz="5.6E-06" izz="0.0004197"/>
1135
- </inertial>
1136
- <visual>
1137
- <origin xyz="0 0 0" rpy="0 0 0"/>
1138
- <geometry>
1139
- <mesh filename="meshes/right_elbow_link.STL"/>
1140
- </geometry>
1141
- <material name="white">
1142
- <color rgba="0.7 0.7 0.7 1"/>
1143
- </material>
1144
- </visual>
1145
- <collision>
1146
- <origin xyz="0 0 0" rpy="0 0 0"/>
1147
- <geometry>
1148
- <mesh filename="meshes/right_elbow_link.STL"/>
1149
- </geometry>
1150
- </collision>
1151
- </link>
1152
- <joint name="right_elbow_joint" type="revolute">
1153
- <origin xyz="0.015783 0 -0.080518" rpy="0 0 0"/>
1154
- <parent link="right_shoulder_yaw_link"/>
1155
- <child link="right_elbow_link"/>
1156
- <axis xyz="0 1 0"/>
1157
- <limit lower="-1.0472" upper="2.0944" effort="25" velocity="37"/>
1158
- </joint>
1159
- <joint name="right_wrist_roll_joint" type="revolute">
1160
- <origin xyz="0.100 -0.00188791 -0.010" rpy="0 0 0"/>
1161
- <axis xyz="1 0 0"/>
1162
- <parent link="right_elbow_link"/>
1163
- <child link="right_wrist_roll_link"/>
1164
- <limit effort="25" velocity="37" lower="-1.972222054" upper="1.972222054"/>
1165
- </joint>
1166
- <link name="right_wrist_roll_link">
1167
- <inertial>
1168
- <origin xyz="0.01713944778 -0.00053759094 0.00000048864" rpy="0 0 0"/>
1169
- <mass value="0.08544498"/>
1170
- <inertia ixx="0.00004821544023" ixy="0.00000424511021" ixz="0.00000000510599" iyy="0.00003722899093" iyz="0.00000000123525" izz="0.00005482106541"/>
1171
- </inertial>
1172
- <visual>
1173
- <origin xyz="0 0 0" rpy="0 0 0"/>
1174
- <geometry>
1175
- <mesh filename="meshes/right_wrist_roll_link.STL"/>
1176
- </geometry>
1177
- <material name="white">
1178
- <color rgba="0.7 0.7 0.7 1"/>
1179
- </material>
1180
- </visual>
1181
- <collision>
1182
- <origin xyz="0 0 0" rpy="0 0 0"/>
1183
- <geometry>
1184
- <mesh filename="meshes/right_wrist_roll_link.STL"/>
1185
- </geometry>
1186
- </collision>
1187
- </link>
1188
- <joint name="right_wrist_pitch_joint" type="revolute">
1189
- <origin xyz="0.038 0 0" rpy="0 0 0"/>
1190
- <axis xyz="0 1 0"/>
1191
- <parent link="right_wrist_roll_link"/>
1192
- <child link="right_wrist_pitch_link"/>
1193
- <limit effort="5" velocity="22" lower="-1.614429558" upper="1.614429558"/>
1194
- </joint>
1195
- <link name="right_wrist_pitch_link">
1196
- <inertial>
1197
- <origin xyz="0.02299989837 0.00111685314 -0.00111658096" rpy="0 0 0"/>
1198
- <mass value="0.48404956"/>
1199
- <inertia ixx="0.00016579646273" ixy="0.00001231206746" ixz="0.00001231699194" iyy="0.00042954057410" iyz="-0.00000081417712" izz="0.00042953697654"/>
1200
- </inertial>
1201
- <visual>
1202
- <origin xyz="0 0 0" rpy="0 0 0"/>
1203
- <geometry>
1204
- <mesh filename="meshes/right_wrist_pitch_link.STL"/>
1205
- </geometry>
1206
- <material name="white">
1207
- <color rgba="0.7 0.7 0.7 1"/>
1208
- </material>
1209
- </visual>
1210
- <collision>
1211
- <origin xyz="0 0 0" rpy="0 0 0"/>
1212
- <geometry>
1213
- <mesh filename="meshes/right_wrist_pitch_link.STL"/>
1214
- </geometry>
1215
- </collision>
1216
- </link>
1217
- <joint name="right_wrist_yaw_joint" type="revolute">
1218
- <origin xyz="0.046 0 0" rpy="0 0 0"/>
1219
- <axis xyz="0 0 1"/>
1220
- <parent link="right_wrist_pitch_link"/>
1221
- <child link="right_wrist_yaw_link"/>
1222
- <limit effort="5" velocity="22" lower="-1.614429558" upper="1.614429558"/>
1223
- </joint>
1224
- <link name="right_wrist_yaw_link">
1225
- <inertial>
1226
- <origin xyz="0.02200381568 -0.00049485096 0.00053861123" rpy="0 0 0"/>
1227
- <mass value="0.08457647"/>
1228
- <inertia ixx="0.00004929128828" ixy="0.00000045735494" ixz="0.00000445867591" iyy="0.00005973338134" iyz="-0.00000043217198" izz="0.00003928083826"/>
1229
- </inertial>
1230
- <visual>
1231
- <origin xyz="0 0 0" rpy="0 0 0"/>
1232
- <geometry>
1233
- <mesh filename="meshes/right_wrist_yaw_link.STL"/>
1234
- </geometry>
1235
- <material name="white">
1236
- <color rgba="0.7 0.7 0.7 1"/>
1237
- </material>
1238
- </visual>
1239
- <collision>
1240
- <origin xyz="0 0 0" rpy="0 0 0"/>
1241
- <geometry>
1242
- <mesh filename="meshes/right_wrist_yaw_link.STL"/>
1243
- </geometry>
1244
- </collision>
1245
- </link>
1246
- <joint name="right_hand_palm_joint" type="fixed">
1247
- <origin xyz="0.0415 -0.003 0" rpy="0 0 0"/>
1248
- <parent link="right_wrist_yaw_link"/>
1249
- <child link="right_hand_palm_link"/>
1250
- </joint>
1251
- <link name="right_hand_palm_link">
1252
- <inertial>
1253
- <origin xyz="0.06214634836 0.00050869656 -0.00058171093" rpy="0 0 0"/>
1254
- <mass value="0.37283854"/>
1255
- <inertia ixx="0.00027535181027" ixy="0.00001595519465" ixz="-0.00000242161890" iyy="0.00053951827219" iyz="0.00000042279435" izz="0.00039623390907"/>
1256
- </inertial>
1257
- <visual>
1258
- <origin xyz="0 0 0" rpy="0 0 0"/>
1259
- <geometry>
1260
- <mesh filename="meshes/right_hand_palm_link.STL"/>
1261
- </geometry>
1262
- <material name="white">
1263
- <color rgba="0.7 0.7 0.7 1"/>
1264
- </material>
1265
- </visual>
1266
- <collision>
1267
- <origin xyz="0 0 0" rpy="0 0 0"/>
1268
- <geometry>
1269
- <mesh filename="meshes/right_hand_palm_link.STL"/>
1270
- </geometry>
1271
- </collision>
1272
- </link>
1273
- <joint name="right_hand_thumb_0_joint" type="revolute">
1274
- <origin xyz="0.0255 0 0" rpy="0 0 0"/>
1275
- <axis xyz="0 1 0"/>
1276
- <parent link="right_hand_palm_link"/>
1277
- <child link="right_hand_thumb_0_link"/>
1278
- <limit effort="2.45" velocity="6.857" lower="-1.04719755" upper="1.04719755"/>
1279
- </joint>
1280
- <link name="right_hand_thumb_0_link">
1281
- <inertial>
1282
- <origin xyz="-0.00088424580 0.00863407079 0.00094429336" rpy="0 0 0"/>
1283
- <mass value="0.08623657"/>
1284
- <inertia ixx="0.00001602919238" ixy="-0.00000010683177" ixz="0.00000016728875" iyy="0.00001451795012" iyz="0.00000051094752" izz="0.00001637877663"/>
1285
- </inertial>
1286
- <visual>
1287
- <origin xyz="0 0 0" rpy="0 0 0"/>
1288
- <geometry>
1289
- <mesh filename="meshes/right_hand_thumb_0_link.STL"/>
1290
- </geometry>
1291
- <material name="white">
1292
- <color rgba="0.7 0.7 0.7 1"/>
1293
- </material>
1294
- </visual>
1295
- <collision>
1296
- <origin xyz="0 0 0" rpy="0 0 0"/>
1297
- <geometry>
1298
- <mesh filename="meshes/right_hand_thumb_0_link.STL"/>
1299
- </geometry>
1300
- </collision>
1301
- </link>
1302
- <joint name="right_hand_thumb_1_joint" type="revolute">
1303
- <origin xyz="-0.0025 0.0193 0" rpy="0 0 0"/>
1304
- <axis xyz="0 0 1"/>
1305
- <parent link="right_hand_thumb_0_link"/>
1306
- <child link="right_hand_thumb_1_link"/>
1307
- <limit effort="1.4" velocity="12" lower="-1.04719755" upper="0.72431163"/>
1308
- </joint>
1309
- <link name="right_hand_thumb_1_link">
1310
- <inertial>
1311
- <origin xyz="-0.00082788768 0.03547435774 -0.00038089960" rpy="0 0 0"/>
1312
- <mass value="0.05885070"/>
1313
- <inertia ixx="0.00001274699945" ixy="0.00000050770784" ixz="0.00000016088850" iyy="0.00000601573947" iyz="0.00000027839003" izz="0.00001234543582"/>
1314
- </inertial>
1315
- <visual>
1316
- <origin xyz="0 0 0" rpy="0 0 0"/>
1317
- <geometry>
1318
- <mesh filename="meshes/right_hand_thumb_1_link.STL"/>
1319
- </geometry>
1320
- <material name="white">
1321
- <color rgba="0.7 0.7 0.7 1"/>
1322
- </material>
1323
- </visual>
1324
- <collision>
1325
- <origin xyz="-0.001 0.032 0" rpy="0 0 0"/>
1326
- <geometry>
1327
- <box size="0.02 0.03 0.02"/>
1328
- </geometry>
1329
- </collision>
1330
- </link>
1331
- <joint name="right_hand_thumb_2_joint" type="revolute">
1332
- <origin xyz="0 0.0458 0" rpy="0 0 0"/>
1333
- <axis xyz="0 0 1"/>
1334
- <parent link="right_hand_thumb_1_link"/>
1335
- <child link="right_hand_thumb_2_link"/>
1336
- <limit effort="1.4" velocity="12" lower="-1.74532925" upper="0"/>
1337
- </joint>
1338
- <link name="right_hand_thumb_2_link">
1339
- <inertial>
1340
- <origin xyz="-0.00171735242 0.02628192939 0.00010778879" rpy="0 0 0"/>
1341
- <mass value="0.02030626"/>
1342
- <inertia ixx="0.00000461267817" ixy="0.00000003422130" ixz="-0.00000000823881" iyy="0.00000153561368" iyz="0.00000002549885" izz="0.00000386625776"/>
1343
- </inertial>
1344
- <visual>
1345
- <origin xyz="0 0 0" rpy="0 0 0"/>
1346
- <geometry>
1347
- <mesh filename="meshes/right_hand_thumb_2_link.STL"/>
1348
- </geometry>
1349
- <material name="white">
1350
- <color rgba="0.7 0.7 0.7 1"/>
1351
- </material>
1352
- </visual>
1353
- <collision>
1354
- <origin xyz="0 0 0" rpy="0 0 0"/>
1355
- <geometry>
1356
- <mesh filename="meshes/right_hand_thumb_2_link.STL"/>
1357
- </geometry>
1358
- </collision>
1359
- </link>
1360
- <joint name="right_hand_middle_0_joint" type="revolute">
1361
- <origin xyz="0.0777 -0.0016 -0.0285" rpy="0 0 0"/>
1362
- <axis xyz="0 0 1"/>
1363
- <parent link="right_hand_palm_link"/>
1364
- <child link="right_hand_middle_0_link"/>
1365
- <limit effort="1.4" velocity="12" lower="0" upper="1.57079632"/>
1366
- </joint>
1367
- <link name="right_hand_middle_0_link">
1368
- <inertial>
1369
- <origin xyz="0.03547435774 -0.00082788768 0.00038089960" rpy="0 0 0"/>
1370
- <mass value="0.05885070"/>
1371
- <inertia ixx="0.00000601573947" ixy="0.00000050770784" ixz="-0.00000027839003" iyy="0.00001274699945" iyz="-0.00000016088850" izz="0.00001234543582"/>
1372
- </inertial>
1373
- <visual>
1374
- <origin xyz="0 0 0" rpy="0 0 0"/>
1375
- <geometry>
1376
- <mesh filename="meshes/right_hand_middle_0_link.STL"/>
1377
- </geometry>
1378
- <material name="white">
1379
- <color rgba="0.7 0.7 0.7 1"/>
1380
- </material>
1381
- </visual>
1382
- <collision>
1383
- <origin xyz="0 0 0" rpy="0 0 0"/>
1384
- <geometry>
1385
- <mesh filename="meshes/right_hand_middle_0_link.STL"/>
1386
- </geometry>
1387
- </collision>
1388
- </link>
1389
- <joint name="right_hand_middle_1_joint" type="revolute">
1390
- <origin xyz="0.0458 0 0" rpy="0 0 0"/>
1391
- <axis xyz="0 0 1"/>
1392
- <parent link="right_hand_middle_0_link"/>
1393
- <child link="right_hand_middle_1_link"/>
1394
- <limit effort="1.4" velocity="12" lower="0" upper="1.74532925"/>
1395
- </joint>
1396
- <link name="right_hand_middle_1_link">
1397
- <inertial>
1398
- <origin xyz="0.02628192939 -0.00171735242 -0.00010778879" rpy="0 0 0"/>
1399
- <mass value="0.02030626"/>
1400
- <inertia ixx="0.00000153561368" ixy="0.00000003422130" ixz="-0.00000002549885" iyy="0.00000461267817" iyz="0.00000000823881" izz="0.00000386625776"/>
1401
- </inertial>
1402
- <visual>
1403
- <origin xyz="0 0 0" rpy="0 0 0"/>
1404
- <geometry>
1405
- <mesh filename="meshes/right_hand_middle_1_link.STL"/>
1406
- </geometry>
1407
- <material name="white">
1408
- <color rgba="0.7 0.7 0.7 1"/>
1409
- </material>
1410
- </visual>
1411
- <collision>
1412
- <origin xyz="0 0 0" rpy="0 0 0"/>
1413
- <geometry>
1414
- <mesh filename="meshes/right_hand_middle_1_link.STL"/>
1415
- </geometry>
1416
- </collision>
1417
- </link>
1418
- <joint name="right_hand_index_0_joint" type="revolute">
1419
- <origin xyz="0.0777 -0.0016 0.0285" rpy="0 0 0"/>
1420
- <axis xyz="0 0 1"/>
1421
- <parent link="right_hand_palm_link"/>
1422
- <child link="right_hand_index_0_link"/>
1423
- <limit effort="1.4" velocity="12" lower="0" upper="1.57079632"/>
1424
- </joint>
1425
- <link name="right_hand_index_0_link">
1426
- <inertial>
1427
- <origin xyz="0.03547435774 -0.00082788768 0.00038089960" rpy="0 0 0"/>
1428
- <mass value="0.05885070"/>
1429
- <inertia ixx="0.00000601573947" ixy="0.00000050770784" ixz="-0.00000027839003" iyy="0.00001274699945" iyz="-0.00000016088850" izz="0.00001234543582"/>
1430
- </inertial>
1431
- <visual>
1432
- <origin xyz="0 0 0" rpy="0 0 0"/>
1433
- <geometry>
1434
- <mesh filename="meshes/right_hand_index_0_link.STL"/>
1435
- </geometry>
1436
- <material name="white">
1437
- <color rgba="0.7 0.7 0.7 1"/>
1438
- </material>
1439
- </visual>
1440
- <collision>
1441
- <origin xyz="0 0 0" rpy="0 0 0"/>
1442
- <geometry>
1443
- <mesh filename="meshes/right_hand_index_0_link.STL"/>
1444
- </geometry>
1445
- </collision>
1446
- </link>
1447
- <joint name="right_hand_index_1_joint" type="revolute">
1448
- <origin xyz="0.0458 0 0" rpy="0 0 0"/>
1449
- <axis xyz="0 0 1"/>
1450
- <parent link="right_hand_index_0_link"/>
1451
- <child link="right_hand_index_1_link"/>
1452
- <limit effort="1.4" velocity="12" lower="0" upper="1.74532925"/>
1453
- </joint>
1454
- <link name="right_hand_index_1_link">
1455
- <inertial>
1456
- <origin xyz="0.02628192939 -0.00171735242 -0.00010778879" rpy="0 0 0"/>
1457
- <mass value="0.02030626"/>
1458
- <inertia ixx="0.00000153561368" ixy="0.00000003422130" ixz="-0.00000002549885" iyy="0.00000461267817" iyz="0.00000000823881" izz="0.00000386625776"/>
1459
- </inertial>
1460
- <visual>
1461
- <origin xyz="0 0 0" rpy="0 0 0"/>
1462
- <geometry>
1463
- <mesh filename="meshes/right_hand_index_1_link.STL"/>
1464
- </geometry>
1465
- <material name="white">
1466
- <color rgba="0.7 0.7 0.7 1"/>
1467
- </material>
1468
- </visual>
1469
- <collision>
1470
- <origin xyz="0 0 0" rpy="0 0 0"/>
1471
- <geometry>
1472
- <mesh filename="meshes/right_hand_index_1_link.STL"/>
1473
- </geometry>
1474
- </collision>
1475
- </link>
1476
- </robot>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/meshes_exo_left/part_4.stl DELETED
Binary file (684 Bytes)
 
assets/meshes_exo_left/shoulder.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:98759c5e7684006fd20bfba3f082022e12b4f3700fd4dfb47119929b22b2695f
3
- size 194384
 
 
 
 
assets/meshes_exo_left/shoulder__2.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:ff937dd8d731370c130f534916f15b63a202cded3a9a10b87c282bb72e38483d
3
- size 136584
 
 
 
 
assets/meshes_exo_left/shoulder__3.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:e9b7229f1980357280d437213c1d279df46ade7d37ef5eb37e6301dc7b2c2d30
3
- size 577884
 
 
 
 
assets/meshes_exo_left/shoulder__4.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:3b8b58ef8958d187f60b8d10cd691e01c7f3adf483ab09271824e3b9089ea410
3
- size 580484
 
 
 
 
assets/meshes_exo_left/shoulder__5.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:6fcb3d9a0a3c28541390fb9d7b325b041a08ae2ffab724dece4fb0178781307b
3
- size 164084
 
 
 
 
assets/meshes_exo_left/wrist.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:a28d777d62dcc0fb25467a682d91811e742772fa452d1141c4bffd565db037b2
3
- size 520784
 
 
 
 
assets/meshes_exo_left/wrist__2.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:71b29d7a3927bad99efffe572c07271531681984d46aed5984943039c17e3346
3
- size 102084
 
 
 
 
assets/meshes_exo_left/wrist__3.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:c03a91b4800cdbc00bd290f77fd1bd90a744a5d9b7bb2220d515d9991f696ea6
3
- size 137084
 
 
 
 
assets/meshes_exo_left/wrist__4.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:d898dbcddb44c176729b5144b40490437a2a09ec50a3929b255917c522fa389c
3
- size 724284
 
 
 
 
assets/meshes_exo_left/wrist__5.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:8eb6c0298ff682e4e199bb5f25e9e198d54db944fecf0146203cc6714993f06f
3
- size 138984
 
 
 
 
assets/meshes_exo_left/wrist__6.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:92590e6c4a435046f8647e3b4d3101843fadc7a9ea14475e5008ae2aa58fae1f
3
- size 182184
 
 
 
 
assets/meshes_exo_left/x.stl DELETED
Binary file (14.5 kB)
 
assets/meshes_exo_left/y.stl DELETED
Binary file (14.5 kB)
 
assets/meshes_exo_left/z.stl DELETED
Binary file (14.5 kB)
 
assets/meshes_exo_right/part_4.stl DELETED
Binary file (684 Bytes)
 
assets/meshes_exo_right/shoulder.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:42e98b8dc6f63da139874bfef108ce4a92fd68ea332ef0d2770b35679cdec572
3
- size 194384
 
 
 
 
assets/meshes_exo_right/shoulder__2.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:b2089082163df5498518dd2adcb005e0f32687def5707358724ca5d1f7ac70d8
3
- size 136584
 
 
 
 
assets/meshes_exo_right/shoulder__3.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:0f7000c1891a9fed0ccfebbb1070e8f787547970207f1c1ae51a962d85deeed7
3
- size 577884
 
 
 
 
assets/meshes_exo_right/shoulder__4.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:78838a47fc73f97ab3f355ba903621b5b102ce5de278a0ecf35b3cd05ab228dc
3
- size 580484
 
 
 
 
assets/meshes_exo_right/shoulder__5.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:d864c1b61a23a047844799d6a924a9554887d267916ba72bdc24f1ff1434ee6d
3
- size 164084
 
 
 
 
assets/meshes_exo_right/wrist.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:18197e26156ff8a25ab38a2f20e03870d7b8ca56f3299351e2b54377670ee3d0
3
- size 520784
 
 
 
 
assets/meshes_exo_right/wrist__2.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:5b9cafe9f773c7719a30390add14efbfb0f0dfefe0287228156dca052d35c6a4
3
- size 102084
 
 
 
 
assets/meshes_exo_right/wrist__3.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:c1f2a8cb8edc00116626e4779d9cb3f554e33d2a436b682d3e3f99ddd0ee52f9
3
- size 137084
 
 
 
 
assets/meshes_exo_right/wrist__4.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:e8ca263cadaa40534fd9edff649057633aaa925c6ad56e6ab25275157182b35e
3
- size 724284
 
 
 
 
assets/meshes_exo_right/wrist__5.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:9c9bacaf421feab7f65bb05674eca1fd972cb84690cb694eed0032dbce3c5b22
3
- size 138984
 
 
 
 
assets/meshes_exo_right/wrist__6.stl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:a8568cd6286f54f186cb769b038261e0b498585443bbde573e4ebcb2dd551acb
3
- size 182184
 
 
 
 
assets/meshes_exo_right/x.stl DELETED
Binary file (14.5 kB)
 
assets/meshes_exo_right/y.stl DELETED
Binary file (14.5 kB)
 
assets/meshes_exo_right/z.stl DELETED
Binary file (14.5 kB)
 
assets/scene_29dof.xml CHANGED
@@ -1,5 +1,5 @@
1
  <mujoco model="g1_29dof scene">
2
- <include file="g1_29dof_no_hand.xml"/>
3
 
4
  <statistic center="0 0 0.5" extent="2.0"/>
5
 
 
1
  <mujoco model="g1_29dof scene">
2
+ <include file="g1_29dof_old.xml"/>
3
 
4
  <statistic center="0 0 0.5" extent="2.0"/>
5
 
config.yaml CHANGED
@@ -1,49 +1,423 @@
1
- # Robot Configuration
2
- ROBOT_TYPE: 'g1_29dof'
3
- ROBOT_SCENE: "assets/scene_43dof.xml"
4
 
5
- # DDS Communication
6
- DOMAIN_ID: 0
7
- INTERFACE: "lo" # "lo" for simulation, network interface with "192.168.123.222" for real robot
8
- SIMULATOR: "mujoco"
9
 
10
- # Joystick
11
- USE_JOYSTICK: 1
12
- JOYSTICK_TYPE: "xbox" # "xbox" or "switch"
13
- JOYSTICK_DEVICE: 0
14
 
15
- # Simulation Settings
16
- FREE_BASE: False
17
- enable_waist: False # False = band on torso, True = band on pelvis
18
- ENABLE_ELASTIC_BAND: True
19
 
20
- # Timing
21
- SIMULATE_DT: 0.004 # 250Hz physics
22
- VIEWER_DT: 0.02 # 50Hz viewer update
23
- IMAGE_DT: 0.033333 # ~30Hz camera
24
 
25
- # Rendering
26
- ENABLE_ONSCREEN: true
27
- ENABLE_OFFSCREEN: false
28
- MP_START_METHOD: "spawn"
29
 
30
- # Sensors
 
 
 
 
 
 
31
  USE_SENSOR: False
32
- PRINT_SCENE_INFORMATION: True
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
- # Robot Dimensions
35
  NUM_MOTORS: 29
36
  NUM_JOINTS: 29
37
  NUM_HAND_MOTORS: 7
38
  NUM_HAND_JOINTS: 7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
 
40
- # Torque Limits (Nm) - 29 body + 14 hand = 43 total
41
- motor_effort_limit_list: [
42
- 88.0, 88.0, 88.0, 139.0, 50.0, 50.0, # left leg
43
- 88.0, 88.0, 88.0, 139.0, 50.0, 50.0, # right leg
44
- 88.0, 50.0, 50.0, # waist
45
- 25.0, 25.0, 25.0, 25.0, 25.0, 5.0, 5.0, # left arm
46
- 2.45, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, # left hand
47
- 25.0, 25.0, 25.0, 25.0, 25.0, 5.0, 5.0, # right arm
48
- 2.45, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7 # right hand
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GEAR_WBC_CONFIG: "gr00t_wbc/sim2mujoco/resources/robots/g1/g1_gear_wbc.yaml"
 
 
2
 
3
+ # copy from g1_43dof_hist.yaml
4
+ ROBOT_TYPE: 'g1_29dof' # Robot name, "go2", "b2", "b2w", "h1", "go2w", "g1"
5
+ ROBOT_SCENE: "assets/scene_43dof.xml" # Robot scene with 3-finger dex hands
 
6
 
7
+ DOMAIN_ID: 0 # Domain id
8
+ # Network Interface, "lo" for simulation and the one with "192.168.123.222" for real robot
9
+ INTERFACE: "lo"
10
+ SIMULATOR: "mujoco" # "robocasa"
11
 
12
+ USE_JOYSTICK: 0 # Simulate Unitree WirelessController using a gamepad (0: disable, 1: enable)
13
+ JOYSTICK_TYPE: "xbox" # support "xbox" and "switch" gamepad layout
14
+ JOYSTICK_DEVICE: 0 # Joystick number
 
15
 
16
+ FREE_BASE: False
17
+ enable_waist: False # Enable waist joints control (False = band on torso, True = band on pelvis)
 
 
18
 
19
+ PRINT_SCENE_INFORMATION: True # Print link, joint and sensors information of robot
20
+ ENABLE_ELASTIC_BAND: True # Virtual spring band, used for lifting h1
 
 
21
 
22
+ SIMULATE_DT: 0.002 # Simulation timestep (500Hz)
23
+ ENABLE_ONSCREEN: true # Show visualization window
24
+ ENABLE_OFFSCREEN: false # Offscreen rendering for cameras (set to true to enable camera publishing)
25
+ IMAGE_DT: 0.033333 # Image publishing rate ~30Hz
26
+ MP_START_METHOD: "spawn" # Multiprocessing start method for image subprocess
27
+ VIEWER_DT: 0.02 # Viewer update time
28
+ REWARD_DT: 0.02
29
  USE_SENSOR: False
30
+ USE_HISTORY: True
31
+ USE_HISTORY_LOCO: True
32
+ USE_HISTORY_MIMIC: True
33
+
34
+ GAIT_PERIOD: 0.9 # 1.25
35
+
36
+ MOTOR2JOINT: [0, 1, 2, 3, 4, 5,
37
+ 6, 7, 8, 9, 10, 11,
38
+ 12, 13, 14,
39
+ 15, 16, 17, 18, 19, 20, 21,
40
+ 22, 23, 24, 25, 26, 27, 28]
41
+
42
+ JOINT2MOTOR: [0, 1, 2, 3, 4, 5,
43
+ 6, 7, 8, 9, 10, 11,
44
+ 12, 13, 14,
45
+ 15, 16, 17, 18, 19, 20, 21,
46
+ 22, 23, 24, 25, 26, 27, 28]
47
+
48
+
49
+ UNITREE_LEGGED_CONST:
50
+ HIGHLEVEL: 0xEE
51
+ LOWLEVEL: 0xFF
52
+ TRIGERLEVEL: 0xF0
53
+ PosStopF: 2146000000.0
54
+ VelStopF: 16000.0
55
+ MODE_MACHINE: 5
56
+ MODE_PR: 0
57
+
58
+ JOINT_KP: [
59
+ 100, 100, 100, 200, 20, 20,
60
+ 100, 100, 100, 200, 20, 20,
61
+ 400, 400, 400,
62
+ 90, 60, 20, 60, 4, 4, 4,
63
+ 90, 60, 20, 60, 4, 4, 4
64
+ ]
65
+
66
+
67
+ JOINT_KD: [
68
+ 2.5, 2.5, 2.5, 5, 0.2, 0.1,
69
+ 2.5, 2.5, 2.5, 5, 0.2, 0.1,
70
+ 5.0, 5.0, 5.0,
71
+ 2.0, 1.0, 0.4, 1.0, 0.2, 0.2, 0.2,
72
+ 2.0, 1.0, 0.4, 1.0, 0.2, 0.2, 0.2
73
+ ]
74
+
75
+ # arm kp
76
+ # soft kp, safe, test it first
77
+ # 50, 50, 20, 20, 10, 10, 10
78
+ # hard kp, use only if policy is safe
79
+ # 200, 200, 80, 80, 50, 50, 50,
80
+
81
+ # MOTOR_KP: [
82
+ # 100, 100, 100, 200, 20, 20,
83
+ # 100, 100, 100, 200, 20, 20,
84
+ # 400, 400, 400,
85
+ # 50, 50, 20, 20, 10, 10, 10,
86
+ # 50, 50, 20, 20, 10, 10, 10
87
+ # ]
88
+
89
+ MOTOR_KP: [
90
+ 150, 150, 150, 200, 40, 40,
91
+ 150, 150, 150, 200, 40, 40,
92
+ 800, 250, 800,
93
+ 100, 100, 40, 40, 100, 100, 100,
94
+ 100, 100, 40, 40, 100, 100, 100
95
+ ]
96
+
97
+ MOTOR_KD: [
98
+ 2, 2, 2, 4, 2, 2,
99
+ 2, 2, 2, 4, 2, 2,
100
+ 10, 5, 10,
101
+ 5, 5, 2, 2, 5, 5, 5,
102
+ 5, 5, 2, 2, 5, 5, 5
103
+ ]
104
+
105
+ # MOTOR_KP: [
106
+ # 100, 100, 100, 200, 20, 20,
107
+ # 100, 100, 100, 200, 20, 20,
108
+ # 400, 400, 400,
109
+ # 90, 60, 20, 60, 4, 4, 4,
110
+ # 90, 60, 20, 60, 4, 4, 4
111
+ # ]
112
+
113
+
114
+ # MOTOR_KD: [
115
+ # 2.5, 2.5, 2.5, 5, 0.2, 0.1,
116
+ # 2.5, 2.5, 2.5, 5, 0.2, 0.1,
117
+ # 5.0, 5.0, 5.0,
118
+ # 2.0, 1.0, 0.4, 1.0, 0.2, 0.2, 0.2,
119
+ # 2.0, 1.0, 0.4, 1.0, 0.2, 0.2, 0.2
120
+ # ]
121
+
122
+
123
+ WeakMotorJointIndex:
124
+ left_hip_yaw_joint: 0
125
+ left_hip_roll_joint: 1
126
+ left_hip_pitch_joint: 2
127
+ left_knee_joint: 3
128
+ left_ankle_pitch_joint: 4
129
+ left_ankle_roll_joint: 5
130
+ right_hip_yaw_joint: 6
131
+ right_hip_roll_joint: 7
132
+ right_hip_pitch_joint: 8
133
+ right_knee_joint: 9
134
+ right_ankle_pitch_joint: 10
135
+ right_ankle_roll_joint: 11
136
+ waist_yaw_joint : 12
137
+ waist_roll_joint : 13
138
+ waist_pitch_joint : 14
139
+ left_shoulder_pitch_joint: 15
140
+ left_shoulder_roll_joint: 16
141
+ left_shoulder_yaw_joint: 17
142
+ left_elbow_joint: 18
143
+ left_wrist_roll_joint: 19
144
+ left_wrist_pitch_joint: 20
145
+ left_wrist_yaw_joint: 21
146
+ right_shoulder_pitch_joint: 22
147
+ right_shoulder_roll_joint: 23
148
+ right_shoulder_yaw_joint: 24
149
+ right_elbow_joint: 25
150
+ right_wrist_roll_joint: 26
151
+ right_wrist_pitch_joint: 27
152
+ right_wrist_yaw_joint: 28
153
 
 
154
  NUM_MOTORS: 29
155
  NUM_JOINTS: 29
156
  NUM_HAND_MOTORS: 7
157
  NUM_HAND_JOINTS: 7
158
+ NUM_UPPER_BODY_JOINTS: 17
159
+
160
+ DEFAULT_DOF_ANGLES: [
161
+ -0.1, # left_hip_pitch_joint
162
+ 0.0, # left_hip_roll_joint
163
+ 0.0, # left_hip_yaw_joint
164
+ 0.3, # left_knee_joint
165
+ -0.2, # left_ankle_pitch_joint
166
+ 0.0, # left_ankle_roll_joint
167
+ -0.1, # right_hip_pitch_joint
168
+ 0.0, # right_hip_roll_joint
169
+ 0.0, # right_hip_yaw_joint
170
+ 0.3, # right_knee_joint
171
+ -0.2, # right_ankle_pitch_joint
172
+ 0.0, # right_ankle_roll_joint
173
+ 0.0, # waist_yaw_joint
174
+ 0.0, # waist_roll_joint
175
+ 0.0, # waist_pitch_joint
176
+ 0.0, # left_shoulder_pitch_joint
177
+ 0.0, # left_shoulder_roll_joint
178
+ 0.0, # left_shoulder_yaw_joint
179
+ 0.0, # left_elbow_joint
180
+ 0.0, # left_wrist_roll_joint
181
+ 0.0, # left_wrist_pitch_joint
182
+ 0.0, # left_wrist_yaw_joint
183
+ 0.0, # right_shoulder_pitch_joint
184
+ 0.0, # right_shoulder_roll_joint
185
+ 0.0, # right_shoulder_yaw_joint
186
+ 0.0, # right_elbow_joint
187
+ 0.0, # right_wrist_roll_joint
188
+ 0.0, # right_wrist_pitch_joint
189
+ 0.0 # right_wrist_yaw_joint
190
+ ]
191
+
192
+ DEFAULT_MOTOR_ANGLES: [
193
+ -0.1, # left_hip_pitch_joint
194
+ 0.0, # left_hip_roll_joint
195
+ 0.0, # left_hip_yaw_joint
196
+ 0.3, # left_knee_joint
197
+ -0.2, # left_ankle_pitch_joint
198
+ 0.0, # left_ankle_roll_joint
199
+ -0.1, # right_hip_pitch_joint
200
+ 0.0, # right_hip_roll_joint
201
+ 0.0, # right_hip_yaw_joint
202
+ 0.3, # right_knee_joint
203
+ -0.2, # right_ankle_pitch_joint
204
+ 0.0, # right_ankle_roll_joint
205
+ 0.0, # waist_yaw_joint
206
+ 0.0, # waist_roll_joint
207
+ 0.0, # waist_pitch_joint
208
+ 0.0, # left_shoulder_pitch_joint
209
+ 0.0, # left_shoulder_roll_joint
210
+ 0.0, # left_shoulder_yaw_joint
211
+ 0.0, # left_elbow_joint
212
+ 0.0, # left_wrist_roll_joint
213
+ 0.0, # left_wrist_pitch_joint
214
+ 0.0, # left_wrist_yaw_joint
215
+ 0.0, # right_shoulder_pitch_joint
216
+ 0.0, # right_shoulder_roll_joint
217
+ 0.0, # right_shoulder_yaw_joint
218
+ 0.0, # right_elbow_joint
219
+ 0.0, # right_wrist_roll_joint
220
+ 0.0, # right_wrist_pitch_joint
221
+ 0.0 # right_wrist_yaw_joint
222
+ ]
223
 
224
+ motor_pos_lower_limit_list: [-2.5307, -0.5236, -2.7576, -0.087267, -0.87267, -0.2618,
225
+ -2.5307, -2.9671, -2.7576, -0.087267, -0.87267, -0.2618,
226
+ -2.618, -0.52, -0.52,
227
+ -3.0892, -1.5882, -2.618, -1.0472,
228
+ -1.972222054, -1.61443, -1.61443,
229
+ -3.0892, -2.2515, -2.618, -1.0472,
230
+ -1.972222054, -1.61443, -1.61443]
231
+ motor_pos_upper_limit_list: [2.8798, 2.9671, 2.7576, 2.8798, 0.5236, 0.2618,
232
+ 2.8798, 0.5236, 2.7576, 2.8798, 0.5236, 0.2618,
233
+ 2.618, 0.52, 0.52,
234
+ 2.6704, 2.2515, 2.618, 2.0944,
235
+ 1.972222054, 1.61443, 1.61443,
236
+ 2.6704, 1.5882, 2.618, 2.0944,
237
+ 1.972222054, 1.61443, 1.61443]
238
+ motor_vel_limit_list: [32.0, 32.0, 32.0, 20.0, 37.0, 37.0,
239
+ 32.0, 32.0, 32.0, 20.0, 37.0, 37.0,
240
+ 32.0, 37.0, 37.0,
241
+ 37.0, 37.0, 37.0, 37.0,
242
+ 37.0, 22.0, 22.0,
243
+ 37.0, 37.0, 37.0, 37.0,
244
+ 37.0, 22.0, 22.0]
245
+ motor_effort_limit_list: [88.0, 88.0, 88.0, 139.0, 50.0, 50.0,
246
+ 88.0, 88.0, 88.0, 139.0, 50.0, 50.0,
247
+ 88.0, 50.0, 50.0,
248
+ 25.0, 25.0, 25.0, 25.0,
249
+ 25.0, 5.0, 5.0,
250
+ 2.45, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7,
251
+ 25.0, 25.0, 25.0, 25.0,
252
+ 25.0, 5.0, 5.0,
253
+ 2.45, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7]
254
+ history_config: {
255
+ base_ang_vel: 4,
256
+ projected_gravity: 4,
257
+ command_lin_vel: 4,
258
+ command_ang_vel: 4,
259
+ command_base_height: 4,
260
+ command_stand: 4,
261
+ ref_upper_dof_pos: 4,
262
+ dof_pos: 4,
263
+ dof_vel: 4,
264
+ actions: 4,
265
+ # phase_time: 4,
266
+ ref_motion_phase: 4,
267
+ sin_phase: 4,
268
+ cos_phase: 4
269
+ }
270
+ history_loco_config: {
271
+ base_ang_vel: 4,
272
+ projected_gravity: 4,
273
+ command_lin_vel: 4,
274
+ command_ang_vel: 4,
275
+ # command_base_height: 4,
276
+ command_stand: 4,
277
+ ref_upper_dof_pos: 4,
278
+ dof_pos: 4,
279
+ dof_vel: 4,
280
+ actions: 4,
281
+ # phase_time: 4,
282
+ sin_phase: 4,
283
+ cos_phase: 4
284
+ }
285
+ history_loco_height_config: {
286
+ base_ang_vel: 4,
287
+ projected_gravity: 4,
288
+ command_lin_vel: 4,
289
+ command_ang_vel: 4,
290
+ command_base_height: 4,
291
+ command_stand: 4,
292
+ ref_upper_dof_pos: 4,
293
+ dof_pos: 4,
294
+ dof_vel: 4,
295
+ actions: 4,
296
+ # phase_time: 4,
297
+ sin_phase: 4,
298
+ cos_phase: 4
299
+ }
300
+ history_mimic_config: {
301
+ base_ang_vel: 4,
302
+ projected_gravity: 4,
303
+ dof_pos: 4,
304
+ dof_vel: 4,
305
+ actions: 4,
306
+ ref_motion_phase: 4,
307
+ }
308
+ obs_dims: {
309
+ base_lin_vel: 3,
310
+ base_ang_vel: 3,
311
+ projected_gravity: 3,
312
+ command_lin_vel: 2,
313
+ command_ang_vel: 1,
314
+ command_stand: 1,
315
+ command_base_height: 1,
316
+ ref_upper_dof_pos: 17, # upper body actions
317
+ dof_pos: 29,
318
+ dof_vel: 29,
319
+ # actions: 12, # lower body actions
320
+ actions: 29, # full body actions
321
+ phase_time: 1,
322
+ ref_motion_phase: 1, # mimic motion phase
323
+ sin_phase: 1,
324
+ cos_phase: 1,
325
+ }
326
+ obs_loco_dims: {
327
+ base_lin_vel: 3,
328
+ base_ang_vel: 3,
329
+ projected_gravity: 3,
330
+ command_lin_vel: 2,
331
+ command_ang_vel: 1,
332
+ command_stand: 1,
333
+ command_base_height: 1,
334
+ ref_upper_dof_pos: 17, # upper body actions
335
+ dof_pos: 29,
336
+ dof_vel: 29,
337
+ actions: 12, # lower body actions
338
+ phase_time: 1,
339
+ sin_phase: 1,
340
+ cos_phase: 1,
341
+ }
342
+ obs_mimic_dims: {
343
+ base_lin_vel: 3,
344
+ base_ang_vel: 3,
345
+ projected_gravity: 3,
346
+ dof_pos: 29,
347
+ dof_vel: 29,
348
+ actions: 29, # full body actions
349
+ ref_motion_phase: 1, # mimic motion phase
350
+ }
351
+ obs_scales: {
352
+ base_lin_vel: 2.0,
353
+ base_ang_vel: 0.25,
354
+ projected_gravity: 1.0,
355
+ command_lin_vel: 1,
356
+ command_ang_vel: 1,
357
+ command_stand: 1,
358
+ command_base_height: 2, # Yuanhang: it's 2, not 1!
359
+ ref_upper_dof_pos: 1.0,
360
+ dof_pos: 1.0,
361
+ dof_vel: 0.05,
362
+ history: 1.0,
363
+ history_loco: 1.0,
364
+ history_mimic: 1.0,
365
+ actions: 1.0,
366
+ phase_time: 1.0,
367
+ ref_motion_phase: 1.0,
368
+ sin_phase: 1.0,
369
+ cos_phase: 1.0
370
+ }
371
+
372
+ loco_upper_body_dof_pos: [
373
+ 0.0, 0.0, 0.0, # waist
374
+ 0.0, 0.3, 0.0, 1.0, # left shoulder and elbow
375
+ 0.0, 0.0, 0.0, # left wrist
376
+ 0.0, -0.3, 0.0, 1.0, # right shoulder and elbow
377
+ 0.0, 0.0, 0.0 # right wrist
378
  ]
379
+
380
+ robot_dofs: {
381
+ "g1_29dof": [1, 1, 1, 1, 1, 1,
382
+ 1, 1, 1, 1, 1, 1,
383
+ 1, 1, 1,
384
+ 1, 1, 1, 1, 1, 1, 1,
385
+ 1, 1, 1, 1, 1, 1, 1],
386
+ "g1_29dof_anneal_23dof": [1, 1, 1, 1, 1, 1,
387
+ 1, 1, 1, 1, 1, 1,
388
+ 1, 1, 1,
389
+ 1, 1, 1, 1, 0, 0, 0,
390
+ 1, 1, 1, 1, 0, 0, 0],
391
+ }
392
+
393
+ mimic_robot_types: {
394
+
395
+ "APT_level1": "g1_29dof_anneal_23dof",
396
+ }
397
+
398
+
399
+
400
+
401
+ # 01281657
402
+ mimic_models: {
403
+ "APT_level1": "20250116_225127-TairanTestbed_G129dofANNEAL23dof_dm_APT_video_APT_level1_MinimalFriction-0.3_RfiTrue_Far0.325_RESUME_LARGENOISE-motion_tracking-g1_29dof_anneal_23dof/exported/model_176500.onnx",
404
+
405
+ }
406
+
407
+
408
+
409
+ start_upper_body_dof_pos: {
410
+
411
+ "APT_level1":
412
+ [0.19964170455932617, 0.07710712403059006, -0.2882401943206787,
413
+ 0.21672365069389343, 0.15629297494888306, -0.5167576670646667, 0.5782126784324646,
414
+ 0.0, 0.0, 0.0,
415
+ 0.25740593671798706, -0.2504104673862457, 0.22500675916671753, 0.5127624273300171,
416
+ 0.0, 0.0, 0.0],
417
+
418
+ }
419
+
420
+ motion_length_s: {
421
+ "APT_level1": 7.66,
422
+
423
+ }
env.py CHANGED
@@ -1,135 +1,59 @@
1
  from pathlib import Path
 
2
  import sys
3
  import gymnasium as gym
4
  from gymnasium import spaces
5
  import numpy as np
6
  from huggingface_hub import snapshot_download
7
- import yaml
 
8
  snapshot_download("lerobot/unitree-g1-mujoco")
9
 
10
- # Ensure sim module is importable
11
- sys.path.insert(0, str(Path(__file__).parent))
12
-
13
- from sim.simulator_factory import SimulatorFactory, init_channel
14
-
15
 
16
  def make_env(n_envs=1, use_async_envs=False, **kwargs):
17
- """Create a UnitreeG1 simulation environment.
18
-
19
- Args:
20
- n_envs: Number of environments (currently only 1 supported)
21
- use_async_envs: Whether to use async envs (not implemented)
22
- **kwargs: Additional arguments passed to simulator
23
- - publish_images: bool, whether to publish camera images via ZMQ
24
- - camera_port: int, ZMQ port for camera images
25
- - cameras: list of camera names
26
- """
27
  repo_dir = Path(__file__).parent
28
-
29
- # Load config
30
- config_path = repo_dir / "config.yaml"
31
- with open(config_path) as f:
32
- config = yaml.safe_load(f)
33
-
34
- # Configure cameras if requested
35
- publish_images = kwargs.get("publish_images", True)
36
- camera_port = kwargs.get("camera_port", 5555)
37
- cameras = kwargs.get("cameras", ["head_camera"])
38
-
39
- enable_offscreen = publish_images or config.get("ENABLE_OFFSCREEN", False)
40
- camera_configs = {}
41
- if enable_offscreen:
42
- for cam_name in cameras:
43
- camera_configs[cam_name] = {"height": 480, "width": 640}
44
-
45
- # Initialize DDS channel
46
- init_channel(config=config)
47
-
48
- # Create simulator (runs in same process)
49
- simulator = SimulatorFactory.create_simulator(
50
- config=config,
51
- env_name="default",
52
- onscreen=config.get("ENABLE_ONSCREEN", True),
53
- offscreen=enable_offscreen,
54
- camera_configs=camera_configs,
55
- )
56
-
57
- class UnitreeG1Env(gym.Env):
58
- """Gymnasium environment wrapper for Unitree G1 MuJoCo simulation."""
59
-
60
- metadata = {"render_modes": ["human"]}
61
 
62
- def __init__(self, sim, cam_configs, pub_images, cam_port):
 
 
 
63
  super().__init__()
64
- self.simulator = sim
65
- self.sim_env = sim.sim_env
66
- self.step_count = 0
67
- self.camera_configs = cam_configs
68
-
69
- # Get timing from config
70
- self.sim_dt = config["SIMULATE_DT"]
71
- self.viewer_dt = config.get("VIEWER_DT", 0.02)
72
- self.image_dt = config.get("IMAGE_DT", 0.033333)
73
-
74
- # Start image publishing subprocess if requested
75
- if pub_images and len(cam_configs) > 0:
76
- sim.start_image_publish_subprocess(
77
- start_method=config.get("MP_START_METHOD", "spawn"),
78
- camera_port=cam_port
79
- )
80
- print(f"Camera images publishing on tcp://localhost:{cam_port}")
81
-
82
- # Define spaces
83
- num_joints = config.get("NUM_MOTORS", 29)
84
- self.action_space = spaces.Box(-np.pi, np.pi, shape=(num_joints,), dtype=np.float32)
85
- self.observation_space = spaces.Box(-np.inf, np.inf, shape=(num_joints * 3 + 10,), dtype=np.float32)
86
 
87
  def reset(self, seed=None, options=None):
88
- """Reset the simulation."""
89
  super().reset(seed=seed, options=options)
90
- self.simulator.reset()
91
- self.step_count = 0
92
- obs = self._get_obs()
93
- return obs, {}
94
-
95
- def step(self, action=None):
96
- """Execute one simulation step. Caller handles timing."""
97
- # Run physics step
98
- self.sim_env.sim_step()
99
-
100
- # Update viewer at viewer rate
101
- if self.step_count % int(self.viewer_dt / self.sim_dt) == 0:
102
- self.sim_env.update_viewer()
103
-
104
- # Update render caches at image rate (for ZMQ publishing)
105
- if self.step_count % int(self.image_dt / self.sim_dt) == 0:
106
- self.sim_env.update_render_caches()
107
-
108
- self.step_count += 1
109
-
110
- obs = self._get_obs()
111
- reward = 0.0
112
- terminated = False
113
- truncated = False
114
  info = {}
115
- return obs, reward, terminated, truncated, info
116
-
117
- def _get_obs(self):
118
- """Get current observation from simulation."""
119
- obs_dict = self.sim_env.prepare_obs()
120
- obs = np.concatenate([
121
- obs_dict.get("body_q", np.zeros(29)),
122
- obs_dict.get("body_dq", np.zeros(29)),
123
- obs_dict.get("body_tau_est", np.zeros(29)),
124
- obs_dict.get("floating_base_pose", np.zeros(7))[:4],
125
- obs_dict.get("floating_base_vel", np.zeros(6))[:3],
126
- obs_dict.get("floating_base_acc", np.zeros(3)),
127
- ]).astype(np.float32)
128
- return obs
129
 
130
- def close(self):
131
- """Close the simulation."""
132
- print("++++closing simulator ++++")
133
- self.simulator.close()
134
 
135
- return UnitreeG1Env(simulator, camera_configs, publish_images, camera_port)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  from pathlib import Path
2
+ import subprocess
3
  import sys
4
  import gymnasium as gym
5
  from gymnasium import spaces
6
  import numpy as np
7
  from huggingface_hub import snapshot_download
8
+ import os
9
+ import signal
10
  snapshot_download("lerobot/unitree-g1-mujoco")
11
 
 
 
 
 
 
12
 
13
  def make_env(n_envs=1, use_async_envs=False, **kwargs):
14
+
15
+ # define run_sim FIRST
 
 
 
 
 
 
 
 
16
  repo_dir = Path(__file__).parent
17
+ run_sim = repo_dir / "run_sim.py"
18
+
19
+ print("=" * 60)
20
+ print("launching run_sim.py as subprocess")
21
+ print("path:", run_sim)
22
+ print("=" * 60)
23
+
24
+ # now you can launch it
25
+ proc = subprocess.Popen([sys.executable, str(run_sim)])
26
+ print(f"simulator started as pid={proc.pid}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
+ class DummyEnv(gym.Env):
29
+ metadata = {"render_modes": []}
30
+
31
+ def __init__(self, process):
32
  super().__init__()
33
+ self.process = process
34
+ self.action_space = spaces.Box(-1, 1, shape=(1,), dtype=np.float32)
35
+ self.observation_space = spaces.Box(-1, 1, shape=(1,), dtype=np.float32)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
  def reset(self, seed=None, options=None):
 
38
  super().reset(seed=seed, options=options)
39
+ obs = np.zeros(1, dtype=np.float32)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  info = {}
41
+ return obs, info
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
+ def step(self, action):
44
+ return np.zeros(1, dtype=np.float32), 0.0, False, False, {}
 
 
45
 
46
+ def close(self):
47
+ pass
48
+
49
+ def kill_sim(self):
50
+ if self.process.poll() is None:
51
+ print("killing simulator subprocess...")
52
+ self.process.terminate()
53
+ try:
54
+ self.process.wait(timeout=2)
55
+ except subprocess.TimeoutExpired:
56
+ print("force killing simulator subprocess...")
57
+ self.process.kill()
58
+
59
+ return DummyEnv(proc)
run_sim.py CHANGED
@@ -1,7 +1,8 @@
1
  #!/usr/bin/env python3
 
2
  import sys
3
  from pathlib import Path
4
- import time
5
  # Add sim module to path
6
  sys.path.insert(0, str(Path(__file__).parent))
7
 
@@ -9,7 +10,11 @@ import yaml
9
  from sim.simulator_factory import SimulatorFactory, init_channel
10
 
11
  def main(n_envs=1, use_async_envs: bool = False,
12
- publish_images=True, camera_port=5555, cameras=None, **kwargs):
 
 
 
 
13
 
14
  # Load config
15
  config_path = Path(__file__).parent / "config.yaml"
@@ -18,7 +23,14 @@ def main(n_envs=1, use_async_envs: bool = False,
18
 
19
  # Override config with default values
20
  enable_offscreen = publish_images or config.get("ENABLE_OFFSCREEN", False)
21
-
 
 
 
 
 
 
 
22
  # Configure cameras if requested
23
  camera_configs = {}
24
  if enable_offscreen:
@@ -41,24 +53,19 @@ def main(n_envs=1, use_async_envs: bool = False,
41
  camera_configs=camera_configs,
42
  )
43
 
44
- # Start simulator
45
  print("\nSimulator running. Press Ctrl+C to exit.")
46
  if enable_offscreen and publish_images:
47
  print(f"Camera images publishing on tcp://localhost:{camera_port}")
48
  try:
49
- if publish_images:
50
- sim.start_image_publish_subprocess(
51
- start_method="spawn",
52
- camera_port=camera_port,
53
- )
54
- time.sleep(1)
55
- sim.start()
56
  except KeyboardInterrupt:
57
- print("+++++Simulator interrupted by user.")
58
- except Exception as e:
59
- print(f"++++error in simulator: {e} ++++")
60
- finally:
61
- print("++++closing simulator ++++")
62
  sim.close()
63
 
64
  if __name__ == "__main__":
 
1
  #!/usr/bin/env python3
2
+ """Standalone MuJoCo simulator for Unitree G1"""
3
  import sys
4
  from pathlib import Path
5
+
6
  # Add sim module to path
7
  sys.path.insert(0, str(Path(__file__).parent))
8
 
 
10
  from sim.simulator_factory import SimulatorFactory, init_channel
11
 
12
  def main(n_envs=1, use_async_envs: bool = False,
13
+ publish_images=True, camera_port=5554, cameras=None, **kwargs):
14
+ # Use default values
15
+ publish_images = True
16
+ camera_port = 5554
17
+ cameras = None
18
 
19
  # Load config
20
  config_path = Path(__file__).parent / "config.yaml"
 
23
 
24
  # Override config with default values
25
  enable_offscreen = publish_images or config.get("ENABLE_OFFSCREEN", False)
26
+
27
+ print("="*60)
28
+ print("🤖 Starting Unitree G1 MuJoCo Simulator")
29
+ print("="*60)
30
+ print(f"📁 Scene: {config['ROBOT_SCENE']}")
31
+ print(f"⏱️ Timestep: {config['SIMULATE_DT']}s ({int(1/config['SIMULATE_DT'])} Hz)")
32
+ print(f"👁️ Visualization: {'ON' if config.get('ENABLE_ONSCREEN', True) else 'OFF'}")
33
+
34
  # Configure cameras if requested
35
  camera_configs = {}
36
  if enable_offscreen:
 
53
  camera_configs=camera_configs,
54
  )
55
 
56
+ # Start simulator (blocking)
57
  print("\nSimulator running. Press Ctrl+C to exit.")
58
  if enable_offscreen and publish_images:
59
  print(f"Camera images publishing on tcp://localhost:{camera_port}")
60
  try:
61
+ SimulatorFactory.start_simulator(
62
+ sim,
63
+ as_thread=False,
64
+ enable_image_publish=publish_images,
65
+ camera_port=camera_port,
66
+ )
 
67
  except KeyboardInterrupt:
68
+ print("\nShutting down simulator...")
 
 
 
 
69
  sim.close()
70
 
71
  if __name__ == "__main__":
sim/base_sim.py CHANGED
@@ -2,7 +2,7 @@ import argparse
2
  import pathlib
3
  from pathlib import Path
4
  import threading
5
- from threading import Thread
6
  from typing import Dict
7
 
8
  import mujoco
@@ -18,8 +18,8 @@ from unitree_sdk2py.core.channel import ChannelFactoryInitialize
18
  import yaml
19
  import os
20
  from .image_publish_utils import ImagePublishProcess
21
- from .metric_utils import check_contact
22
- from .sim_utils import get_subtree_body_names
23
  from .unitree_sdk2py_bridge import ElasticBand, UnitreeSdk2Bridge
24
 
25
  GR00T_WBC_ROOT = Path(__file__).resolve().parent.parent # Points to mujoco_sim_g1/
@@ -60,6 +60,8 @@ class DefaultEnv:
60
  if len(camera_configs) > 0:
61
  print(f"✓ DefaultEnv initialized with {len(camera_configs)} camera(s): {list(camera_configs.keys())}")
62
 
 
 
63
 
64
  # Unitree bridge will be initialized by the simulator
65
  self.unitree_bridge = None
@@ -69,11 +71,12 @@ class DefaultEnv:
69
 
70
  # Initialize scene (defined in subclasses)
71
  self.init_scene()
 
72
 
73
- # Setup offscreen rendering if needed (lazy init - renderers created on first use)
74
  self.offscreen = offscreen
75
- self.renderers = {} # Will be lazily initialized
76
- self._renderers_initialized = False
77
  self.image_dt = self.config.get("IMAGE_DT", 0.033333)
78
 
79
  # Image publishing subprocess (initialized separately)
@@ -86,8 +89,6 @@ class DefaultEnv:
86
  str(assets_root / self.config["ROBOT_SCENE"])
87
  )
88
  self.mj_data = mujoco.MjData(self.mj_model)
89
- # Set valid floating base quaternion (MjData initializes qpos to zeros)
90
- self.mj_data.qpos[3:7] = [1.0, 0.0, 0.0, 0.0]
91
  self.mj_model.opt.timestep = self.sim_dt
92
  self.torso_index = mujoco.mj_name2id(self.mj_model, mujoco.mjtObj.mjOBJ_BODY, "torso_link")
93
  self.root_body = "pelvis"
@@ -438,6 +439,16 @@ class DefaultEnv:
438
  else:
439
  self.viewer.cam.type = mujoco.mjtCamera.mjCAMERA_TRACKING
440
 
 
 
 
 
 
 
 
 
 
 
441
  def set_unitree_bridge(self, unitree_bridge):
442
  """Set the unitree bridge from the simulator"""
443
  self.unitree_bridge = unitree_bridge
@@ -448,17 +459,9 @@ class DefaultEnv:
448
 
449
  def update_render_caches(self):
450
  """Update render cache and shared memory for subprocess."""
451
- # Lazy init renderers on first call (creates OpenGL context in calling thread)
452
- if not self._renderers_initialized and self.offscreen:
453
- self.init_renderers()
454
- self._renderers_initialized = True
455
- print(f"✓ Renderers initialized lazily in thread {__import__('threading').current_thread().name}")
456
-
457
  render_caches = {}
458
  for camera_name, camera_config in self.camera_configs.items():
459
- renderer = self.renderers.get(camera_name)
460
- if renderer is None:
461
- continue
462
  if "params" in camera_config:
463
  renderer.update_scene(self.mj_data, camera=camera_config["params"])
464
  else:
@@ -504,11 +507,114 @@ class DefaultEnv:
504
 
505
  def reset(self):
506
  mujoco.mj_resetData(self.mj_model, self.mj_data)
507
- # Set valid floating base quaternion (identity: w=1, x=y=z=0)
508
- # mj_resetData sets qpos to zeros, which gives invalid [0,0,0,0] quaternion
509
- self.mj_data.qpos[3:7] = [1.0, 0.0, 0.0, 0.0]
510
- # Propagate qpos to derived quantities (xquat, xpos, etc.)
511
- mujoco.mj_forward(self.mj_model, self.mj_data)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
512
 
513
 
514
  class BaseSimulator:
@@ -535,11 +641,21 @@ class BaseSimulator:
535
 
536
  # Set update frequencies
537
  self.sim_dt = self.config["SIMULATE_DT"]
 
538
  self.image_dt = self.config.get("IMAGE_DT", 0.033333)
539
  self.viewer_dt = self.config.get("VIEWER_DT", 0.02)
540
 
541
- # Create the environment
542
- self.sim_env = DefaultEnv(config, env_name, **kwargs)
 
 
 
 
 
 
 
 
 
543
 
544
  # Initialize the DDS communication layer - should be safe to call multiple times
545
 
@@ -606,6 +722,10 @@ class BaseSimulator:
606
  if sim_cnt % int(self.viewer_dt / self.sim_dt) == 0:
607
  self.sim_env.update_viewer()
608
 
 
 
 
 
609
  # Update render caches at image rate
610
  if sim_cnt % int(self.image_dt / self.sim_dt) == 0:
611
  self.sim_env.update_render_caches()
@@ -641,11 +761,6 @@ class BaseSimulator:
641
  def close(self):
642
  """Close the simulation. Can be overridden by subclasses."""
643
  try:
644
- # Stop image publishing subprocess
645
- if hasattr(self.sim_env, "image_publish_process") and self.sim_env.image_publish_process is not None:
646
- self.sim_env.image_publish_process.stop()
647
- self.sim_env.image_publish_process = None
648
-
649
  # Close viewer
650
  if hasattr(self.sim_env, "viewer") and self.sim_env.viewer is not None:
651
  self.sim_env.viewer.close()
 
2
  import pathlib
3
  from pathlib import Path
4
  import threading
5
+ from threading import Lock, Thread
6
  from typing import Dict
7
 
8
  import mujoco
 
18
  import yaml
19
  import os
20
  from .image_publish_utils import ImagePublishProcess
21
+ from .metric_utils import check_contact, check_height
22
+ from .sim_utilts import get_subtree_body_names
23
  from .unitree_sdk2py_bridge import ElasticBand, UnitreeSdk2Bridge
24
 
25
  GR00T_WBC_ROOT = Path(__file__).resolve().parent.parent # Points to mujoco_sim_g1/
 
60
  if len(camera_configs) > 0:
61
  print(f"✓ DefaultEnv initialized with {len(camera_configs)} camera(s): {list(camera_configs.keys())}")
62
 
63
+ # Thread safety lock
64
+ self.reward_lock = Lock()
65
 
66
  # Unitree bridge will be initialized by the simulator
67
  self.unitree_bridge = None
 
71
 
72
  # Initialize scene (defined in subclasses)
73
  self.init_scene()
74
+ self.last_reward = 0
75
 
76
+ # Setup offscreen rendering if needed
77
  self.offscreen = offscreen
78
+ if self.offscreen:
79
+ self.init_renderers()
80
  self.image_dt = self.config.get("IMAGE_DT", 0.033333)
81
 
82
  # Image publishing subprocess (initialized separately)
 
89
  str(assets_root / self.config["ROBOT_SCENE"])
90
  )
91
  self.mj_data = mujoco.MjData(self.mj_model)
 
 
92
  self.mj_model.opt.timestep = self.sim_dt
93
  self.torso_index = mujoco.mj_name2id(self.mj_model, mujoco.mjtObj.mjOBJ_BODY, "torso_link")
94
  self.root_body = "pelvis"
 
439
  else:
440
  self.viewer.cam.type = mujoco.mjtCamera.mjCAMERA_TRACKING
441
 
442
+ def update_reward(self):
443
+ """Calculate reward. Should be implemented by subclasses."""
444
+ with self.reward_lock:
445
+ self.last_reward = 0
446
+
447
+ def get_reward(self):
448
+ """Thread-safe way to get the last calculated reward."""
449
+ with self.reward_lock:
450
+ return self.last_reward
451
+
452
  def set_unitree_bridge(self, unitree_bridge):
453
  """Set the unitree bridge from the simulator"""
454
  self.unitree_bridge = unitree_bridge
 
459
 
460
  def update_render_caches(self):
461
  """Update render cache and shared memory for subprocess."""
 
 
 
 
 
 
462
  render_caches = {}
463
  for camera_name, camera_config in self.camera_configs.items():
464
+ renderer = self.renderers[camera_name]
 
 
465
  if "params" in camera_config:
466
  renderer.update_scene(self.mj_data, camera=camera_config["params"])
467
  else:
 
507
 
508
  def reset(self):
509
  mujoco.mj_resetData(self.mj_model, self.mj_data)
510
+
511
+
512
+ class CubeEnv(DefaultEnv):
513
+ """Environment with a cube object for pick and place tasks"""
514
+
515
+ def __init__(
516
+ self,
517
+ config: Dict[str, any],
518
+ onscreen: bool = False,
519
+ offscreen: bool = False,
520
+ ):
521
+ # Override the robot scene
522
+ config = config.copy() # Create a copy to avoid modifying the original
523
+ config["ROBOT_SCENE"] = "gr00t_wbc/control/robot_model/model_data/g1/pnp_cube_43dof.xml"
524
+ super().__init__(config, "cube", {}, onscreen, offscreen)
525
+
526
+ def update_reward(self):
527
+ """Calculate reward based on gripper contact with cube and cube height"""
528
+ right_hand_body = [
529
+ "right_hand_thumb_2_link",
530
+ "right_hand_middle_1_link",
531
+ "right_hand_index_1_link",
532
+ ]
533
+ gripper_cube_contact = check_contact(
534
+ self.mj_model, self.mj_data, right_hand_body, "cube_body"
535
+ )
536
+ cube_lifted = check_height(self.mj_model, self.mj_data, "cube", 0.85, 2.0)
537
+
538
+ with self.reward_lock:
539
+ self.last_reward = gripper_cube_contact & cube_lifted
540
+
541
+
542
+ class BoxEnv(DefaultEnv):
543
+ """Environment with a box object for manipulation tasks"""
544
+
545
+ def __init__(
546
+ self,
547
+ config: Dict[str, any],
548
+ onscreen: bool = False,
549
+ offscreen: bool = False,
550
+ ):
551
+ # Override the robot scene
552
+ config = config.copy() # Create a copy to avoid modifying the original
553
+ config["ROBOT_SCENE"] = "gr00t_wbc/control/robot_model/model_data/g1/lift_box_43dof.xml"
554
+ super().__init__(config, "box", {}, onscreen, offscreen)
555
+
556
+ def reward(self):
557
+ """Calculate reward based on gripper contact with cube and cube height"""
558
+ left_hand_body = [
559
+ "left_hand_thumb_2_link",
560
+ "left_hand_middle_1_link",
561
+ "left_hand_index_1_link",
562
+ ]
563
+ right_hand_body = [
564
+ "right_hand_thumb_2_link",
565
+ "right_hand_middle_1_link",
566
+ "right_hand_index_1_link",
567
+ ]
568
+ gripper_box_contact = check_contact(self.mj_model, self.mj_data, left_hand_body, "box_body")
569
+ gripper_box_contact &= check_contact(
570
+ self.mj_model, self.mj_data, right_hand_body, "box_body"
571
+ )
572
+ box_lifted = check_height(self.mj_model, self.mj_data, "box", 0.92, 2.0)
573
+
574
+ print("gripper_box_contact: ", gripper_box_contact, "box_lifted: ", box_lifted)
575
+
576
+ with self.reward_lock:
577
+ self.last_reward = gripper_box_contact & box_lifted
578
+ return self.last_reward
579
+
580
+
581
+ class BottleEnv(DefaultEnv):
582
+ """Environment with a cylinder object for manipulation tasks"""
583
+
584
+ def __init__(
585
+ self,
586
+ config: Dict[str, any],
587
+ onscreen: bool = False,
588
+ offscreen: bool = False,
589
+ ):
590
+ # Override the robot scene
591
+ config = config.copy() # Create a copy to avoid modifying the original
592
+ config["ROBOT_SCENE"] = "gr00t_wbc/control/robot_model/model_data/g1/pnp_bottle_43dof.xml"
593
+ camera_configs = {
594
+ "egoview": {
595
+ "height": 400,
596
+ "width": 400,
597
+ },
598
+ }
599
+ super().__init__(
600
+ config, "cylinder", camera_configs, onscreen, offscreen
601
+ )
602
+
603
+ self.bottle_body = self.mj_model.body("bottle_body")
604
+ self.bottle_geom = self.mj_model.geom("bottle")
605
+
606
+ if self.viewer is not None:
607
+ self.viewer.cam.type = mujoco.mjtCamera.mjCAMERA_FIXED
608
+ self.viewer.cam.fixedcamid = self.mj_model.camera("egoview").id
609
+
610
+ def update_reward(self):
611
+ """Calculate reward based on gripper contact with cylinder and cylinder height"""
612
+ pass
613
+
614
+ def get_privileged_obs(self):
615
+ obs_pos = self.mj_data.xpos[self.bottle_body.id]
616
+ obs_quat = self.mj_data.xquat[self.bottle_body.id]
617
+ return {"bottle_pos": obs_pos, "bottle_quat": obs_quat}
618
 
619
 
620
  class BaseSimulator:
 
641
 
642
  # Set update frequencies
643
  self.sim_dt = self.config["SIMULATE_DT"]
644
+ self.reward_dt = self.config.get("REWARD_DT", 0.02)
645
  self.image_dt = self.config.get("IMAGE_DT", 0.033333)
646
  self.viewer_dt = self.config.get("VIEWER_DT", 0.02)
647
 
648
+ # Create the appropriate environment based on name
649
+ if env_name == "default":
650
+ self.sim_env = DefaultEnv(config, env_name, **kwargs)
651
+ elif env_name == "pnp_cube":
652
+ self.sim_env = CubeEnv(config, **kwargs)
653
+ elif env_name == "lift_box":
654
+ self.sim_env = BoxEnv(config, **kwargs)
655
+ elif env_name == "pnp_bottle":
656
+ self.sim_env = BottleEnv(config, **kwargs)
657
+ else:
658
+ raise ValueError(f"Invalid environment name: {env_name}")
659
 
660
  # Initialize the DDS communication layer - should be safe to call multiple times
661
 
 
722
  if sim_cnt % int(self.viewer_dt / self.sim_dt) == 0:
723
  self.sim_env.update_viewer()
724
 
725
+ # Calculate reward at reward rate
726
+ if sim_cnt % int(self.reward_dt / self.sim_dt) == 0:
727
+ self.sim_env.update_reward()
728
+
729
  # Update render caches at image rate
730
  if sim_cnt % int(self.image_dt / self.sim_dt) == 0:
731
  self.sim_env.update_render_caches()
 
761
  def close(self):
762
  """Close the simulation. Can be overridden by subclasses."""
763
  try:
 
 
 
 
 
764
  # Close viewer
765
  if hasattr(self.sim_env, "viewer") and self.sim_env.viewer is not None:
766
  self.sim_env.viewer.close()
sim/image_publish_utils.py CHANGED
@@ -5,6 +5,8 @@ from typing import Any, Dict
5
 
6
  import numpy as np
7
 
 
 
8
 
9
  def get_multiprocessing_info(verbose: bool = True):
10
  """Get information about multiprocessing start methods"""
 
5
 
6
  import numpy as np
7
 
8
+ from .sensor_utils import ImageMessageSchema, ImageUtils, SensorServer
9
+
10
 
11
  def get_multiprocessing_info(verbose: bool = True):
12
  """Get information about multiprocessing start methods"""
sim/metric_utils.py CHANGED
@@ -2,7 +2,7 @@ from typing import List, Tuple
2
 
3
  import mujoco
4
 
5
- from .sim_utils import get_body_geom_ids
6
 
7
 
8
  def check_contact(
 
2
 
3
  import mujoco
4
 
5
+ from .sim_utilts import get_body_geom_ids
6
 
7
 
8
  def check_contact(
sim/sensor_utils.py CHANGED
@@ -1,10 +1,11 @@
1
  """Standalone sensor utilities for camera image publishing via ZMQ"""
2
  import base64
3
- import json
4
  from dataclasses import dataclass
5
  from typing import Any, Dict
6
 
7
  import cv2
 
 
8
  import numpy as np
9
  import zmq
10
 
@@ -65,8 +66,8 @@ class SensorServer:
65
 
66
  def send_message(self, data: Dict[str, Any]):
67
  try:
68
- json_str = json.dumps(data)
69
- self.socket.send_string(json_str, flags=zmq.NOBLOCK)
70
  except zmq.Again:
71
  self.message_dropped += 1
72
  print(f"[Warning] message dropped: {self.message_dropped}")
@@ -94,8 +95,8 @@ class SensorClient:
94
  self.context.term()
95
 
96
  def receive_message(self):
97
- json_str = self.socket.recv_string()
98
- return json.loads(json_str)
99
 
100
 
101
  class ImageUtils:
 
1
  """Standalone sensor utilities for camera image publishing via ZMQ"""
2
  import base64
 
3
  from dataclasses import dataclass
4
  from typing import Any, Dict
5
 
6
  import cv2
7
+ import msgpack
8
+ import msgpack_numpy as m
9
  import numpy as np
10
  import zmq
11
 
 
66
 
67
  def send_message(self, data: Dict[str, Any]):
68
  try:
69
+ packed = msgpack.packb(data, use_bin_type=True)
70
+ self.socket.send(packed, flags=zmq.NOBLOCK)
71
  except zmq.Again:
72
  self.message_dropped += 1
73
  print(f"[Warning] message dropped: {self.message_dropped}")
 
95
  self.context.term()
96
 
97
  def receive_message(self):
98
+ packed = self.socket.recv()
99
+ return msgpack.unpackb(packed, object_hook=m.decode)
100
 
101
 
102
  class ImageUtils:
sim/{sim_utils.py → sim_utilts.py} RENAMED
@@ -75,7 +75,7 @@ def get_body_geom_ids(model: mujoco.MjModel, body_id: int) -> List[int]:
75
 
76
 
77
  def get_subtree_geom_ids(model: mujoco.MjModel, body_id: int) -> List[int]:
78
- """Get all geoms belonging to subtree starting at a given body
79
 
80
  Here, a subtree is defined as the kinematic tree starting at the body and including
81
  all its descendants.
 
75
 
76
 
77
  def get_subtree_geom_ids(model: mujoco.MjModel, body_id: int) -> List[int]:
78
+ """Get all geoms belonging to subtree starting at a given body.
79
 
80
  Here, a subtree is defined as the kinematic tree starting at the body and including
81
  all its descendants.
sim/simulator_factory.py CHANGED
@@ -35,6 +35,8 @@ class SimulatorFactory:
35
  simulator_type = config.get("SIMULATOR", "mujoco")
36
  if simulator_type == "mujoco":
37
  return SimulatorFactory._create_mujoco_simulator(config, env_name, **kwargs)
 
 
38
  else:
39
  print(
40
  f"Warning: Invalid simulator type: {simulator_type}. "
@@ -56,3 +58,91 @@ class SimulatorFactory:
56
  )
57
  return BaseSimulator(config=config, env_name=env_name, **env_kwargs)
58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  simulator_type = config.get("SIMULATOR", "mujoco")
36
  if simulator_type == "mujoco":
37
  return SimulatorFactory._create_mujoco_simulator(config, env_name, **kwargs)
38
+ elif simulator_type == "robocasa":
39
+ return SimulatorFactory._create_robocasa_simulator(config, env_name, **kwargs)
40
  else:
41
  print(
42
  f"Warning: Invalid simulator type: {simulator_type}. "
 
58
  )
59
  return BaseSimulator(config=config, env_name=env_name, **env_kwargs)
60
 
61
+ @staticmethod
62
+ def _create_robocasa_simulator(config: Dict[str, Any], env_name: str = "default", **kwargs):
63
+ """Create a RoboCasa simulator instance."""
64
+ from gr00t_wbc.control.envs.g1.sim.robocasa_sim import RoboCasaG1EnvServer
65
+ from gr00t_wbc.control.envs.robocasa.utils.controller_utils import (
66
+ update_robosuite_controller_configs,
67
+ )
68
+ from gr00t_wbc.control.envs.robocasa.utils.sim_utils import change_simulation_timestep
69
+
70
+ change_simulation_timestep(config["SIMULATE_DT"])
71
+
72
+ # Use default environment if not specified
73
+ if env_name == "default":
74
+ env_name = "GroundOnly"
75
+
76
+ # Get or create controller configurations
77
+ controller_configs = kwargs.get("controller_configs")
78
+ if controller_configs is None:
79
+ wbc_version = kwargs.get("wbc_version", "gear_wbc")
80
+ controller_configs = update_robosuite_controller_configs("G1", wbc_version)
81
+
82
+ # Build environment kwargs
83
+ env_kwargs = dict(
84
+ onscreen=kwargs.pop("onscreen", True),
85
+ offscreen=kwargs.pop("offscreen", False),
86
+ camera_names=kwargs.pop("camera_names", None),
87
+ camera_heights=kwargs.pop("camera_heights", None),
88
+ camera_widths=kwargs.pop("camera_widths", None),
89
+ control_freq=kwargs.pop("control_freq", 50),
90
+ controller_configs=controller_configs,
91
+ ik_indicator=kwargs.pop("ik_indicator", False),
92
+ randomize_cameras=kwargs.pop("randomize_cameras", True),
93
+ )
94
+
95
+ kwargs.update(
96
+ {
97
+ "verbose": config.pop("verbose", False),
98
+ "sim_freq": 1 / config.pop("SIMULATE_DT"),
99
+ }
100
+ )
101
+
102
+ return RoboCasaG1EnvServer(
103
+ env_name=env_name,
104
+ wbc_config=config,
105
+ env_kwargs=env_kwargs,
106
+ **kwargs,
107
+ )
108
+
109
+ @staticmethod
110
+ def start_simulator(
111
+ simulator,
112
+ as_thread: bool = True,
113
+ enable_image_publish: bool = False,
114
+ mp_start_method: str = "spawn",
115
+ camera_port: int = 5555,
116
+ ):
117
+ """
118
+ Start the simulator either as a thread or as a separate process.
119
+
120
+ Args:
121
+ simulator: The simulator instance to start
122
+ config: Configuration dictionary
123
+ as_thread: If True, start as thread; if False, start as subprocess
124
+ enable_offscreen: If True and not as_thread, start image publishing
125
+ """
126
+
127
+ if as_thread:
128
+ simulator.start_as_thread()
129
+ else:
130
+ # Wrap in try-except to make sure simulator is properly closed upon exit.
131
+ try:
132
+ if enable_image_publish:
133
+ simulator.start_image_publish_subprocess(
134
+ start_method=mp_start_method,
135
+ camera_port=camera_port,
136
+ )
137
+ time.sleep(1)
138
+ simulator.start()
139
+ except KeyboardInterrupt:
140
+ print("+++++Simulator interrupted by user.")
141
+ except Exception as e:
142
+ print(f"++++error in simulator: {e} ++++")
143
+ finally:
144
+ print("++++closing simulator ++++")
145
+ simulator.close()
146
+
147
+ # Allow simulator to initialize
148
+ time.sleep(1)
sim/unitree_sdk2py_bridge.py CHANGED
@@ -16,18 +16,27 @@ from unitree_sdk2py.idl.default import (
16
  unitree_hg_msg_dds__HandState_ as HandState_default,
17
  )
18
  from unitree_sdk2py.idl.unitree_go.msg.dds_ import WirelessController_
19
- from unitree_sdk2py.idl.unitree_hg.msg.dds_ import HandCmd_, HandState_
 
 
 
 
 
 
 
20
 
21
 
22
  class UnitreeSdk2Bridge:
23
  """
24
- Bridge between Unitree SDK2 and the MuJoCo simulation.
25
- Handles sending and receiving DDS messages for body and hand control.
 
26
  """
27
 
28
  def __init__(self, config):
29
  # Note that we do not give the mjdata and mjmodel to the UnitreeSdk2Bridge.
30
  # It is unsafe and would be unflexible if we use a hand-plugged robot model
 
31
  robot_type = config["ROBOT_TYPE"]
32
  if "g1" in robot_type or "h1-2" in robot_type:
33
  from unitree_sdk2py.idl.default import (
@@ -35,6 +44,10 @@ class UnitreeSdk2Bridge:
35
  unitree_hg_msg_dds__LowCmd_,
36
  unitree_hg_msg_dds__LowState_ as LowState_default,
37
  )
 
 
 
 
38
  from unitree_sdk2py.idl.unitree_hg.msg.dds_ import IMUState_, LowCmd_, LowState_
39
 
40
  self.low_cmd = unitree_hg_msg_dds__LowCmd_()
@@ -53,14 +66,33 @@ class UnitreeSdk2Bridge:
53
  self.num_body_motor = config["NUM_MOTORS"]
54
  self.num_hand_motor = config.get("NUM_HAND_MOTORS", 0)
55
  self.use_sensor = config["USE_SENSOR"]
 
56
  self.have_imu_ = False
57
  self.have_frame_sensor_ = False
 
 
 
 
 
 
 
 
 
 
58
 
59
  # Unitree sdk2 message
60
  self.low_state = LowState_default()
61
  self.low_state_puber = ChannelPublisher("rt/lowstate", LowState_)
62
  self.low_state_puber.Init()
63
 
 
 
 
 
 
 
 
 
64
  self.torso_imu_state = IMUState_default()
65
  self.torso_imu_puber = ChannelPublisher("rt/secondary_imu", IMUState_)
66
  self.torso_imu_puber.Init()
@@ -68,7 +100,6 @@ class UnitreeSdk2Bridge:
68
  self.left_hand_state = HandState_default()
69
  self.left_hand_state_puber = ChannelPublisher("rt/dex3/left/state", HandState_)
70
  self.left_hand_state_puber.Init()
71
-
72
  self.right_hand_state = HandState_default()
73
  self.right_hand_state_puber = ChannelPublisher("rt/dex3/right/state", HandState_)
74
  self.right_hand_state_puber.Init()
@@ -79,7 +110,6 @@ class UnitreeSdk2Bridge:
79
  self.left_hand_cmd = HandCmd_default()
80
  self.left_hand_cmd_suber = ChannelSubscriber("rt/dex3/left/cmd", HandCmd_)
81
  self.left_hand_cmd_suber.Init(self.LeftHandCmdHandler, 1)
82
-
83
  self.right_hand_cmd = HandCmd_default()
84
  self.right_hand_cmd_suber = ChannelSubscriber("rt/dex3/right/cmd", HandCmd_)
85
  self.right_hand_cmd_suber.Init(self.RightHandCmdHandler, 1)
@@ -117,8 +147,29 @@ class UnitreeSdk2Bridge:
117
 
118
  # Store config for initialization
119
  self.config = config
120
-
121
  self.reset()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
 
123
  def reset(self):
124
  with self.low_cmd_lock:
@@ -173,6 +224,12 @@ class UnitreeSdk2Bridge:
173
  raise NotImplementedError("Frame sensor data is not implemented yet.")
174
  else:
175
  # Get data from ground truth
 
 
 
 
 
 
176
  # quaternion: w, x, y, z
177
  self.low_state.imu_state.quaternion[:] = obs["floating_base_pose"][3:7]
178
  # angular velocity
@@ -187,26 +244,13 @@ class UnitreeSdk2Bridge:
187
  if self.have_frame_sensor_:
188
  raise NotImplementedError("Frame sensor data is not implemented yet.")
189
  self.low_state.tick = int(obs["time"] * 1e3)
190
-
191
- # Copy wireless controller data into lowstate for controllers that read from rt/lowstate
192
- if self.joystick is not None:
193
- import struct
194
- # Pack wireless controller data in the format expected by unitree_g1.py RemoteController.set()
195
- # bytes 0-1: padding, bytes 2-3: keys, bytes 4-7: lx, bytes 8-11: rx,
196
- # bytes 12-15: ry, bytes 16-19: padding, bytes 20-23: ly
197
- keys = int(self.wireless_controller.keys)
198
- lx = float(self.wireless_controller.lx)
199
- ly = float(self.wireless_controller.ly)
200
- rx = float(self.wireless_controller.rx)
201
- ry = float(self.wireless_controller.ry)
202
- wireless_data = struct.pack('<HHfffff', 0, keys, lx, rx, ry, 0.0, ly)
203
- # Copy bytes into the existing wireless_remote array
204
- for i, b in enumerate(wireless_data):
205
- if i < len(self.low_state.wireless_remote):
206
- self.low_state.wireless_remote[i] = b
207
-
208
  self.low_state_puber.Write(self.low_state)
209
 
 
 
 
 
 
210
  self.torso_imu_puber.Write(self.torso_imu_state)
211
 
212
  # publish hand state
@@ -271,9 +315,6 @@ class UnitreeSdk2Bridge:
271
  self.wireless_controller.rx = self.joystick.get_axis(self.axis_id["RX"])
272
  self.wireless_controller.ry = -self.joystick.get_axis(self.axis_id["RY"])
273
 
274
- # Debug: print joystick values
275
- lx, ly, rx, ry = self.wireless_controller.lx, self.wireless_controller.ly, self.wireless_controller.rx, self.wireless_controller.ry
276
-
277
  self.wireless_controller_puber.Write(self.wireless_controller)
278
 
279
  def SetupJoystick(self, device_id=0, js_type="xbox"):
@@ -340,6 +381,7 @@ class UnitreeSdk2Bridge:
340
  }
341
  else:
342
  print("Unsupported OS. ")
 
343
  elif js_type == "switch":
344
  # Yuanhang: may differ for different OS, need to be checked
345
  self.axis_id = {
@@ -352,6 +394,7 @@ class UnitreeSdk2Bridge:
352
  "DX": 6, # Directional pad x
353
  "DY": 7, # Directional pad y
354
  }
 
355
  self.button_id = {
356
  "X": 3,
357
  "Y": 4,
@@ -373,18 +416,21 @@ class UnitreeSdk2Bridge:
373
  if name:
374
  logger.info(f"link_index: {i}, name: {name}")
375
  print(" ")
 
376
  logger.info(colored("<<------------- Joint ------------->>", "green"))
377
  for i in range(self.mj_model.njnt):
378
  name = mujoco.mj_id2name(self.mj_model, mujoco._enums.mjtObj.mjOBJ_JOINT, i)
379
  if name:
380
  logger.info(f"joint_index: {i}, name: {name}")
381
  print(" ")
 
382
  logger.info(colored("<<------------- Actuator ------------->>", "green"))
383
  for i in range(self.mj_model.nu):
384
  name = mujoco.mj_id2name(self.mj_model, mujoco._enums.mjtObj.mjOBJ_ACTUATOR, i)
385
  if name:
386
  logger.info(f"actuator_index: {i}, name: {name}")
387
  print(" ")
 
388
  logger.info(colored("<<------------- Sensor ------------->>", "green"))
389
  index = 0
390
  for i in range(self.mj_model.nsensor):
 
16
  unitree_hg_msg_dds__HandState_ as HandState_default,
17
  )
18
  from unitree_sdk2py.idl.unitree_go.msg.dds_ import WirelessController_
19
+ try:
20
+ from unitree_sdk2py.idl.unitree_hg.msg.dds_ import HandCmd_, HandState_, OdoState_
21
+ HAS_ODOSTATE = True
22
+ except ImportError:
23
+ from unitree_sdk2py.idl.unitree_hg.msg.dds_ import HandCmd_, HandState_
24
+ OdoState_ = None
25
+ HAS_ODOSTATE = False
26
+ print("Warning: OdoState_ not available in unitree_sdk2py")
27
 
28
 
29
  class UnitreeSdk2Bridge:
30
  """
31
+ This class is responsible for bridging the Unitree SDK2 with the Gr00t environment.
32
+ It is responsible for sending and receiving messages to and from the Unitree SDK2.
33
+ Both the body and hand are supported.
34
  """
35
 
36
  def __init__(self, config):
37
  # Note that we do not give the mjdata and mjmodel to the UnitreeSdk2Bridge.
38
  # It is unsafe and would be unflexible if we use a hand-plugged robot model
39
+
40
  robot_type = config["ROBOT_TYPE"]
41
  if "g1" in robot_type or "h1-2" in robot_type:
42
  from unitree_sdk2py.idl.default import (
 
44
  unitree_hg_msg_dds__LowCmd_,
45
  unitree_hg_msg_dds__LowState_ as LowState_default,
46
  )
47
+ try:
48
+ from unitree_sdk2py.idl.default import unitree_hg_msg_dds__OdoState_ as OdoState_default
49
+ except ImportError:
50
+ OdoState_default = None
51
  from unitree_sdk2py.idl.unitree_hg.msg.dds_ import IMUState_, LowCmd_, LowState_
52
 
53
  self.low_cmd = unitree_hg_msg_dds__LowCmd_()
 
66
  self.num_body_motor = config["NUM_MOTORS"]
67
  self.num_hand_motor = config.get("NUM_HAND_MOTORS", 0)
68
  self.use_sensor = config["USE_SENSOR"]
69
+
70
  self.have_imu_ = False
71
  self.have_frame_sensor_ = False
72
+ # if self.use_sensor:
73
+ # MOTOR_SENSOR_NUM = 3
74
+ # self.dim_motor_sensor = MOTOR_SENSOR_NUM * self.num_motor
75
+ # # Check sensor
76
+ # for i in range(self.dim_motor_sensor, self.mj_model.nsensor):
77
+ # name = mujoco.mj_id2name(self.mj_model, mujoco._enums.mjtObj.mjOBJ_SENSOR, i)
78
+ # if name == "imu_quat":
79
+ # self.have_imu_ = True
80
+ # if name == "frame_pos":
81
+ # self.have_frame_sensor_ = True
82
 
83
  # Unitree sdk2 message
84
  self.low_state = LowState_default()
85
  self.low_state_puber = ChannelPublisher("rt/lowstate", LowState_)
86
  self.low_state_puber.Init()
87
 
88
+ # Only create odo_state for supported robot types (if available)
89
+ if ("g1" in robot_type or "h1-2" in robot_type) and HAS_ODOSTATE and OdoState_default:
90
+ self.odo_state = OdoState_default()
91
+ self.odo_state_puber = ChannelPublisher("rt/odostate", OdoState_)
92
+ self.odo_state_puber.Init()
93
+ else:
94
+ self.odo_state = None
95
+ self.odo_state_puber = None
96
  self.torso_imu_state = IMUState_default()
97
  self.torso_imu_puber = ChannelPublisher("rt/secondary_imu", IMUState_)
98
  self.torso_imu_puber.Init()
 
100
  self.left_hand_state = HandState_default()
101
  self.left_hand_state_puber = ChannelPublisher("rt/dex3/left/state", HandState_)
102
  self.left_hand_state_puber.Init()
 
103
  self.right_hand_state = HandState_default()
104
  self.right_hand_state_puber = ChannelPublisher("rt/dex3/right/state", HandState_)
105
  self.right_hand_state_puber.Init()
 
110
  self.left_hand_cmd = HandCmd_default()
111
  self.left_hand_cmd_suber = ChannelSubscriber("rt/dex3/left/cmd", HandCmd_)
112
  self.left_hand_cmd_suber.Init(self.LeftHandCmdHandler, 1)
 
113
  self.right_hand_cmd = HandCmd_default()
114
  self.right_hand_cmd_suber = ChannelSubscriber("rt/dex3/right/cmd", HandCmd_)
115
  self.right_hand_cmd_suber.Init(self.RightHandCmdHandler, 1)
 
147
 
148
  # Store config for initialization
149
  self.config = config
150
+
151
  self.reset()
152
+
153
+ # Initialize motors with default KP/KD from config to make robot stiff at startup
154
+ self._initialize_motor_defaults()
155
+
156
+ def _initialize_motor_defaults(self):
157
+ """Initialize motor commands with default KP/KD and joint positions"""
158
+ if "MOTOR_KP" in self.config and "MOTOR_KD" in self.config:
159
+ motor_kp = self.config["MOTOR_KP"]
160
+ motor_kd = self.config["MOTOR_KD"]
161
+ default_dof_angles = self.config.get("DEFAULT_DOF_ANGLES", [0.0] * self.num_body_motor)
162
+
163
+ for i in range(min(self.num_body_motor, len(motor_kp))):
164
+ self.low_cmd.motor_cmd[i].kp = motor_kp[i]
165
+ self.low_cmd.motor_cmd[i].kd = motor_kd[i]
166
+ self.low_cmd.motor_cmd[i].q = default_dof_angles[i] if i < len(default_dof_angles) else 0.0
167
+ self.low_cmd.motor_cmd[i].dq = 0.0
168
+ self.low_cmd.motor_cmd[i].tau = 0.0
169
+
170
+ print(f"✓ Initialized {self.num_body_motor} motors with default KP/KD gains")
171
+ else:
172
+ print("⚠ Warning: MOTOR_KP/MOTOR_KD not found in config, robot will be limp at startup")
173
 
174
  def reset(self):
175
  with self.low_cmd_lock:
 
224
  raise NotImplementedError("Frame sensor data is not implemented yet.")
225
  else:
226
  # Get data from ground truth
227
+ # Publish odo state only if available
228
+ if self.odo_state is not None:
229
+ self.odo_state.position[:] = obs["floating_base_pose"][:3]
230
+ self.odo_state.linear_velocity[:] = obs["floating_base_vel"][:3]
231
+ self.odo_state.orientation[:] = obs["floating_base_pose"][3:7]
232
+ self.odo_state.angular_velocity[:] = obs["floating_base_vel"][3:6]
233
  # quaternion: w, x, y, z
234
  self.low_state.imu_state.quaternion[:] = obs["floating_base_pose"][3:7]
235
  # angular velocity
 
244
  if self.have_frame_sensor_:
245
  raise NotImplementedError("Frame sensor data is not implemented yet.")
246
  self.low_state.tick = int(obs["time"] * 1e3)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
  self.low_state_puber.Write(self.low_state)
248
 
249
+ # Publish odo state only if available
250
+ if self.odo_state is not None and self.odo_state_puber is not None:
251
+ self.odo_state.tick = int(obs["time"] * 1e3)
252
+ self.odo_state_puber.Write(self.odo_state)
253
+
254
  self.torso_imu_puber.Write(self.torso_imu_state)
255
 
256
  # publish hand state
 
315
  self.wireless_controller.rx = self.joystick.get_axis(self.axis_id["RX"])
316
  self.wireless_controller.ry = -self.joystick.get_axis(self.axis_id["RY"])
317
 
 
 
 
318
  self.wireless_controller_puber.Write(self.wireless_controller)
319
 
320
  def SetupJoystick(self, device_id=0, js_type="xbox"):
 
381
  }
382
  else:
383
  print("Unsupported OS. ")
384
+
385
  elif js_type == "switch":
386
  # Yuanhang: may differ for different OS, need to be checked
387
  self.axis_id = {
 
394
  "DX": 6, # Directional pad x
395
  "DY": 7, # Directional pad y
396
  }
397
+
398
  self.button_id = {
399
  "X": 3,
400
  "Y": 4,
 
416
  if name:
417
  logger.info(f"link_index: {i}, name: {name}")
418
  print(" ")
419
+
420
  logger.info(colored("<<------------- Joint ------------->>", "green"))
421
  for i in range(self.mj_model.njnt):
422
  name = mujoco.mj_id2name(self.mj_model, mujoco._enums.mjtObj.mjOBJ_JOINT, i)
423
  if name:
424
  logger.info(f"joint_index: {i}, name: {name}")
425
  print(" ")
426
+
427
  logger.info(colored("<<------------- Actuator ------------->>", "green"))
428
  for i in range(self.mj_model.nu):
429
  name = mujoco.mj_id2name(self.mj_model, mujoco._enums.mjtObj.mjOBJ_ACTUATOR, i)
430
  if name:
431
  logger.info(f"actuator_index: {i}, name: {name}")
432
  print(" ")
433
+
434
  logger.info(colored("<<------------- Sensor ------------->>", "green"))
435
  index = 0
436
  for i in range(self.mj_model.nsensor):
view_cameras_live.py CHANGED
@@ -202,7 +202,7 @@ def main():
202
  parser = argparse.ArgumentParser(description="Live camera viewer for MuJoCo simulator")
203
  parser.add_argument("--host", type=str, default="localhost",
204
  help="Simulator host address (default: localhost)")
205
- parser.add_argument("--port", type=int, default=5554,
206
  help="ZMQ port (default: 5555)")
207
  parser.add_argument("--interval", type=int, default=33,
208
  help="Update interval in ms (default: 33 = ~30fps)")
 
202
  parser = argparse.ArgumentParser(description="Live camera viewer for MuJoCo simulator")
203
  parser.add_argument("--host", type=str, default="localhost",
204
  help="Simulator host address (default: localhost)")
205
+ parser.add_argument("--port", type=int, default=5555,
206
  help="ZMQ port (default: 5555)")
207
  parser.add_argument("--interval", type=int, default=33,
208
  help="Update interval in ms (default: 33 = ~30fps)")