Skip to content

Commit c29ca21

Browse files
committed
1 parent 6cce762 commit c29ca21

File tree

1,085 files changed

+161289
-282
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,085 files changed

+161289
-282
lines changed

.devcontainer/Dockerfile

Lines changed: 45 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
#
2-
# Base stage for all images
3-
#
4-
FROM ubuntu:noble AS base
5-
ENV DEBIAN_FRONTEND=noninteractive
1+
FROM ubuntu:noble AS dev
2+
3+
LABEL org.opencontainers.image.description="Spectacles-2-Unitree dev container"
4+
LABEL org.opencontainers.image.source="https://github.com/TastyDucks/spectacles-2-unitree-server"
5+
6+
ARG UV_VERSION=0.6.2
7+
8+
ENV CYCLONEDDS_HOME=/usr/local \
9+
DEBIAN_FRONTEND=noninteractive \
10+
PATH="/opt/conda/bin:${PATH}"
11+
612
RUN apt-get update && apt-get install -y --no-install-recommends \
713
ca-certificates \
814
apt-transport-https \
@@ -15,47 +21,17 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
1521
python3.12 \
1622
&& apt-get clean && rm -rf /var/lib/apt/lists/*
1723

18-
RUN . /etc/lsb-release && \
19-
curl -fsSL http://robotpkg.openrobots.org/packages/debian/robotpkg.asc > /etc/apt/keyrings/robotpkg.asc \
20-
&& echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/robotpkg.asc] http://robotpkg.openrobots.org/packages/debian/pub $(lsb_release -cs) robotpkg" > /etc/apt/sources.list.d/robotpkg.list \
21-
# pinocchio
22-
&& curl -fsSL https://neuro.debian.net/_static/neuro.debian.net.asc \
23-
| gpg --dearmor -o /etc/apt/trusted.gpg.d/neurodebian.gpg \
24-
&& curl -fsSL http://neuro.debian.net/lists/bookworm.us-ca.full > /etc/apt/sources.list.d/neurodebian.sources.list \
24+
RUN . /etc/lsb-release \
2525
# Git LFS
2626
&& curl -fsSL https://packagecloud.io/github/git-lfs/gpgkey \
2727
| gpg --dearmor -o /etc/apt/keyrings/github_git-lfs-archive-keyring.gpg \
28-
&& curl -fsSL "https://packagecloud.io/install/repositories/github/git-lfs/config_file.list?os=${DISTRIB_ID}&dist=${DISTRIB_CODENAME}" > /etc/apt/sources.list.d/github_git-lfs.list
29-
30-
RUN apt-get update && apt-get install -y --no-install-recommends \
31-
libboost-all-dev \
32-
libspdlog-dev \
33-
libeigen3-dev \
34-
robotpkg-py312-pinocchio \
35-
&& apt-get clean && rm -rf /var/lib/apt/lists/*
36-
37-
ENV PATH="/opt/openrobots/bin:/usr/local/bin:${PATH}" \
38-
PKG_CONFIG_PATH="/opt/openrobots/lib/pkgconfig:/usr/local/lib/pkgconfig" \
39-
LD_LIBRARY_PATH="/opt/openrobots/lib:/usr/local/lib" \
40-
PYTHONPATH="/opt/openrobots/lib/python3.12/site-packages:/usr/local/lib/python3.12/site-packages" \
41-
CMAKE_PREFIX_PATH="/opt/openrobots:/usr/local"
42-
43-
#
44-
# Devcontainer
45-
#
46-
FROM base AS dev
47-
48-
LABEL org.opencontainers.image.description="Spectacles-2-Unitree Coordination Server dev container"
49-
LABEL org.opencontainers.image.source="https://github.com/tastyducks/spectacles-2-unitree-server"
50-
51-
ARG UV_VERSION=0.6.2
52-
53-
# GitHub CLI
54-
RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg -o /usr/share/keyrings/githubcli.gpg && \
55-
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list && \
56-
# docker
57-
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc && \
58-
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list
28+
&& curl -fsSL "https://packagecloud.io/install/repositories/github/git-lfs/config_file.list?os=${DISTRIB_ID}&dist=${DISTRIB_CODENAME}" > /etc/apt/sources.list.d/github_git-lfs.list \
29+
# GitHub CLI
30+
&& curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg -o /usr/share/keyrings/githubcli.gpg \
31+
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli.gpg] https://cli.github.com/packages stable main" > /etc/apt/sources.list.d/github-cli.list \
32+
# Docker
33+
&& curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc \
34+
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" > /etc/apt/sources.list.d/docker.list
5935

6036
# Additional dev packages
6137
RUN apt-get update && apt-get install -y --no-install-recommends \
@@ -66,6 +42,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
6642
gcc-aarch64-linux-gnu \
6743
gh \
6844
git \
45+
git-lfs \
6946
htop \
7047
iputils-ping \
7148
jq \
@@ -81,12 +58,19 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
8158
unzip \
8259
&& apt-get clean && rm -rf /var/lib/apt/lists/*
8360

84-
RUN pipx ensurepath && pipx install "uv==$UV_VERSION"
85-
8661
# Install act
8762
RUN --mount=type=cache,target=/root/.cache/act \
8863
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/nektos/act/master/install.sh | bash
8964

65+
# Install uv
66+
RUN pipx ensurepath && pipx install "uv==$UV_VERSION"
67+
68+
# Install conda
69+
RUN curl -fsSL https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-Linux-aarch64.sh -o /tmp/miniforge.sh \
70+
&& chmod +x /tmp/miniforge.sh \
71+
&& /tmp/miniforge.sh -b -p /opt/conda \
72+
&& rm /tmp/miniforge.sh
73+
9074
# Build CycloneDDS
9175
RUN git clone https://github.com/eclipse-cyclonedds/cyclonedds /tmp/cyclonedds \
9276
&& cd /tmp/cyclonedds \
@@ -95,4 +79,19 @@ RUN git clone https://github.com/eclipse-cyclonedds/cyclonedds /tmp/cyclonedds \
9579
&& mkdir build && cd build \
9680
&& cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. \
9781
&& cmake --build . --target install \
98-
&& cd / && rm -rf /tmp/cyclonedds
82+
&& cd / && rm -rf /tmp/cyclonedds
83+
84+
SHELL ["/bin/bash", "-c"]
85+
86+
COPY unitree-client/environment.yml environment.yml
87+
88+
RUN source /opt/conda/etc/profile.d/conda.sh \
89+
&& conda env create -f environment.yml \
90+
&& conda clean -afy
91+
92+
RUN source /opt/conda/etc/profile.d/conda.sh \
93+
&& conda activate unitree-client \
94+
&& pip install --no-cache-dir \
95+
meshcat@git+https://github.com/TastyDucks/meshcat-python.git \
96+
unitree_sdk2py@git+https://github.com/TastyDucks/unitree_sdk2_python.git \
97+
cyclonedds==0.10.2

.devcontainer/devcontainer.json

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
// For format details, see https://aka.ms/devcontainer.json.
22
{
3-
"name": "Spectacles-2-Unitree coordination server",
4-
"image": "ghcr.io/tastyducks/spectacles-2-unitree-server.dev:latest",
3+
"name": "Spectacles-2-Unitree dev",
4+
"build": {
5+
"dockerfile": "Dockerfile",
6+
"context": "..",
7+
"options": [
8+
"--platform=linux/arm64"
9+
]
10+
},
511
"mounts": [
612
{
713
"source": "/var/run/docker.sock",
@@ -10,10 +16,9 @@
1016
}
1117
],
1218
"runArgs": [
13-
"--platform=linux/amd64"
19+
"--platform=linux/arm64"
1420
],
1521
"forwardPorts": [
1622
8080
17-
],
18-
"initializeCommand": "docker pull --platform linux/amd64 ghcr.io/tastyducks/spectacles-2-unitree-server.dev:latest" // This is needed because VS Code doesn't re-pull the image automatically... might be a regression in the remote dev extension, cf https://github.com/microsoft/vscode-remote-release/issues/7104
23+
]
1924
}

.gitattributes

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,105 @@
1+
# Shipped by Lens Studio
2+
*.esproj text linguist-language=yaml
3+
4+
Assets/**/* filter=lfs diff=lfs merge=lfs -text
5+
6+
Assets/**/*.css !filter !diff !merge text
7+
Assets/**/*.glsl !filter !diff !merge text
8+
Assets/**/*.js !filter !diff !merge text
9+
Assets/**/*.json !filter !diff !merge text
10+
Assets/**/*.lensanim !filter !diff !merge text
11+
Assets/**/*.md !filter !diff !merge text
12+
Assets/**/*.rtf !filter !diff !merge text
13+
Assets/**/*.svg !filter !diff !merge text
14+
Assets/**/*.t3d !filter !diff !merge text
15+
Assets/**/*.ts !filter !diff !merge text
16+
Assets/**/*.txt !filter !diff !merge text
17+
Assets/**/*.ui !filter !diff !merge text
18+
Assets/**/*.yaml !filter !diff !merge text
19+
20+
Assets/**/*.meta !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
21+
22+
Assets/**/*.animationAsset !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
23+
Assets/**/*.animationCurveTrack !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
24+
Assets/**/*.animationLayer !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
25+
Assets/**/*.animationMixerLayer !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
26+
Assets/**/*.audioOutput !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
27+
Assets/**/*.bitmojiModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
28+
Assets/**/*.bodyDepthTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
29+
Assets/**/*.bodyInstanceSegmentationTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
30+
Assets/**/*.bodyMesh !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
31+
Assets/**/*.bodyNormalsTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
32+
Assets/**/*.bodyTracking3D !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
33+
Assets/**/*.cameraModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
34+
Assets/**/*.cameraRawModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
35+
Assets/**/*.cloudStorageModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
36+
Assets/**/*.colocatedLandmarks2DMesh !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
37+
Assets/**/*.colocatedLandmarks3DMesh !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
38+
Assets/**/*.connectedLensModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
39+
Assets/**/*.coreMLModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
40+
Assets/**/*.depthStencilRenderTarget !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
41+
Assets/**/*.depthTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
42+
Assets/**/*.deviceCameraTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
43+
Assets/**/*.deviceTrackingModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
44+
Assets/**/*.dialogModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
45+
Assets/**/*.faceCropTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
46+
Assets/**/*.faceImagePickerTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
47+
Assets/**/*.faceTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
48+
Assets/**/*.faceTrackingModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
49+
Assets/**/*.facelessTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
50+
Assets/**/*.facemesh !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
51+
Assets/**/*.filter !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
52+
Assets/**/*.handTracking3D !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
53+
Assets/**/*.imagePickerTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
54+
Assets/**/*.imgmarker !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
55+
Assets/**/*.internetModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
56+
Assets/**/*.leaderBoardModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
57+
Assets/**/*.licensedAudio !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
58+
Assets/**/*.location !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
59+
Assets/**/*.locationCloudStorageModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
60+
Assets/**/*.locationTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
61+
Assets/**/*.location_mesh !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
62+
Assets/**/*.mapModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
63+
Assets/**/*.mat !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
64+
Assets/**/*.matter !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
65+
Assets/**/*.mediaPickerTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
66+
Assets/**/*.micaudio !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
67+
Assets/**/*.microphoneRawModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
68+
Assets/**/*.motionControllerModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
69+
Assets/**/*.native !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
70+
Assets/**/*.objectTrackingTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
71+
Assets/**/*.prefab !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
72+
Assets/**/*.processedLocationModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
73+
Assets/**/*.proxyTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
74+
Assets/**/*.rawLocationModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
75+
Assets/**/*.rayTracingSettings !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
76+
Assets/**/*.remoteMLAsset !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
77+
Assets/**/*.remoteMediaModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
78+
Assets/**/*.remoteReferenceAsset !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
79+
Assets/**/*.remoteServiceModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
80+
Assets/**/*.renderTarget !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
81+
Assets/**/*.reverseCameraTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
82+
Assets/**/*.scanModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
83+
Assets/**/*.scene !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
84+
Assets/**/*.scmarker !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
85+
Assets/**/*.screenCropTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
86+
Assets/**/*.screenTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
87+
Assets/**/*.segmentationTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
88+
Assets/**/*.shoppingModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
89+
Assets/**/*.textInputModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
90+
Assets/**/*.textTexture !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
91+
Assets/**/*.textToSpeechModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
92+
Assets/**/*.upperBodyMesh !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
93+
Assets/**/*.upperBodyTracking3D !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
94+
Assets/**/*.voiceMLModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
95+
Assets/**/*.worldQueryModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
96+
Assets/**/*.worldSettings !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
97+
Assets/**/*.worldUnderstandingModule !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
98+
Assets/**/*.worldmesh !filter !diff !merge text linguist-language=yaml merge=lens-studio-yaml-merge
99+
# Shipped by Lens Studio
100+
.png filter=lfs diff=lfs merge=lfs -text
101+
.jpg filter=lfs diff=lfs merge=lfs -text
102+
.gif filter=lfs diff=lfs merge=lfs -text
103+
104+
# Unitree Client Meshes
1105
*.STL filter=lfs diff=lfs merge=lfs -text

.github/workflows/build-and-push.yml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,17 @@ jobs:
1919
strategy:
2020
matrix:
2121
container:
22-
- path: .devcontainer
22+
- context: .
23+
file: .devcontainer/Dockerfile
2324
name: dev
24-
platforms: linux/amd64
25-
- path: unitree-client
25+
platforms: linux/arm64
26+
- context: unitree-client
27+
file: unitree-client/Dockerfile
2628
name: client
2729
target: runtime
2830
platforms: linux/arm64
29-
- path: .
31+
- context: coordination-server
32+
file: coordination-server/Dockerfile
3033
name: server
3134
platforms: linux/amd64
3235
steps:
@@ -63,8 +66,8 @@ jobs:
6366
- name: Build and Push
6467
uses: docker/build-push-action@v6
6568
with:
66-
context: ${{ matrix.container.path }}
67-
file: ${{ matrix.container.path }}/Dockerfile
69+
context: ${{ matrix.container.context }}
70+
file: ${{ matrix.container.file }}
6871
tags: ${{ steps.meta.outputs.tags }}
6972
labels: ${{ steps.meta.outputs.labels }}
7073
platforms: ${{ matrix.container.platforms }}

.gitignore

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
1-
# MacOS
2-
.DS_STORE
1+
# Shipped by Lens Studio
2+
Cache/**
3+
PluginsUserPreferences/**
4+
Support/**
5+
BackUp/**
6+
Workspaces/**
7+
.vscode/**
8+
jsconfig.json
9+
tsconfig.json
10+
.DS_Store
11+
*.lock
12+
# Shipped by Lens Studio
313
# Python
414
.venv
515
*.egg-info
6-
__pycache__
16+
__pycache__

ATTRIBUTION.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Third Party License Information
2+
3+
- This project uses Python source, STL, and URDF files from [Unitree](https://github.com/unitreerobotics/avp_teleoperate/blob/main/LICENSE), originally licensed under the Apache 2.0 License:
4+
- [unitree-client/src/ik/urdf/](./unitree-client/src/ik/urdf/)
5+
- [unitree-client/src/ik/utils/](./unitree-client/src/ik/utils/)
6+
- [unitree-client/src/ik/g1_controller.py](./unitree-client/src/ik/g1_controller.py)
7+
- [unitree-client/src/ik/g1_solver.py](./unitree-client/src/ik/g1_solver.py), modifications licensed under the [MIT License](./LICENSE).
8+
- Python dependencies are not included in the source code, and are gathered as part of the build process for the Docker images via PyPi and conda-forge:
9+
- [aiohttp](https://github.com/aio-libs/aiohttp/blob/master/LICENSE.txt) (Apache 2.0 License)
10+
- [aiohttp-jinja2](https://github.com/aio-libs/aiohttp-jinja2/blob/master/LICENSE) (Apache 2.0 License)
11+
- [asyncio](https://github.com/python/cpython/blob/main/LICENSE) (Python Software Foundation License) - Part of Python Standard Library
12+
- [casadi](https://github.com/casadi/casadi/blob/develop/LICENSE.txt) (LGPL v3)
13+
- [ipython](https://github.com/ipython/ipython/blob/main/LICENSE) (BSD 3-Clause License)
14+
- [jinja2](https://github.com/pallets/jinja/blob/main/LICENSE.txt) (BSD 3-Clause License)
15+
- [mujoco](https://github.com/google-deepmind/mujoco/blob/main/LICENSE) (Apache 2.0 License)
16+
- [numpy](https://github.com/numpy/numpy/blob/main/LICENSE.txt) (BSD 3-Clause License)
17+
- [opencv-contrib-python-headless](https://github.com/opencv/opencv-python/blob/master/LICENSE.txt) (MIT)
18+
- [pillow](https://github.com/python-pillow/Pillow/blob/main/LICENSE) (MIT-CMU License)
19+
- [pinocchio](https://github.com/stack-of-tasks/pinocchio/blob/master/LICENSE) (BSD 2-Clause License)
20+
- [pip](https://github.com/pypa/pip/blob/main/LICENSE.txt) (MIT License)
21+
- [pyzmq](https://github.com/zeromq/pyzmq/blob/main/LICENSE.md) (BSD 3-Clause License)
22+
- [scipy](https://github.com/scipy/scipy/blob/main/LICENSE.txt) (BSD 3-Clause License)
23+
- [websockets](https://github.com/aaugustin/websockets/blob/main/LICENSE) (BSD 3-Clause License)

Assets/Base.png

Lines changed: 3 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)