Genesis-Embodied-AI/genesis-world · error · ImportError

pygel3d is not supported on Linux ARM (aarch64).

Error message

pygel3d is not supported on Linux ARM (aarch64).

What it means

load_hmesh loads a mesh file into a pygel3d Manifold, but pygel3d ships no Linux aarch64 wheels and its build fails on that platform, so Genesis refuses upfront with an ImportError instead of crashing during the native import. The check is platform.machine() == 'aarch64' combined with sys.platform == 'linux'. Any mesh loading through this helper on Linux ARM raises immediately.

Source

Thrown at genesis/utils/hybrid.py:19

import hashlib
import os
import platform
import sys
import time
from itertools import combinations

import networkx as nx
import numpy as np
from matplotlib.patches import FancyArrowPatch

import genesis as gs

from .misc import get_gel_cache_dir


def load_hmesh(fpath: str):
    if sys.platform == "linux" and platform.machine() == "aarch64":
        raise ImportError("pygel3d is not supported on Linux ARM (aarch64).")
    from pygel3d import hmesh

    return hmesh.load(fpath)


def trimesh_to_gelmesh(tmesh):
    if sys.platform == "linux" and platform.machine() == "aarch64":
        raise ImportError("pygel3d is not supported on Linux ARM (aarch64).")
    from pygel3d import hmesh

    return hmesh.Manifold.from_triangles(vertices=tmesh.vertices, faces=tmesh.faces)


def get_gel_path(positions, nodes, sampling):
    hasher = hashlib.sha256()
    hasher.update(positions.tobytes())
    hasher.update(nodes.tobytes())
    hasher.update(str(sampling).encode())

View on GitHub (pinned to 56e4aa5d82)

Solutions

  1. Run the workload on an x86_64 Linux host or container (e.g. docker --platform linux/amd64 with qemu emulation).
  2. Use an alternative mesh path that avoids pygel3d (load with trimesh-based morphs/options if available for your use case).
  3. Build pygel3d from source for aarch64 if you have a toolchain, then patch out the guard.

Example fix

# before (fails on linux/aarch64)
m = load_hmesh('model.obj')
# after
tmesh = trimesh.load('model.obj')  # trimesh works on aarch64; avoid pygel3d-dependent paths
Defensive patterns

Strategy: fallback

Validate before calling

import sys, platform
IS_LINUX_ARM = sys.platform == 'linux' and platform.machine() == 'aarch64'
if IS_LINUX_ARM:
    raise SystemExit('pygel3d mesh loading unsupported on linux/aarch64; use x86_64 or trimesh')

Try / catch

try:
    m = load_hmesh(path)
except ImportError as e:
    if 'aarch64' in str(e):
        m = None  # fall back to trimesh-based path
    else:
        raise

Prevention

When it happens

Trigger: Calling genesis.utils.hybrid.load_hmesh(path) on a Linux aarch64 machine (e.g. AWS Graviton, Raspberry Pi 5, ARM CI runners, NVIDIA Grace, Apple Rosetta-free ARM containers).

Common situations: Running Genesis soft-body/hybrid workflow examples or rigid-from-soft instantiation on Graviton instances or ARM docker images; also hitting it in CI after the runner was migrated to ARM.

Related errors


AI-assisted analysis of Genesis-Embodied-AI/genesis-world@56e4aa5d82 (2026-08-28). Data as JSON: /api/errors/e734b50fb8d0fc11. Report an issue: GitHub.