182 lines
4.5 KiB
Markdown
182 lines
4.5 KiB
Markdown
# Unitree Go1 Robot with Stairs
|
|
|
|
## Overview
|
|
This tutorial demonstrates setting up a 3D scene containing a Unitree Go1 quadruped robot positioned in front of a staircase, along with lighting and atmospheric effects.
|
|
|
|
## Scene Components
|
|
|
|
The visualization includes four main elements:
|
|
|
|
1. **Unitree Go1 Robot** - A quadrupedal robot model loaded via URDF format
|
|
2. **Stairway Mesh** - A textured 3D model of stairs
|
|
3. **Fog Effect** - Atmospheric fog that darkens distant portions of the scene
|
|
4. **Lighting** - An ambient light source plus two movable point lights
|
|
|
|
## Complete Code Example
|
|
|
|
```python
|
|
import math
|
|
import asyncio
|
|
from vuer import Vuer
|
|
from vuer.schemas import Scene, Urdf, Obj, AmbientLight, PointLight, Movable, Plane, Fog
|
|
|
|
app = Vuer()
|
|
|
|
@app.spawn(start=True)
|
|
async def main(session):
|
|
# Setup scene with fog and lighting
|
|
session.set @ Scene(
|
|
# Add fog effect
|
|
Fog(
|
|
color="#000000",
|
|
near=1,
|
|
far=20,
|
|
),
|
|
|
|
# Ground plane
|
|
Plane(
|
|
args=[100, 100],
|
|
position=[0, -0.01, 0],
|
|
rotation=[-1.57, 0, 0],
|
|
key="ground",
|
|
),
|
|
|
|
# Staircase mesh
|
|
Obj(
|
|
src="/static/stairs/stairs.obj",
|
|
position=[2, 0, 0],
|
|
rotation=[0, 0, 0],
|
|
materialType="standard",
|
|
material={
|
|
"color": "#cccccc",
|
|
"roughness": 0.8,
|
|
},
|
|
key="stairs",
|
|
),
|
|
|
|
# Ambient lighting
|
|
AmbientLight(intensity=1.0),
|
|
|
|
# Movable point lights
|
|
Movable(
|
|
PointLight(
|
|
intensity=3.0,
|
|
position=[2, 3, 2],
|
|
key="light-1",
|
|
)
|
|
),
|
|
Movable(
|
|
PointLight(
|
|
intensity=3.0,
|
|
position=[-2, 3, -2],
|
|
key="light-2",
|
|
)
|
|
),
|
|
)
|
|
|
|
# Animation loop for the robot
|
|
for i in range(10000):
|
|
# Calculate joint angles using sinusoidal functions
|
|
hip_angle = 0.3 * math.sin(i * 0.1)
|
|
thigh_angle = 0.785 - 0.25 * math.sin(i * 0.1)
|
|
calf_angle = -1.5 + 0.5 * math.sin(i * 0.1)
|
|
|
|
# Update robot position and joints
|
|
session.upsert @ Urdf(
|
|
src="/static/go1/go1.urdf",
|
|
position=[0, 0, 0.33],
|
|
rotation=[0, 0, 0],
|
|
jointValues={
|
|
# Front Left
|
|
"FL_hip_joint": hip_angle,
|
|
"FL_thigh_joint": thigh_angle,
|
|
"FL_calf_joint": calf_angle,
|
|
|
|
# Front Right
|
|
"FR_hip_joint": -hip_angle,
|
|
"FR_thigh_joint": thigh_angle,
|
|
"FR_calf_joint": calf_angle,
|
|
|
|
# Rear Left
|
|
"RL_hip_joint": -hip_angle,
|
|
"RL_thigh_joint": thigh_angle,
|
|
"RL_calf_joint": calf_angle,
|
|
|
|
# Rear Right
|
|
"RR_hip_joint": hip_angle,
|
|
"RR_thigh_joint": thigh_angle,
|
|
"RR_calf_joint": calf_angle,
|
|
},
|
|
key="go1-robot",
|
|
)
|
|
|
|
# Update at ~60 FPS
|
|
await asyncio.sleep(0.016)
|
|
|
|
app.run()
|
|
```
|
|
|
|
## Key Features
|
|
|
|
### Fog Effect
|
|
Creates atmospheric depth:
|
|
```python
|
|
Fog(
|
|
color="#000000", # Black fog
|
|
near=1, # Fog starts at distance 1
|
|
far=20, # Full fog at distance 20
|
|
)
|
|
```
|
|
|
|
### Ground Plane
|
|
A large plane rotated to be horizontal:
|
|
```python
|
|
Plane(
|
|
args=[100, 100], # 100x100 units
|
|
position=[0, -0.01, 0], # Slightly below origin
|
|
rotation=[-1.57, 0, 0], # Rotated 90° (π/2)
|
|
)
|
|
```
|
|
|
|
### Staircase Mesh
|
|
3D model with material properties:
|
|
```python
|
|
Obj(
|
|
src="/static/stairs/stairs.obj",
|
|
materialType="standard",
|
|
material={
|
|
"color": "#cccccc",
|
|
"roughness": 0.8,
|
|
},
|
|
)
|
|
```
|
|
|
|
## Robot Animation
|
|
|
|
The application updates continuously at approximately 60 frames per second, calculating joint values like:
|
|
|
|
```python
|
|
thigh_angle = 0.785 - 0.25 * math.sin(i * 0.1)
|
|
```
|
|
|
|
This creates realistic walking motion across the stair scene.
|
|
|
|
## Leg Coordination
|
|
|
|
The Go1 has a specific gait pattern:
|
|
- Front Left and Rear Right move together (same hip angle)
|
|
- Front Right and Rear Left move together (opposite hip angle)
|
|
|
|
This creates a natural trotting gait.
|
|
|
|
## Assets Required
|
|
|
|
Make sure you have the following assets:
|
|
- `go1.urdf` - Robot description file
|
|
- `stairs.obj` - Staircase 3D model
|
|
- Associated mesh files for the Go1 robot
|
|
|
|
## Source
|
|
|
|
Documentation: https://docs.vuer.ai/en/latest/tutorials/robotics/urdf_go1_stairs.html
|