Files
2025-11-30 09:05:02 +08:00

4.5 KiB

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

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:

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:

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:

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:

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