Serving URDF Files Locally (MIT Mini Cheetah)ΒΆ

This tutorial shows you how to serve a URDF file locally. We will use the MIT Mini Cheetah robot as an example. At the end of this tutorial, you should be able to see the robot in the following view:

MIT Mini Cheetah

Before you start, let’s first download the URDF file from here.

mkdir -p assets/mini_cheetah/meshes
cd "assets/mini_cheetah" && wget -O "mini_cheetah.urdf" https://github.com/geyang/unitree-go1-setup-guide/raw/main/robots/mini_cheetah/mini_cheetah.urdf
cd "meshes"
wget -O "mini_abad.obj" https://github.com/geyang/unitree-go1-setup-guide/raw/main/robots/mini_cheetah/meshes/mini_abad.obj
wget -O "mini_body.obj" https://github.com/geyang/unitree-go1-setup-guide/raw/main/robots/mini_cheetah/meshes/mini_body.obj
wget -O "mini_lower_link.obj" https://github.com/geyang/unitree-go1-setup-guide/raw/main/robots/mini_cheetah/meshes/mini_lower_link.obj
wget -O "mini_upper_link.obj" https://github.com/geyang/unitree-go1-setup-guide/raw/main/robots/mini_cheetah/meshes/mini_upper_link.obj

You should have the following directory structure:

β”œβ”€β”€ meshes
β”‚   β”œβ”€β”€ mini_abad.obj
β”‚   β”œβ”€β”€ mini_body.obj
β”‚   β”œβ”€β”€ mini_lower_link.obj
β”‚   └── mini_upper_link.obj
└── mini_cheetah.urdf

2 directories, 5 files
import math
from asyncio import sleep

from vuer import Vuer, VuerSession
from vuer.schemas import Scene, Urdf, Movable, PointLight, AmbientLight, Obj

pi = 3.1415

app = Vuer(static_root="assets/mini_cheetah")

@app.spawn(start=True)
async def main(app: VuerSession):
    # Note: you can only use `set` operator with Scene objects. This is a special operator.
    app.set @ Scene(
        rawChildren=[
            AmbientLight(intensity=1),
            Movable(PointLight(intensity=1), position=[0, 0, 2]),
            Movable(PointLight(intensity=3), position=[0, 1, 2]),
        ],
        grid=True,
        up=[0, 0, 1]
    )
    await sleep(0.1)

    i = 0
    while True:
        app.upsert @ Urdf(
            src="http://localhost:8012/static/mini_cheetah.urdf",
            jointValues={
                "FL_hip_joint": -0.2,
                "RL_hip_joint": -0.2,
                "FR_hip_joint": 0.2,
                "RR_hip_joint": 0.2,
                "FL_thigh_joint": -0.25 * pi,
                "RL_thigh_joint": -0.25 * pi,
                "FR_thigh_joint": 0.5 * math.sin(i * 0.1) - 1.3,
                "RR_thigh_joint": -0.25 * pi,
                "FL_calf_joint": 0.5 * pi,
                "RL_calf_joint": 0.5 * pi,
                "FR_calf_joint": -0.5 * math.sin(i * 0.1) + 0.6 * pi,
                "RR_calf_joint": 0.5 * pi,
            },
            position=[0, 0, 0.295],
            key="robot",
        )
        await sleep(0.016)
        i += 1

Now, if your script runs correctly, the robot should show up in the following view: