<aside>

本文只记录 AnyGrasp 环境配置、依赖编译、许可证、权重放置与官方 Demo 验证,不涉及具体机器人、相机、目标分割或抓取任务代码。所有版本、命令和输出均来自一台实际完成安装并成功推理的设备。

</aside>


一、最终验证通过的环境

项目 实际版本或路径 状态
操作系统 Ubuntu 22.04
显卡 NVIDIA GeForce RTX 4090,24 GB
NVIDIA 驱动 595.80
nvidia-smi 显示 CUDA 13.2 仅表示驱动最高支持版本
实际 CUDA Toolkit 12.8,/usr/local/cuda-12.8
NVCC 12.8.61
GCC / G++ 12.3.0
CMake 3.22.1
Ninja 1.10.1
Conda 环境 anygrasp
Python 3.11.15
PyTorch 2.11.0+cu128
MinkowskiEngine 0.5.4,AnyGrasp 修改版 cuda-12-1 分支
OpenBLAS 0.3.31
PointNet2 本地 CUDA 扩展,CPython 3.11
Open3D 0.19.0
graspnetAPI 1.2.11
AnyGrasp SDK main 分支;安装时提交 b8eaafc
gsnet.so CPython 3.11 x86_64 版本
检测权重 checkpoint_detection.tar,约 283 MB
跟踪权重 checkpoint_tracking.tar,约 23 MB ✅ 已下载,非检测 Demo 必需
许可证 本机 Feature ID 对应许可证 License passed: True

<aside>
⚠️

最关键的匹配关系是:PyTorch 使用 cu128,本机编译 CUDA 扩展使用 NVCC 12.8。 不要把 PyTorch 的 CUDA 构建版本和本机 NVCC 主版本混用。

</aside>


二、先理解三个容易混淆的版本

2.1 nvidia-smi 中的 CUDA 版本

运行:

nvidia-smi

本机关键输出:

NVIDIA-SMI 595.80
Driver Version: 595.80
CUDA Version: 13.2
GPU: NVIDIA GeForce RTX 4090
Memory: 24564 MiB

这里的 CUDA Version: 13.2 表示当前驱动最高支持的 CUDA 版本,不等于本机已经安装 CUDA Toolkit 13.2。

2.2 真正用于编译的 CUDA Toolkit

真正决定能否编译 MinkowskiEngine 和 PointNet2 的是:

nvcc --version

或直接检查 Toolkit 路径:

/usr/local/cuda-12.8/bin/nvcc --version

本机实际使用:

Cuda compilation tools, release 12.8, V12.8.61

2.3 PyTorch 自己的 CUDA 构建版本

运行:

python - <<'PY'
import torch
print(torch.__version__)
print(torch.version.cuda)
PY

本机结果:

2.11.0+cu128
12.8

最终三者关系:

驱动最高支持 CUDA:13.2
实际 CUDA Toolkit / NVCC:12.8
PyTorch 构建版本:cu128

这套组合已完成实际验证。


三、安装总流程

flowchart TD
    A["检查 GPU 与 NVIDIA 驱动"] --> B["确认实际 CUDA Toolkit 与 NVCC"]
    B --> C["配置临时 CUDA 环境变量"]
    C --> D["创建 Python 3.11 Conda 环境"]
    D --> E["安装 PyTorch cu128 并验证 GPU"]
    E --> F["准备 GCC、CMake、Ninja、Git"]
    F --> G["克隆 AnyGrasp SDK"]
    G --> H["安装 OpenBLAS"]
    H --> I["编译 MinkowskiEngine"]
    I --> J["安装 requirements.txt"]
    J --> K["编译 PointNet2"]
    K --> L["安装 graspnetAPI"]
    L --> M["配置 Python 3.11 对应 gsnet.so"]
    M --> N["申请并验证许可证"]
    N --> O["放置模型权重"]
    O --> P["修复并永久保存动态库加载顺序"]
    P --> Q["运行完整环境检查"]
    Q --> R["运行官方无界面及可视化 Demo"]

四、第一步:检查显卡、驱动和 CUDA

4.1 检查显卡与驱动

nvidia-smi

应重点确认:

GPU Name: NVIDIA GeForce RTX 4090
Driver Version: 595.80
CUDA Version: 13.2

只要显卡被正确识别,且无驱动报错,即可继续。

4.2 检查 NVCC

最初直接运行:

nvcc --version
which nvcc

本机最初输出:

找不到命令 “nvcc”

但这不一定说明 Toolkit 没安装。继续检查:

ls -ld /usr/local/cuda /usr/local/cuda-12.8
ls -l /usr/local/cuda-12.8/bin/nvcc
/usr/local/cuda-12.8/bin/nvcc --version

本机结果:

/usr/local/cuda -> /usr/local/cuda-12.8/
/usr/local/cuda-12.8/bin/nvcc 存在
Cuda compilation tools, release 12.8, V12.8.61

结论:CUDA 12.8 Toolkit 已完整安装,只是 PATH 没有配置。

<aside>

看到系统提示后不要直接执行 sudo apt install nvidia-cuda-toolkit。应先检查 /usr/local/cuda-*,避免安装另一个版本造成混乱。

</aside>

4.3 临时配置 CUDA 12.8

export CUDA_HOME=/usr/local/cuda-12.8
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:${LD_LIBRARY_PATH:-}
hash -r

验证:

echo $CUDA_HOME
which nvcc
nvcc --version

本机输出:

/usr/local/cuda-12.8
/usr/local/cuda-12.8/bin/nvcc
Cuda compilation tools, release 12.8, V12.8.61

五、第二步:创建独立 Python 3.11 环境

本机系统 base 环境中 Python 为 3.13,因此单独创建 Python 3.11 环境:

conda create -n anygrasp python=3.11 pip -y
conda activate anygrasp

检查:

python --version
which python
echo $CONDA_DEFAULT_ENV
echo $CUDA_HOME
which nvcc
nvcc --version

本机输出:

Python 3.11.15
/home/hjadmin/miniconda3/envs/anygrasp/bin/python
anygrasp
/usr/local/cuda-12.8
/usr/local/cuda-12.8/bin/nvcc
Cuda compilation tools, release 12.8, V12.8.61

后续所有命令都应在终端前缀为 (anygrasp) 时执行。


六、第三步:安装 PyTorch cu128

python -m pip install torch torchvision \
  --index-url <https://download.pytorch.org/whl/cu128>

安装完成后验证:

python - <<'PY'
import torch

print("PyTorch版本:", torch.__version__)
print("PyTorch编译CUDA版本:", torch.version.cuda)
print("CUDA是否可用:", torch.cuda.is_available())

if torch.cuda.is_available():
    print("GPU名称:", torch.cuda.get_device_name(0))
    print("GPU计算能力:", torch.cuda.get_device_capability(0))
PY

本机输出:

PyTorch版本: 2.11.0+cu128
PyTorch编译CUDA版本: 12.8
CUDA是否可用: True
GPU名称: NVIDIA GeForce RTX 4090
GPU计算能力: (8, 9)

RTX 4090 对应 CUDA 架构 8.9,后续编译使用:

export TORCH_CUDA_ARCH_LIST="8.9"

七、第四步:检查并安装编译工具

检查:

g++ --version
cmake --version
ninja --version
git --version
python -m pip --version

本机初始结果:

g++ 12.3.0
cmake 3.22.1
ninja: 未找到命令
git 2.34.1
pip 26.2,Python 3.11

只缺少 Ninja,因此安装:

sudo apt update
sudo apt install -y ninja-build

验证:

ninja --version
which ninja

结果:

1.10.1
/usr/bin/ninja

八、第五步:下载 AnyGrasp SDK

cd ~
git clone <https://github.com/graspnet/anygrasp_sdk.git>
cd ~/anygrasp_sdk

检查仓库:

git branch --show-current
git log -1 --oneline
ls -la

本机安装时输出:

main
b8eaafc update readme

关键目录:

anygrasp_sdk/
├── grasp_detection/
├── grasp_tracking/
├── license_registration/
├── pointnet2/
├── requirements.txt
└── README.md

后续如果仓库最新提交变化,以实际 git log -1 --oneline 为准。


九、第六步:安装 OpenBLAS

cd ~/anygrasp_sdk
conda install -c anaconda openblas-devel -y

验证:

conda list | grep -E 'openblas|blas'
ls $CONDA_PREFIX/include/cblas.h
ls $CONDA_PREFIX/lib/libopenblas*

本机输出:

blas             1.0      openblas
libopenblas      0.3.31
openblas-devel   0.3.31
/home/hjadmin/miniconda3/envs/anygrasp/include/cblas.h
/home/hjadmin/miniconda3/envs/anygrasp/lib/libopenblas.so

只要 cblas.hlibopenblas.so 都存在,即可继续。


十、第七步:编译 MinkowskiEngine 0.5.4

10.1 下载 AnyGrasp 修改版

cd ~/anygrasp_sdk
mkdir -p dependencies
cd dependencies

git clone <https://github.com/chenxi-wang/MinkowskiEngine.git>
cd MinkowskiEngine
git checkout cuda-12-1

检查:

git branch --show-current
git log -1 --oneline
git status

本机输出:

cuda-12-1
3586275 fix compilation with CUDA 12.8
位于分支 cuda-12-1
工作区干净

10.2 编译前确认 PyTorch 与 CUDA

echo "CUDA_HOME=$CUDA_HOME"
echo "CONDA_PREFIX=$CONDA_PREFIX"
which gcc
which g++
gcc --version | head -n 1
python - <<'PY'
import torch
from torch.utils.cpp_extension import CUDA_HOME

print("PyTorch:", torch.__version__)
print("PyTorch CUDA:", torch.version.cuda)
print("CUDA_HOME detected:", CUDA_HOME)
print("CXX11 ABI:", torch._C._GLIBCXX_USE_CXX11_ABI)
PY

本机输出:

CUDA_HOME=/usr/local/cuda-12.8
CONDA_PREFIX=/home/hjadmin/miniconda3/envs/anygrasp
/usr/bin/gcc
/usr/bin/g++
gcc 12.3.0
PyTorch: 2.11.0+cu128
PyTorch CUDA: 12.8
CUDA_HOME detected: /usr/local/cuda-12.8
CXX11 ABI: True

10.3 CUDA 12.8 与 GCC 12 头文件兼容处理

先检查是否存在旧写法:

grep -n "__to_address(__r.get())" \
  /usr/include/c++/12/bits/shared_ptr_base.h \
  || echo "未发现需要修改的代码"

本机发现两处:

1561: auto __raw = __to_address(__r.get());
1577: auto __raw = __to_address(__r.get());

必须先备份:

sudo cp -a \
  /usr/include/c++/12/bits/shared_ptr_base.h \
  /usr/include/c++/12/bits/shared_ptr_base.h.anygrasp.bak

再修改:

sudo sed -i \
  's/\bauto __raw = __to_address(__r.get());/auto __raw = std::__to_address(__r.get());/g' \
  /usr/include/c++/12/bits/shared_ptr_base.h

验证:

grep -n "__raw =" \
  /usr/include/c++/12/bits/shared_ptr_base.h \
  | grep "to_address(__r.get())"

预期:

1561: auto __raw = std::__to_address(__r.get());
1577: auto __raw = std::__to_address(__r.get());

检查旧写法是否消失:

grep -nP '(?<!std::)__to_address\(__r\.get\(\)\)' \
  /usr/include/c++/12/bits/shared_ptr_base.h \
  || echo "旧写法已全部修改"

输出:

旧写法已全部修改

确认备份:

ls -l /usr/include/c++/12/bits/shared_ptr_base.h.anygrasp.bak

<aside>
⚠️

这一步会修改系统 C++ 头文件,只在确实检测到相同代码并完成备份后执行。GCC 版本不同,路径也不同,例如 GCC 11 对应 /usr/include/c++/11/

</aside>

10.4 编译安装

cd ~/anygrasp_sdk/dependencies/MinkowskiEngine

export CUDA_HOME=/usr/local/cuda-12.8
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:${LD_LIBRARY_PATH:-}
export TORCH_CUDA_ARCH_LIST="8.9"
export MAX_JOBS=4

rm -rf build

set -o pipefail
python setup.py install \
  --blas_include_dirs=${CONDA_PREFIX}/include \
  --blas_library_dirs=${CONDA_PREFIX}/lib \
  --blas=openblas \
  2>&1 | tee ~/minkowski_build.log

成功结束标志:

Finished processing dependencies for MinkowskiEngine==0.5.4

若失败,查看日志末尾:

tail -n 100 ~/minkowski_build.log

10.5 验证安装

先在源码目录中验证:

python - <<'PY'
import torch
import MinkowskiEngine as ME

print("MinkowskiEngine版本:", ME.__version__)
print("MinkowskiEngine路径:", ME.__file__)
print("PyTorch版本:", torch.__version__)
print("CUDA可用:", torch.cuda.is_available())
PY

输出:

MinkowskiEngine版本: 0.5.4
PyTorch版本: 2.11.0+cu128
CUDA可用: True

然后离开源码目录再次验证,排除“只导入了当前文件夹源码”的情况:

cd ~
python - <<'PY'
import torch
import MinkowskiEngine as ME

print("MinkowskiEngine版本:", ME.__version__)
print("MinkowskiEngine路径:", ME.__file__)
print("CUDA可用:", torch.cuda.is_available())
PY

本机最终路径:

/home/hjadmin/miniconda3/envs/anygrasp/lib/python3.11/site-packages/
MinkowskiEngine-0.5.4-py3.11-linux-x86_64.egg/...

出现 OMP_NUM_THREADS 未设置的警告不影响安装,后面统一配置。


十一、第八步:安装 AnyGrasp 基础依赖

cd ~/anygrasp_sdk
python -m pip install -r requirements.txt

验证:

python - <<'PY'
import numpy
import PIL
import scipy
import tqdm
import open3d

print("numpy:", numpy.__version__)
print("Pillow:", PIL.__version__)
print("scipy:", scipy.__version__)
print("tqdm:", tqdm.__version__)
print("open3d:", open3d.__version__)
print("基础依赖全部导入成功")
PY

本机输出:

numpy: 2.4.4
Pillow: 12.2.0
scipy: 1.17.1
tqdm: 4.70.0
open3d: 0.19.0
基础依赖全部导入成功

检查依赖完整性:

python -m pip check

输出:

No broken requirements found.

十二、第九步:编译 PointNet2 CUDA 扩展

cd ~/anygrasp_sdk/pointnet2

export CUDA_HOME=/usr/local/cuda-12.8
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:${LD_LIBRARY_PATH:-}
export TORCH_CUDA_ARCH_LIST="8.9"
export MAX_JOBS=4

rm -rf build

set -o pipefail
python setup.py install 2>&1 | tee ~/pointnet2_build.log

成功结束标志:

Installed .../pointnet2-0.0.0-py3.11-linux-x86_64.egg
Finished processing dependencies for pointnet2==0.0.0

验证:

cd ~
python - <<'PY'
import torch
import pointnet2
from pointnet2 import _ext

print("PointNet2路径:", pointnet2.__file__)
print("PointNet2 CUDA扩展:", _ext.__file__)
print("PyTorch:", torch.__version__)
print("CUDA可用:", torch.cuda.is_available())
print("PointNet2导入成功")
PY

本机输出:

PointNet2路径: .../pointnet2-0.0.0-py3.11-linux-x86_64.egg/pointnet2/__init__.py
PointNet2 CUDA扩展: .../_ext.cpython-311-x86_64-linux-gnu.so
PyTorch: 2.11.0+cu128
CUDA可用: True
PointNet2导入成功

十三、第十步:安装 graspnetAPI

cd ~/anygrasp_sdk
git clone <https://github.com/graspnet/graspnetAPI.git>
cd graspnetAPI
python -m pip install .

验证:

cd ~
python - <<'PY'
import graspnetAPI
from graspnetAPI import Grasp, GraspGroup

print("graspnetAPI 路径:", graspnetAPI.__file__)
print("Grasp 类:", Grasp)
print("GraspGroup 类:", GraspGroup)
print("graspnetAPI 导入成功")
PY

正常输出:

graspnetAPI 路径: .../site-packages/graspnetAPI/__init__.py
Grasp 类: <class 'graspnetAPI.grasp.Grasp'>
GraspGroup 类: <class 'graspnetAPI.grasp.GraspGroup'>
graspnetAPI 导入成功

再检查:

python -m pip check

输出:

No broken requirements found.

可能出现以下警告:

Failed to import geometry msgs
Failed to import ros dependencies
RigidTransform ros methods will be unavailable

这些只是 ROS 接口不可用,不影响普通 AnyGrasp 推理。


十四、第十一步:配置 Python 3.11 对应的 gsnet.so

14.1 检查可用文件

cd ~/anygrasp_sdk
find grasp_detection -maxdepth 2 \
  -type f -name '*cpython-311*.so' -print

本机输出:

grasp_detection/gsnet_versions/gsnet.cpython-311-x86_64-linux-gnu.so

Python 3.11 必须使用 cpython-311,不能混用 cpython-310cpython-312

14.2 复制到检测目录

cd ~/anygrasp_sdk/grasp_detection
cp gsnet_versions/gsnet.cpython-311-x86_64-linux-gnu.so gsnet.so
ls -lh gsnet.so

本机结果:

-rw-rw-r-- ... 1.8M ... gsnet.so

14.3 验证 SDK 接口

python - <<'PY'
import gsnet

print("gsnet路径:", gsnet.__file__)
print("gsnet导入成功")
print("create_detector:", hasattr(gsnet, "create_detector"))
print("check_license:", hasattr(gsnet, "check_license"))
PY

本机输出:

gsnet导入成功
create_detector: True
check_license: True

新版 SDK 使用 create_detector(),没有旧版 AnyGrasp 类并不表示安装失败。


十五、第十二步:获取 Feature ID 并申请许可证

15.1 准备注册目录

cd ~/anygrasp_sdk/license_registration
cp ../grasp_detection/gsnet_versions/\
gsnet.cpython-311-x86_64-linux-gnu.so gsnet.so

获取本机 Feature ID:

python -c "from gsnet import get_feature_id; print(get_feature_id())"

会输出一个以 N 开头的机器编号。该编号与本机绑定,用于许可证申请。

15.2 收到许可证后检查压缩包

本机收到的许可证压缩包中包含:

licenseCfg.json
*.lic
*.public_key
*.signature

只查看文件名:

unzip -l license_*.zip

15.3 解压并放置到检测目录

cd ~/anygrasp_sdk
mkdir -p license_extract
unzip -q license_*.zip -d license_extract
mkdir -p grasp_detection/license

找到解压后的许可证文件夹,并将其内部四个文件复制到:

~/anygrasp_sdk/grasp_detection/license/

最终结构:

grasp_detection/license/
├── licenseCfg.json
├── *.lic
├── *.public_key
└── *.signature

15.4 验证许可证

cd ~/anygrasp_sdk/grasp_detection
python - <<'PY'
from gsnet import check_license

print("开始验证 AnyGrasp 许可证...")
result = check_license("license")
print("check_license 返回值:", result)
PY

本机结果:

License passed: True, state: PASSED
check_license 返回值: True

十六、第十三步:放置模型权重

官方提供两个权重:

checkpoint_detection.tar   约 283 MB
checkpoint_tracking.tar    约 23 MB

检测 Demo 必需的是 checkpoint_detection.tar

16.1 检查文件类型和完整性

这两个 .tar 实际是 PyTorch ZIP 格式模型文件,不要使用 tar -xf 解压。

file checkpoint_detection.tar checkpoint_tracking.tar

会显示:

Zip archive data

使用 Python 检查 CRC:

python - <<'PY'
from pathlib import Path
import zipfile

for path in [
    Path("checkpoint_detection.tar"),
    Path("checkpoint_tracking.tar"),
]:
    with zipfile.ZipFile(path, "r") as zf:
        print(path, "内部文件数:", len(zf.namelist()))
        print("完整性:", "通过" if zf.testzip() is None else "失败")
PY

本机结果:

checkpoint_detection.tar 内部文件数: 416
完整性: 通过
checkpoint_tracking.tar 内部文件数: 375
完整性: 通过

16.2 复制检测权重

cd ~/anygrasp_sdk
mkdir -p grasp_detection/log
cp -a checkpoint_detection.tar \
  grasp_detection/log/checkpoint_detection.tar

检查:

ls -lh \
  checkpoint_detection.tar \
  grasp_detection/log/checkpoint_detection.tar

两者均约为:

283M

检查哈希:

sha256sum \
  checkpoint_detection.tar \
  grasp_detection/log/checkpoint_detection.tar

两行哈希必须完全一致。本机哈希:

a05c3690b95c8b65e78b1bb8a28f1d5ca96613391946e450afacae840bbcf7b2

十七、第十四步:解决 CXXABI_1.3.15 not found

17.1 问题现象

完整导入时曾出现:

ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6:
version `CXXABI_1.3.15' not found

原因不是缺少 Conda 的新库,而是程序优先加载了系统旧版 libstdc++.so.6

17.2 检查 Conda 与系统库

conda list | grep -E 'libstdcxx|libgcc|icu'
ls -l "$CONDA_PREFIX"/lib/libstdc++.so.6*

本机 Conda 环境中:

icu 78.3
libgcc 16.1.0
libstdcxx 16.1.0
libstdc++.so.6 -> libstdc++.so.6.0.35

检查支持的 ABI:

strings "$CONDA_PREFIX/lib/libstdc++.so.6" \
  | grep '^CXXABI_' | sort -V | tail

Conda 库支持到:

CXXABI_1.3.17

系统库只支持到:

CXXABI_1.3.13

17.3 临时修复

export LD_LIBRARY_PATH="$CONDA_PREFIX/lib:$CUDA_HOME/lib64"

验证:

echo "$LD_LIBRARY_PATH"

输出:

/home/hjadmin/miniconda3/envs/anygrasp/lib:/usr/local/cuda-12.8/lib64

完整导入测试随后通过。


十八、第十五步:永久保存 AnyGrasp 环境变量

创建 Conda 激活脚本:

mkdir -p "$CONDA_PREFIX/etc/conda/activate.d"

cat > "$CONDA_PREFIX/etc/conda/activate.d/anygrasp_cuda.sh" <<'EOF'
export CUDA_HOME=/usr/local/cuda-12.8
export PATH="$CUDA_HOME/bin:$PATH"

# Conda 新版 libstdc++ 必须放在 CUDA 和系统库之前
export LD_LIBRARY_PATH="$CONDA_PREFIX/lib:$CUDA_HOME/lib64"

# RTX 4090 的 CUDA 计算能力
export TORCH_CUDA_ARCH_LIST="8.9"

# MinkowskiEngine 建议低于 24
export OMP_NUM_THREADS=12
EOF

重新激活:

conda deactivate
conda activate anygrasp

检查:

echo "$CUDA_HOME"
which nvcc
echo "$LD_LIBRARY_PATH"
echo "$TORCH_CUDA_ARCH_LIST"
echo "$OMP_NUM_THREADS"

本机输出:

/usr/local/cuda-12.8
/usr/local/cuda-12.8/bin/nvcc
/home/hjadmin/miniconda3/envs/anygrasp/lib:/usr/local/cuda-12.8/lib64
8.9
12

以后每次执行:

conda activate anygrasp

这些变量都会自动生效。


十九、第十六步:完整环境验证

cd ~
python - <<'PY'
import sqlite3
print("sqlite3: OK")

import torch
print("PyTorch:", torch.__version__)
print("PyTorch CUDA:", torch.version.cuda)
print("CUDA可用:", torch.cuda.is_available())
print("GPU:", torch.cuda.get_device_name(0))

import MinkowskiEngine as ME
print("MinkowskiEngine:", ME.__version__)

import pointnet2
from pointnet2 import _ext
print("PointNet2:", _ext.__file__)

import open3d
print("Open3D:", open3d.__version__)

import graspnetAPI
from graspnetAPI import Grasp, GraspGroup
print("graspnetAPI:", graspnetAPI.__file__)

print("全部模块导入成功")
PY

本机输出:

sqlite3: OK
PyTorch: 2.11.0+cu128
PyTorch CUDA: 12.8
CUDA可用: True
GPU: NVIDIA GeForce RTX 4090
MinkowskiEngine: 0.5.4
PointNet2: .../_ext.cpython-311-x86_64-linux-gnu.so
Open3D: 0.19.0
graspnetAPI: .../site-packages/graspnetAPI/__init__.py
全部模块导入成功

ROS 相关警告可以忽略。


二十、第十七步:运行官方 Demo 验证环境

20.1 确认最终目录

anygrasp_sdk/
└── grasp_detection/
    ├── demo.py
    ├── gsnet.so
    ├── license/
    │   ├── licenseCfg.json
    │   ├── *.lic
    │   ├── *.public_key
    │   └── *.signature
    ├── log/
    │   └── checkpoint_detection.tar
    └── example_data/
        ├── color.png
        ├── depth.png
        └── seg_mask.png

20.2 无可视化运行

conda activate anygrasp
cd ~/anygrasp_sdk/grasp_detection

python demo.py \
  --checkpoint_path log/checkpoint_detection.tar

本机关键输出:

checking license on .../grasp_detection/gsnet.so
License passed: True, state: PASSED
Top 20 scores:
[0.6406076 0.55339277 0.48864532 ...]

官方 demo.py 会连续测试多种配置,因此会输出多组 Top 20 scores,这是正常现象。

20.3 可视化运行

python demo.py \
  --checkpoint_path log/checkpoint_detection.tar \
  --vis

验证结果:

  • Open3D 窗口正常打开;
  • 点云正常显示;
  • 抓取夹爪模型正常显示;
  • 多个官方示例窗口均能正常关闭和继续运行;
  • 终端无新的错误。

至此,AnyGrasp 环境、许可证、模型权重和官方 Demo 均已完整验证通过。


二十一、其他设备需要修改的位置

变化项 本教程值 需要修改的位置
CUDA Toolkit 12.8 CUDA_HOME、PyTorch 下载源、MinkowskiEngine 分支
CUDA 路径 /usr/local/cuda-12.8 所有 CUDA_HOME 和激活脚本
Python 3.11 Conda 创建命令、gsnet.cpython-311-...so
GPU RTX 4090 TORCH_CUDA_ARCH_LIST="8.9"
GCC 12 /usr/include/c++/12/bits/shared_ptr_base.h 路径
Conda 环境名 anygrasp 所有 conda activate 命令
内存或 CPU 较少 MAX_JOBS=4 编译失败或内存不足时降为 2

21.1 计算显卡架构

其他显卡执行:

python - <<'PY'
import torch
print(torch.cuda.get_device_capability(0))
PY

例如:

(8, 9) → TORCH_CUDA_ARCH_LIST="8.9"
(8, 6) → TORCH_CUDA_ARCH_LIST="8.6"

21.2 Python 版本与 gsnet.so

Python 应选择的文件标识
3.10 cpython-310
3.11 cpython-311
3.12 cpython-312

二进制版本不匹配时,通常会出现导入失败或符号错误。


二十二、常见问题

22.1 nvcc: command not found

先检查:

ls /usr/local/cuda-*/bin/nvcc

如果文件存在,只需配置 CUDA_HOMEPATH,不必重装 CUDA。

22.2 CXXABI_1.3.15 not found

将 Conda 环境的 lib 放在最前:

export LD_LIBRARY_PATH="$CONDA_PREFIX/lib:$CUDA_HOME/lib64"

并写入 Conda activate.d 脚本。

22.3 no kernel image is available for execution

通常是编译时未包含当前显卡架构。RTX 4090 使用:

export TORCH_CUDA_ARCH_LIST="8.9"

清理 build/ 后重新编译对应 CUDA 扩展。

22.4 编译内存不足

降低并行任务:

export MAX_JOBS=2

然后重新编译。

22.5 gsnet.so 导入失败

检查:

python --version
ls grasp_detection/gsnet_versions

确保 Python 3.11 使用 cpython-311 文件。

22.6 .tar 无法被 tar -tf 读取

AnyGrasp 模型权重虽然扩展名是 .tar,实际是 PyTorch ZIP 格式。不要解压,程序直接读取。可使用 zipfile.ZipFile 做完整性检查。

22.7 ROS 警告

以下警告不影响普通 AnyGrasp 推理:

Failed to import geometry msgs
Failed to import ros dependencies
RigidTransform ros methods will be unavailable

22.8 Open3D 窗口打不开

先不使用 --vis,确认无界面推理正常。若无桌面或通过纯 SSH 使用,Open3D 窗口可能无法显示。


二十三、最终检查清单

  • [x] RTX 4090 被 nvidia-smi 正确识别
  • [x] 驱动版本为 595.80
  • [x] CUDA Toolkit 12.8 与 NVCC 12.8.61 可用
  • [x] Python 3.11.15 独立 Conda 环境可用
  • [x] PyTorch 2.11.0+cu128 可调用 RTX 4090
  • [x] Ninja、CMake、GCC、Git 可用
  • [x] OpenBLAS 头文件与动态库存在
  • [x] MinkowskiEngine 0.5.4 编译并独立导入成功
  • [x] AnyGrasp 基础依赖安装成功
  • [x] PointNet2 CUDA 扩展编译成功
  • [x] graspnetAPI 1.2.11 安装成功
  • [x] Python 3.11 对应 gsnet.so 配置正确
  • [x] Conda 与 CUDA 动态库加载顺序已修复
  • [x] 许可证验证通过
  • [x] 检测权重完整并放置正确
  • [x] 官方无界面 Demo 推理成功
  • [x] Open3D 可视化 Demo 成功

最终状态:Ubuntu 22.04 + RTX 4090 + Python 3.11.15 + CUDA Toolkit 12.8 + PyTorch 2.11.0+cu128 的 AnyGrasp 环境已完整配置并验证通过。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐