Demonstração de Preensão Visual com reBot Arm B601-RS

Percepção de profundidade · Detecção de objetos · Calibração mão-olho · Preensão autônoma · Totalmente open source

Qual é a diferença entre os dois métodos de preensão?
Esta página cobre duas demonstrações de preensão visual com implementações diferentes. Compare os frameworks, os requisitos de calibração e os fluxos de inicialização e, em seguida, escolha um tutorial abaixo.
Python SDK + YOLO / OBB
Use YOLO, uma câmera de profundidade RGB-D e o SDK Python para o fluxo completo, da configuração do ambiente e da integração da câmera até a calibração mão-olho e a depuração da preensão.
- Lógica de preensão
- Estime poses de preensão a partir de caixas de detecção ou retângulos de área mínima OBB; opcionalmente, use o GraspNet para estimativa de pose 6D.
- Calibração mão-olho
- Conclua a calibração Eye-in-Hand com um marcador ArUco antes da primeira execução completa de preensão.
- Inicialização
- Execute scripts Python para verificar passo a passo a detecção, a estimativa de pose e a preensão robótica.
ROS 2 + YOLOE
Use ROS 2 e YOLOE para iniciar o braço, a câmera Gemini 2 / D405 / D435i e os nós de preensão em terminais separados para pegar e colocar objetos.
- Lógica de preensão
- O nó de preensão visual detecta, pega e coloca objetos. Os nomes de classe em texto especificam os alvos de preensão e de colocação.
- Calibração mão-olho
- Não é necessária uma placa de calibração; ajuste os parâmetros de deslocamento para compensar pequenas tolerâncias de montagem e das peças impressas.
- Inicialização
- Inicie o braço, a câmera e o nó de preensão em terminais separados e, em seguida, acione a pegada e a colocação.
Escolha um método de preensão
Alterne as abas para ver o tutorial do método escolhido e siga as etapas de instalação e execução.
- Método 1 · Python SDK / OBB
- Método 2 · ROS 2 / YOLOE
Método de Preensão Visual 1
Esta rota usa Python SDK + câmera RGB-D + YOLO / OBB sem um workspace ROS 2. A rota padrão é adequada para objetos comuns sobre a mesa; ative o módulo opcional GraspNet abaixo quando precisar de uma preensão 6D mais complexa.
1. Recursos do projeto
- Estimativa direta de pose de preensão a partir de YOLO + OBB O pipeline usa caixas de detecção ou retângulos de área mínima OBB diretamente e toma o eixo curto como direção de abertura do gripper, evitando o processamento complexo de nuvens de pontos 3D.
- Estimativa de pose de preensão 6D com GraspNet-Baseline (opcional)
O projeto também oferece suporte ao GraspNet-Baseline (
graspnet/graspnet-baseline) para estimativa de pose de preensão 6D a partir de nuvens de pontos RGB-D, com caixas delimitadoras do YOLO usadas para selecionar candidatos-alvo para experimentos de preensão mais complexos. - Integração do driver do braço robótico e do gripper
O script principal de preensão é baseado no braço robótico e no controlador de pose final de
reBotArm_control_py, com um auxiliar de preensão leve para abertura do gripper, preensão com controle de força e leitura da pose TCP. - Open source e extensível Todo o código-fonte é aberto, e os usuários podem personalizar algoritmos de controle e efeitos com base em suas próprias necessidades.
2. Especificações
O hardware para este tutorial é fornecido pela Seeed Studio
| Parâmetro | Especificação |
|---|---|
| Modelo do braço robótico | reBot Arm B601-RS |
| Graus de liberdade | 6-DOF + Gripper |
| Modelo da câmera | Orbbec Gemini 2 / RealSense D435i / D405 |
| Método de detecção | YOLO + retângulo de área mínima OBB |
| Método de comunicação | Barramento CAN via adaptador USB2CAN; conexão de câmera USB 3.0 |
| Tensão de operação | 48V DC |
| Plataforma host | PC com Ubuntu 22.04+ |
| Versão recomendada do Python | Python 3.10 |
3. Lista de materiais (BOM)
| Componente | Quantidade | Incluído |
|---|---|---|
| Braço robótico reBot Arm B601-RS | 1 | ✅ |
| Gripper | 1 | ✅ |
| Ponte serial USB2CAN | 1 | ✅ |
| Adaptador de energia (48V) | 1 | ✅ |
| Cabo USB-C / comunicação | 1 | ✅ |
| Câmera de profundidade RGB-D | 1 | ✅ |
| Conector da câmera / suporte de fixação | 1 | ✅ |
Fiação
- Conecte a câmera de profundidade ao host via USB 3.0.
- Conecte o adaptador USB2CAN ao barramento CAN do braço.
- Certifique-se de que a fonte de alimentação de 48V, a câmera e o braço robótico estejam todos conectados com segurança.
- Se encontrar problemas de permissão, execute:
sudo chmod a+rw /dev/bus/usb/*/*
sudo chmod 666 /dev/ttyUSB0
4. Requisitos de ambiente
| Item | Requisito |
|---|---|
| Sistema operacional | Ubuntu 22.04+ |
| Python | 3.10 |
5. Instalar o ambiente básico
Siga estas etapas em ordem. As etapas 0–3 são obrigatórias para a rota padrão; na etapa 4, escolha o SDK da câmera de acordo com o hardware. A instalação e a execução do GraspNet estão no módulo avançado separado abaixo.
Etapa 0. Conclua primeiro a preparação básica do braço robótico
Antes de iniciar este tutorial, conclua o conteúdo em reBot Arm B601-RS Quick Start, incluindo montagem do braço robótico, inicialização do ponto zero, configuração de ID dos motores e verificações básicas de conectividade.
Etapa 1. Clone o repositório
Dê preferência ao repositório oficial Seeed-Projects:
git clone https://github.com/Seeed-Projects/reBot-DevArm-Grasp.git rebot_grasp
cd rebot_grasp
Etapa 2. Crie e configure o ambiente conda
conda env create -f environment.yml -n rebotarm
conda activate rebotarm
O prompt do terminal mostra rebotarm, indicando que este ambiente está ativo e que as dependências seguintes serão instaladas nele.
Se quiser usar um nome de ambiente diferente, substitua rebotarm no comando pelo nome que preferir.
environment.yml instala o PyTorch automaticamente por meio das dependências de ultralytics / torchaudio. Se a instalação for interrompida por um problema de rede, o PyTorch pode ficar ausente em silêncio, e o erro só aparece ao executar main.py. Verifique-o logo após criar o ambiente:
python -c "import torch; print(torch.__version__, torch.__file__)"
- O caminho deve mostrar
.../miniforge3/envs/rebotarm/...(dentro do ambiente conda). Se ocorrerModuleNotFoundError, ou se o caminho apontar para~/.local/...(diretório do usuário), a instalação está incompleta ou no lugar errado. Execute:
pip install --force-reinstall torch torchvision
- Com uma GPU NVIDIA, confirme também que o CUDA está disponível:
python -c "import torch; print(torch.cuda.is_available())"
Etapa 3. Instale o SDK do braço robótico
git clone https://github.com/Seeed-Projects/reBotArm_control_py.git sdk/reBotArm_control_py
cd sdk/reBotArm_control_py
pip install -e .
cd ../..
Se pip install -e . relatar Multiple top-level packages discovered in a flat-layout, adicione descoberta explícita de pacotes em pyproject.toml em reBotArm_control_py e, em seguida, execute pip install -e . novamente:
[tool.setuptools.packages.find]
include = ["reBotArm_control_py*"]
As configurações B601 DM e RS são selecionadas por meio dos arquivos de configuração do SDK. Para o B601-RS, confirme o seguinte em sdk/reBotArm_control_py/config/rebotarm.yaml:
hardware_yaml: rebotarm_rs.yaml
Os programas de preensão visual leem essa configuração do SDK e selecionam automaticamente o modo de controle do braço e os parâmetros do gripper correspondentes.
Etapa 4. Instale o SDK da câmera de profundidade
Este projeto oferece suporte a câmeras de profundidade RGB-D como Orbbec Gemini 2 e RealSense D435i / D405. Instale o SDK que corresponde à sua câmera; se o seu ambiente já conseguir importar o driver da câmera, você pode pular esta etapa.
Orbbec Gemini 2
A câmera de profundidade Orbbec Gemini 2 depende de pyorbbecsdk, o wrapper Python para o Orbbec SDK v2. Dê preferência à instalação do pacote Python pré-compilado.
No Linux / Ubuntu, configure as regras udev antes de usar a câmera pela primeira vez, qualquer que seja o método de instalação escolhido. As regras permitem que usuários comuns acessem o dispositivo USB e são instaladas em todo o sistema, portanto cada máquina precisa desta configuração apenas uma vez. Ignore os comandos correspondentes se as regras já estiverem configuradas.
- Opção 1: Instalar com pip (recomendado)
- Opção 2: Obter pelo GitHub
pip install pyorbbecsdk2
Configurar as regras udev (Linux / Ubuntu)
O pyorbbecsdk2 2.1.0 e posterior inclui um script de configuração do ambiente. Mantenha o ambiente conda ativo e execute o script a partir do pacote instalado. Ele solicita permissão sudo e instala e recarrega as regras udev automaticamente.
orbbec_sdk_dir="$(python -c 'import os, pyorbbecsdk; print(os.path.dirname(pyorbbecsdk.__file__))')"
python "$orbbec_sdk_dir/shared/setup_env.py"
Se shared/setup_env.py não for encontrado, execute pip install --upgrade "pyorbbecsdk2>=2.1.0" e repita os comandos acima. Consulte o guia oficial de instalação da Orbbec para mais detalhes.
Mantenha o ambiente rebotarm ativo. Instale as dependências de compilação e, em seguida, compile a extensão Python:
sudo apt-get update
sudo apt-get install -y cmake build-essential libusb-1.0-0-dev python3-dev
cd sdk
git clone https://github.com/orbbec/pyorbbecsdk.git
cd pyorbbecsdk
git checkout v2-main
python -m pip install pybind11
mkdir -p build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release \
-DPython3_EXECUTABLE="$(python -c 'import sys; print(sys.executable)')" \
-Dpybind11_DIR="$(python -m pybind11 --cmakedir)"
cmake --build . --parallel "$(nproc)"
cmake --install .
cd ..
Usuários na China continental podem substituir o comando de clone do GitHub acima por:
git clone https://gitee.com/orbbecdeveloper/pyorbbecsdk.git
Após a compilação, confirme que install/lib contém pyorbbecsdk*.so e as bibliotecas compartilhadas da Orbbec (em install/lib/pyorbbecsdk/ nas versões mais recentes) e, em seguida, instale o pacote Python. Consulte o guia oficial de compilação do código-fonte da Orbbec para a configuração do CMake e do conda.
pip install -e .
Configurar as regras udev (Linux / Ubuntu)
Execute o seguinte a partir da raiz do repositório pyorbbecsdk clonado. As versões mais recentes usam o script de configuração do ambiente; as versões anteriores usam install_udev_rules.sh:
if [ -f scripts/env_setup/setup_env.py ]; then
python scripts/env_setup/setup_env.py
else
sudo bash scripts/install_udev_rules.sh
sudo udevadm control --reload-rules
sudo udevadm trigger
fi
Volte à raiz do projeto antes de continuar com a verificação e as etapas de execução:
cd ../..
Se os dois métodos de instalação falharem, consulte a documentação oficial da Orbbec abaixo.
Verificar instalação
python -c "import pyorbbecsdk; print('pyorbbecsdk OK')"
RealSense D435i / D405
As câmeras RealSense dependem de pyrealsense2. Normalmente você pode instalá-lo diretamente com pip:
pip install pyrealsense2
python -c "import pyrealsense2; print('pyrealsense2 OK')"
A D405 / D435i deve ser conectada a uma porta USB 3.0/3.2 (geralmente azul). Se for conectada a uma porta USB 2.0, o sintoma típico é: o sistema reconhece o dispositivo e pipeline.start() é bem-sucedido, mas os quadros nunca chegam (Frame didn't arrive within ...). Verifique a velocidade negociada com:
lsusb -t # a linha da câmera deve mostrar 5000M; 480M significa que caiu para uma porta USB 2.0 — troque de porta
Se o seu sistema precisar da cadeia de ferramentas completa do RealSense ou de regras udev, siga a documentação oficial do librealsense.
O comando de verificação correspondente imprime pyorbbecsdk OK ou pyrealsense2 OK sem um ModuleNotFoundError.
Resumo de recursos do SDK
| Recurso | Link |
|---|---|
| Página do produto Gemini 2 | https://www.orbbec.com.cn/index/Product/info.html?cate=38&id=51 |
| Recursos de desenvolvimento | https://www.orbbec.com.cn/index/Download2025/info.html?cate=121&id=1 |
| Orbbec SDK v2 | https://github.com/orbbec/OrbbecSDK_v2 |
| Documentação da API do SDK v2 | https://orbbec.github.io/docs/OrbbecSDKv2_API_User_Guide/ |
| pyorbbecsdk | https://github.com/orbbec/pyorbbecsdk |
| Documentação do pyorbbecsdk | https://orbbec.github.io/pyorbbecsdk/index.html |
| Wrapper ROS2 | https://github.com/orbbec/OrbbecSDK_ROS2/tree/v2-main |
| RealSense SDK | https://github.com/realsenseai/librealsense |
6. Estrutura de diretórios
rebot_grasp/
├── config/
│ ├── default.yaml # Main configuration file
│ └── calibration/
│ └── <camera_type>/
│ ├── intrinsics.npz # Camera intrinsics
│ └── hand_eye.npz # Hand-eye calibration results
├── drivers/
│ ├── camera/
│ │ ├── base.py # Camera abstract base class
│ │ ├── orbbec_gemini2.py # Gemini 2 driver
│ │ └── realsense.py # RealSense driver (alternative)
│ └── robot/
│ └── grasp_driver.py # Lightweight grasp helper based on arm SDK
├── calibration/
│ ├── aruco_pose.py # ArUco pose estimation
│ └── hand_eye.py # Hand-eye calibration solver
├── utils/
│ ├── ordinary_grasp.py # OBB grasp pose estimation and visualization
│ └── transforms.py # Coordinate transformation utilities
├── scripts/
│ ├── main.py # Main grasping program
│ ├── set.py # Grasp and place program
│ ├── ordinary_grasp_pipeline.py
│ ├── object_detection.py
│ └── collect_handeye_eih.py
├── sdk/
│ ├── pyorbbecsdk/ # Orbbec SDK Python wrapper (source installation)
│ └── reBotArm_control_py/ # reBot Arm SDK
└── environment.yml # Recommended conda environment file
7. Calibração mão-olho
Antes de executar o pipeline completo de preensão, conclua primeiro a calibração mão-olho Eye-in-Hand.
Antes de executar o script de calibração, inicie e verifique a interface CAN:
sudo ip link set can0 down 2>/dev/null
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up
ip -details link show can0
Antes de executá-lo, certifique-se de que o seguinte parâmetro de tamanho do ArUco em config/default.yaml corresponda ao marcador impresso real:
calibration:
aruco:
marker_length_m: 0.1
Depois de confirmar a configuração, execute a calibração automática:
python scripts/collect_handeye_eih.py
No modo automático, o braço percorre 50 poses predefinidas e registra uma amostra sempre que o marcador ArUco é detectado de forma estável. Mesmo que você interrompa o processo com c ou q, o script ainda tenta calcular o resultado da calibração a partir das amostras coletadas.
Se você quiser mover o braço robótico manualmente durante a coleta, use o modo manual:
python scripts/collect_handeye_eih.py --manual
No modo manual, o braço entra em modo de compensação de gravidade. Mova o efetuador final para um ângulo de visão adequado, pressione Enter para capturar e pressione c ou q para finalizar e calcular o resultado.
Se, após a calibração, você achar que a precisão de preensão do braço robótico não atende aos seus requisitos, você pode definir os parâmetros X (frente-trás), Y (esquerda-direita), Z (cima-baixo) em config/default.yaml sob calibration.hand_eye_compensation_m para fornecer compensação de posição.
O resultado da calibração é salvo em:
config/calibration/<camera_type>/hand_eye.npz
A contagem de amostras recomendada é de pelo menos 5 amostras, sendo 15 ou mais recomendado.
8. Execução e depuração
Verifique os cenários nesta ordem: os dois primeiros não se conectam ao braço robótico e ajudam a conferir a câmera, a detecção e a estimativa de preensão. Os dois seguintes se conectam ao braço robótico e o controlam.
1. Verificar apenas a detecção de objetos
python scripts/object_detection.py
Se você precisar alterar o modelo ou as classes de detecção, modifique config/default.yaml:
yolo:
model_name: "yoloe-26l-seg.pt"
device: "cpu"
use_world: true
custom_classes:
- "yellow banana"
- "water bottle"
- "cup"
Esta etapa é útil para confirmar:
- A câmera abre corretamente
- O modelo YOLO é carregado corretamente
- A detecção de objetos com YOLO funciona como esperado
2. Verificar apenas a estimativa de preensão
python scripts/ordinary_grasp_pipeline.py
Se você precisar ajustar a frequência de inferência de preensão ou a distância de recuo pré-preensão, modifique:
grasp_pipeline:
infer_every_live: 3
grasp:
depth_quantile: 0.5
pregrasp_offset_m: 0.080
insertion_depth_m: 0.015
min_base_z_m: 0.00
Este script não se conecta ao braço robótico. Ele é usado apenas para verificar:
- Se o OBB ou o retângulo de área mínima é razoável
- Se o ponto de preensão está próximo da área central do alvo
- Se a direção do eixo curto corresponde à direção esperada de abertura do gripper
Controles principais:
- Botão esquerdo do mouse: inspecionar a profundidade no pixel selecionado
G: imprimir a pose de preensão atual considerada melhorQ/Esc: sair
3. Executar o programa principal de preensão
python scripts/main.py
Para validar a pose alvo ignorando o movimento de preensão:
python scripts/main.py --dry-run
Verifique a pose e o espaço de trabalho com --dry-run antes de executar uma preensão real. Neste modo, o script atual ainda inicializa o braço, move-se para a pose de prontidão e faz a limpeza e o retorno à posição inicial ao sair. Para verificação apenas da visão, use os dois primeiros scripts, que não se conectam ao braço.
Fluxo principal do programa:
- Inicializar a câmera RGB-D e confirmar que o fluxo de imagem está disponível.
- Habilitar o braço robótico e o gripper.
- Mover para a pose de prontidão. Se você quiser alterar a pose inicial de prontidão, modifique
config/default.yaml:
robot:
ready_pose:
x: 0.3
y: 0.0
z: 0.3
roll: 0.0
pitch: 0.7
duration: 3.0
- Detectar alvos sobre a mesa em tempo real.
- Estimar a pose de preensão a partir do eixo curto.
- Pressione
Gpara capturar o quadro atual e executar a preensão.
Teclas em tempo de execução:
G: agarrar o melhor alvo atualR: retomar a visualização ao vivoQ/Esc: sair
4. scripts/set.py — Programa de pegar e colocar
Função: pegar a banana e colocá-la na caixa.
python scripts/set.py
Fluxo concluído:
- Inicialização da câmera e do braço, mover para a posição de prontidão
- Visualização em tempo real da câmera + detecção de objetos YOLO e segmentação de instâncias
- Pressione
Gpara congelar o quadro, calcular a pose alvo do braço via transformação mão-olho - O braço se move para agarrar a banana e erguer
- O braço coloca a banana na caixa e retorna à pose inicial
- Pressione
Qpara sair do sistema, o braço retorna à posição zero
9. Módulo avançado GraspNet (opcional)
A rota padrão Python SDK / OBB não exige o GraspNet. Siga estas etapas somente quando precisar estimar poses de preensão 6D a partir de nuvens de pontos RGB-D.
Etapa 1. Instalar o GraspNet e os operadores CUDA
Você não precisa do GraspNet para scripts/main.py ou scripts/ordinary_grasp_pipeline.py. Configure-o apenas quando quiser executar scripts/graspnet_camera_demo.py ou scripts/grasp.py, que exigem GraspNet, PyTorch com suporte a CUDA, os operadores CUDA PointNet2/knn e um checkpoint pré-treinado.
Ao configurar este ambiente pela primeira vez, a entrada torchaudio em environment.yml normalmente instala o PyTorch junto com ela. Se estiver ausente (ou se apenas a compilação para CPU tiver sido instalada), siga as etapas abaixo para instalar e verificar explicitamente um PyTorch com CUDA. As extensões pointnet2 / knn do GraspNet dependem do PyTorch e de um compilador CUDA com a versão correspondente — conclua todas as etapas antes de compilar.
Etapa 1: Confirme sua GPU
nvidia-smi
Continue apenas se uma GPU NVIDIA estiver listada. Sem uma GPU NVIDIA, você só pode usar a compilação de PyTorch para CPU, e os operadores CUDA do GraspNet não podem ser compilados nem executados.
Etapa 2: Verifique / instale o PyTorch
Primeiro verifique se o PyTorch já existe no ambiente atual:
python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())"
- Se estiver instalado e
torch.cuda.is_available()imprimirTrue, pule a instalação e vá para a Etapa 3. - Se ocorrer
ModuleNotFoundError(não instalado), ou setorch.version.cudaforNone(foi instalada a compilação para CPU), instale a compilação CUDA conforme mostrado abaixo. Use CUDA 13.0 como exemplo:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu130
Escolha a versão CUDA em --index-url de acordo com a sua GPU:
| GPU | Compilação CUDA do PyTorch recomendada |
|---|---|
| Série RTX 50 (Blackwell, p. ex. RTX 5070 / 5090) | cu128 ou mais recente (p. ex. cu130) |
| Séries RTX 40 / 30 (Ada / Ampere) | cu121 ou cu118 |
| Sem GPU NVIDIA | cpu (somente CPU; o GraspNet não será executado) |
Etapa 3: Instale o compilador CUDA correspondente ao seu PyTorch
pointnet2 / knn são extensões CUDA locais: a versão CUDA relatada por nvcc --version deve corresponder a torch.version.cuda durante a compilação; caso contrário, a compilação falha com The detected CUDA version (...) mismatches the version that was used to compile PyTorch (...). Verifique primeiro as duas versões:
nvcc --version
python -c "import torch; print(torch.version.cuda)"
Use como exemplo torch.version.cuda exibindo 13.0 e instale o compilador correspondente dentro do ambiente conda:
conda install -c nvidia cuda-nvcc=13.0 cuda-cudart-dev=13.0
which nvcc # deve apontar para $CONDA_PREFIX/bin/nvcc, não para /usr/bin/nvcc
nvcc --version # deve corresponder a torch.version.cuda
cuda-nvcc fornece o compilador e cuda-cudart-dev fornece os cabeçalhos CUDA em targets/x86_64-linux/include; ambos são necessários. Depois que o ambiente conda é ativado, $CONDA_PREFIX/bin precede os caminhos do sistema, de modo que o nvcc do conda encobre automaticamente o nvcc antigo do sistema (por exemplo, CUDA 11.5 dos repositórios do Ubuntu). Não é necessário desinstalar o CUDA do sistema.
Não faça downgrade do PyTorch para corresponder a um nvcc antigo do sistema: versões antigas do CUDA podem não oferecer suporte à arquitetura da sua GPU (o CUDA 11.5 oferece suporte no máximo a sm_86; a série RTX 40 exige CUDA 11.8 ou posterior e a série RTX 50 exige CUDA 12.8 ou posterior), e compilações antigas do PyTorch podem ser incompatíveis com outras dependências do projeto, como versões recentes do ultralytics.
Etapa 4: Verifique
python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())"
nvcc --version
Quando as duas versões CUDA corresponderem e torch.cuda.is_available() imprimir True, a configuração do PyTorch está concluída e você pode continuar compilando os operadores CUDA.
cd sdk
git clone https://github.com/graspnet/graspnet-baseline.git
cd graspnet-baseline
# Install PyTorch for your CUDA version first, then install GraspNet runtime dependencies
pip install open3d tensorboard Pillow tqdm
# Configure CUDA build paths before building the local operators.
# Observação: use o diretório targets do cuda-toolkit do conda para os cabeçalhos e as bibliotecas.
# Não misture o diretório nvidia/cu13 do pip (uma incompatibilidade de versão com o nvcc do conda causa erros de compilação).
export CUDA_HOME=$CONDA_PREFIX
export TORCH_CUDA_ARCH_LIST="12.0"
export CPATH=$CONDA_PREFIX/targets/x86_64-linux/include:$CPATH
export CPLUS_INCLUDE_PATH=$CONDA_PREFIX/targets/x86_64-linux/include:$CPLUS_INCLUDE_PATH
export LIBRARY_PATH=$CONDA_PREFIX/targets/x86_64-linux/lib:$CONDA_PREFIX/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=$CONDA_PREFIX/targets/x86_64-linux/lib:$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
# Build CUDA operators
cd pointnet2
pip install . --no-build-isolation
cd ../knn
pip install . --no-build-isolation
cd ..
# Install GraspNet API
git clone https://github.com/graspnet/graspnetAPI.git
cd graspnetAPI
sed -i "s/'sklearn'/'scikit-learn'/" setup.py
pip install .
cd ../../..
Observação: Se você seguir a documentação do repositório oficial graspnet-baseline e usar python setup.py install, podem ocorrer erros relacionados ao CUDA / PyTorch. Recomendamos usar pip install . --no-build-isolation para que a extensão seja compilada com a configuração de PyTorch e CUDA já instalada no ambiente conda ativo.
Se a compilação falhar com fatal error: cusparse.h: No such file or directory, execute find $CONDA_PREFIX -name cusparse.h e certifique-se de que o diretório que contém cusparse.h esteja incluído em CPATH / CPLUS_INCLUDE_PATH (com o cuda-toolkit do conda, isso geralmente é $CONDA_PREFIX/targets/x86_64-linux/include). Se ocorrerem erros de cabeçalhos como '__NV_IS_DEVICE' was not declared in this scope, eles geralmente são causados pela mistura dos cabeçalhos nvidia/cu13 do pip com a versão do nvcc do conda — mude para os caminhos targets do conda acima e compile novamente.
Além disso, dependências mais antigas da GraspNet API ainda podem usar o nome de pacote obsoleto sklearn. O comando sed o substitui pelo nome de pacote atualmente recomendado scikit-learn para evitar The 'sklearn' PyPI package is deprecated durante a instalação. A menos que você também atualize as dependências mais antigas da GraspNet API, mantenha a restrição numpy==1.23.4 porque transforms3d==0.3.1 ainda usa aliases antigos do NumPy como np.float.
Configurar modelo pré-treinado
Baixe os pesos oficiais pré-treinados da GraspNet a partir do repositório oficial graspnet-baseline Google, Baidu, depois coloque checkpoint-rs.tar em:
mkdir -p ~/rebot_grasp/sdk/graspnet-baseline/checkpoints
sdk/graspnet-baseline/checkpoints/checkpoint-rs.tar
Em seguida, verifique em config/default.yaml:
graspnet:
checkpoint: "checkpoint-rs.tar"
O campo checkpoint suporta três formas: um nome de arquivo é resolvido em sdk/graspnet-baseline/checkpoints/; um caminho relativo é resolvido a partir da raiz do projeto; um caminho absoluto é usado diretamente.
Etapa 2. Executar a demonstração de estimativa de câmera do GraspNet
python scripts/graspnet_camera_demo.py
Este script executa a estimativa de pose de preensão 6D da GraspNet usando apenas a câmera RGB-D, sem conectar ao braço robótico. Ele mantém uma visualização ao vivo da câmera, usa caixas delimitadoras do YOLO para selecionar a área alvo e filtra candidatos de cena completa viáveis da GraspNet pela bbox do alvo.
Controles principais:
G/Space: executar inferência GraspNet no quadro atualR: retomar a visualização ao vivoQ/Esc: sair
Após a inferência, o Open3D pode visualizar a nuvem de pontos e os candidatos de preensão.
Etapa 3. Executar o programa de preensão robótica do GraspNet
python scripts/grasp.py
python scripts/grasp.py --dry-run
python scripts/grasp.py --target-class "light blue coffee cup"
Este script conecta a estimativa da GraspNet ao fluxo de execução do braço robótico. O YOLO seleciona o alvo, a GraspNet gera uma pose de preensão 6D, a calibração mão-olho a transforma para o referencial da base do robô, e o script verifica a alcançabilidade de IK antes de executar a sequência de movimentos de pré-preensão, preensão e recuo.
Executar python scripts/grasp.py inicia todo o fluxo de preensão robótica do GraspNet e controla o braço robótico. --dry-run imprime a pose alvo e o resultado da filtragem de candidatos e ignora o movimento de preensão; o script atual ainda inicializa o braço, move-se para a pose de prontidão e faz a limpeza e o retorno à posição inicial ao sair. --target-class "light blue coffee cup" especifica a classe alvo do YOLO e apenas filtra e realiza a preensão dos candidatos do GraspNet para essa classe.
10. FAQ
1. ModuleNotFoundError: No module named 'motorbridge'
Isso geralmente significa que as dependências do SDK do braço robótico não estão instaladas no ambiente Python atual. Verifique:
conda activate rebotarm
conda env update -n rebotarm -f environment.yml
cd sdk/reBotArm_control_py && pip install -e .
2. Pressionar G não executa a preensão
Causas comuns:
hand_eye.npznão existe- O modo de calibração mão-olho não é
eye_in_hand - A pose alvo não é alcançável pelo IK
Recomenda-se executar:
python scripts/main.py --dry-run
3. A profundidade de preensão é instável
Você pode tentar ajustar:
grasp_pipeline.grasp.depth_quantile- A altura de instalação da câmera em relação à área de trabalho
- As propriedades reflexivas da superfície alvo
4. O GraspNet informa que pointnet2_utils não pode ser importado de pointnet2
Isso geralmente significa que a extensão CUDA local em sdk/graspnet-baseline/pointnet2 não foi compilada no ambiente conda ativo, ou que o Python está resolvendo um pacote pointnet2 diferente. Certifique-se de que o ambiente do projeto esteja ativo e, em seguida, reconstrua pointnet2 e knn nesse mesmo ambiente:
conda activate rebotarm
cd sdk/graspnet-baseline/pointnet2
pip install . --no-build-isolation
cd ../knn
pip install . --no-build-isolation
Verifique (pointnet2_utils / knn_modules são importados como módulos de nível superior a partir dos diretórios de código-fonte, que também é a forma como models/ os importa; os scripts de preensão adicionam automaticamente os diretórios de código-fonte a sys.path):
cd sdk/graspnet-baseline
python -c "import sys; sys.path[:0]=['pointnet2','knn']; import pointnet2_utils, knn_modules; print('import works')"
5. Problemas de compatibilidade de arquitetura CUDA em GPUs mais recentes ao executar o GraspNet
Se você vir no kernel image is available for execution on the device, ou se o PyTorch informar que a capacidade CUDA da GPU atual não é suportada, é provável que o wheel do PyTorch instalado não inclua kernels CUDA para essa arquitetura de GPU. Instale uma compilação do PyTorch que suporte sua arquitetura atual de CUDA/GPU e, em seguida, reconstrua as extensões CUDA locais do GraspNet.
python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.get_device_name(0))"
cd sdk/graspnet-baseline/pointnet2
pip install . --no-build-isolation
cd ../knn
pip install . --no-build-isolation
Se você precisar especificar manualmente a arquitetura de compilação, defina TORCH_CUDA_ARCH_LIST antes de recompilar. Escolha o valor de acordo com a arquitetura da sua GPU e a versão do PyTorch/CUDA.
6. A inferência do GraspNet informa RuntimeError: CPU not supported
Os operadores de amostragem em pointnet2 só suportam tensores CUDA. Confirme que o CUDA está disponível, que a rede GraspNet e a nuvem de pontos de entrada estão na GPU, e que pointnet2 / knn foram compilados com a versão do PyTorch no ambiente ativo.
python -c "import torch; print(torch.cuda.is_available())"
Se a saída for False, corrija primeiro a instalação do CUDA / PyTorch. Se for True mas o erro permanecer, reconstrua pointnet2 e knn.
Método de Preensão Visual 2
1. Visão Geral do Projeto
Esta solução usa ROS2 e YOLO no reBot Arm B601-RS para detecção, preensão e posicionamento de objetos. O sistema inicia o braço, a câmera de profundidade e os nós de preensão em terminais separados.
A câmera de profundidade atualmente oferece suporte a Orbbec Gemini 2 e RealSense D405 / D435i. Este fluxo de trabalho não requer uma placa de calibração para calibração mão-olho. Devido às tolerâncias de montagem e das peças impressas, cada braço pode apresentar um pequeno desvio na preensão.
2. Configuração do Ambiente
Etapa 1. Instalar o workspace ROS2 do braço robótico
Primeiro conclua a instalação e compilação do workspace rebotarm_ros2 seguindo reBot Arm B601-RS ROS2 Integration.
Etapa 2. Instalar a câmera
Escolha uma das configurações de câmera abaixo e expanda a seção correspondente. Clone o Orbbec ROS2 SDK no workspace e mude para o branch Compile o workspace: Instale as regras udev: Se um proxy estiver habilitado, desative-o antes de configurar novamente:Clique para expandir a configuração do Gemini 2
v2-main:cd ~/rebotarm_ros2/src
git clone https://github.com/xiehuangbao888/OrbbecSDK_ROS2.git
cd OrbbecSDK_ROS2
git checkout v2-maincd ~/rebotarm_ros2
colcon build --event-handlers console_direct+ --cmake-args -DCMAKE_BUILD_TYPE=Releasecd ~/rebotarm_ros2/src/OrbbecSDK_ROS2/orbbec_camera/scripts
sudo bash install_udev_rules.sh
sudo udevadm control --reload-rules && sudo udevadm triggerClique para expandir os passos de instalação do D405 / D435i
v2.58.1:cd ~
git clone https://github.com/realsenseai/librealsense.git
cd librealsense
git checkout v2.58.1
sudo apt install -y v4l-utils
cd ~/librealsense
./scripts/setup_udev_rules.sh
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXYcd ~/librealsense
mkdir -p build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install
sudo ldconfig
cd ~/rebotarm_ros2/src
git clone https://github.com/xiehuangbao888/realsense-ros.git
cd ~/rebotarm_ros2
colcon build --cmake-args -DUSE_LIFECYCLE_NODE=OFF
Etapa 3. Importar o pacote de preensão visual
cd ~/rebotarm_ros2/src/
git clone https://github.com/xiehuangbao888/rebot_visual_grasp.git
cd ~/rebotarm_ros2
colcon build --symlink-install
Etapa 4. Instalar o ambiente YOLO / YOLOE
grasp_yolo chama o Ultralytics YOLOE a partir do Python. Use um ambiente conda dedicado e não use o /usr/bin/python3 do sistema.
Criar o ambiente
conda create -n yolo python=3.10
conda activate yolo
pip install -U ultralytics
pip install "numpy==1.26.4" transforms3d
# YOLOE open-vocabulary classes require the Ultralytics CLIP package, not the PyPI clip package
pip install git+https://github.com/ultralytics/CLIP.git
Se você tiver uma GPU NVIDIA, primeiro confirme que o CUDA está disponível. Se a saída for False, instale uma compilação correspondente de CUDA / PyTorch. Você também pode continuar usando a CPU, mas a taxa de quadros de detecção será menor:
python -c "import torch; print(torch.cuda.is_available())"
Verifique o YOLOE:
python -c "from ultralytics import YOLOE; print('YOLOE OK')"
Baixar pesos para ~/rebot_visual_model
mkdir -p ~/rebot_visual_model && cd ~/rebot_visual_model
# MobileCLIP (required by YOLOE set_classes, about 242MB)
wget -c https://github.com/ultralytics/assets/releases/download/v8.4.0/mobileclip2_b.ts
# YOLOE segmentation weights can also download on first run; placing them here is recommended
wget -c https://github.com/ultralytics/assets/releases/download/v8.4.0/yoloe-26s-seg.pt
Etapa 5. Compilar o workspace
cd ~/rebotarm_ros2
source /opt/ros/humble/setup.bash
colcon build --symlink-install
source ~/rebotarm_ros2/install/setup.bash
O ambiente de preensão visual agora está pronto. Em todo novo terminal, faça o source do seguinte antes de executar comandos de preensão visual:
source /opt/ros/humble/setup.bash
source ~/rebotarm_ros2/install/setup.bash
3. Executar o Projeto
Antes de começar, confirme que o braço está ligado, que a interface CAN é can0 e que o Gemini 2, D405 ou D435i está conectado via USB. Em seguida, ative o CAN:
sudo ip link set can0 down 2>/dev/null
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up
Inicie a pilha em terminais separados para que a lógica de preensão seja mais fácil de acompanhar. Gemini 2, D405 e D435i usam comandos de lançamento diferentes; escolha aqueles para a sua câmera. Se quiser um lançamento com um clique, você pode escrever seu próprio script de inicialização.
Terminal A — Iniciar o braço + RViz
Clique para expandir Gemini 2
source /opt/ros/humble/setup.bash
source ~/rebotarm_ros2/install/setup.bash
ros2 launch rebot_visual_grasp bringup_with_camera.launch.py model:=rs channel:=can0 use_rviz:=true
Clique para expandir D405
source /opt/ros/humble/setup.bash
source ~/rebotarm_ros2/install/setup.bash
ros2 launch rebot_visual_grasp bringup_with_d405.launch.py model:=rs channel:=can0 use_rviz:=true
Clique para expandir D435i
source /opt/ros/humble/setup.bash
source ~/rebotarm_ros2/install/setup.bash
ros2 launch rebot_visual_grasp bringup_with_d435i.launch.py model:=rs channel:=can0 use_rviz:=true
Terminal B — Iniciar a câmera
Clique para expandir Gemini 2
source /opt/ros/humble/setup.bash
ros2 launch orbbec_camera gemini2.launch.py
Clique para expandir D405
source /opt/ros/humble/setup.bash
source ~/rebotarm_ros2/install/setup.bash
ros2 launch realsense2_camera rs_launch.py \
align_depth.enable:=true \
depth_module.depth_profile:=640x360x30 \
depth_module.color_profile:=640x360x30
Clique para expandir D435i
source /opt/ros/humble/setup.bash
source ~/rebotarm_ros2/install/setup.bash
ros2 launch realsense2_camera rs_launch.py \
align_depth.enable:=true \
depth_module.depth_profile:=640x360x30 \
depth_module.color_profile:=640x360x30
Terminal C — Mover para a pose de observação + detecção YOLO
Ative primeiro o seu ambiente conda com Altere o caminho do Python para o ambiente YOLO que você criou. Altere o caminho do Python para o ambiente YOLO que você criou. Altere o caminho do Python para o ambiente YOLO que você criou.conda activate yolo. Se o nome do ambiente não for yolo, substitua-o pelo nome real do seu ambiente conda.Clique para expandir Gemini 2
source /opt/ros/humble/setup.bash
source ~/rebotarm_ros2/install/setup.bash
~/miniconda3/envs/yolov8/bin/python -m rebot_visual_grasp.grasp_yolo --ros-args \
-p yolo_model:=~/rebot_visual_model/yoloe-26s-seg.pt \
-p target_class:="cube" \
-p place_class:="box" \
-p yolo_device:=gpu \
-p grasp_z_offset_m:=0.01 \
-p place_z_offset_m:=0.1 \
-p grasp_x_offset_m:=-0.02 \
-p grasp_y_offset_m:=0.002 \
-p move_to_observation_on_start:=true \
-p auto_publish_on_detect:=trueClique para expandir D405
source /opt/ros/humble/setup.bash
source ~/rebotarm_ros2/install/setup.bash
~/miniconda3/envs/yolov8/bin/python -m rebot_visual_grasp.grasp_yolo --ros-args \
-p yolo_model:=/home/ubuntu/rebot_visual_model/yoloe-26s-seg.pt \
-p color_topic:=/camera/camera/color/image_raw \
-p depth_topic:=/camera/camera/aligned_depth_to_color/image_raw \
-p color_info_topic:=/camera/camera/color/camera_info \
-p optical_frame:=camera_color_optical_frame \
-p target_class:=cube \
-p place_class:=box \
-p yolo_device:=gpu \
-p grasp_z_offset_m:=0.01 \
-p grasp_y_offset_m:=-0.005 \
-p place_z_offset_m:=0.1 \
-p grasp_x_offset_m:=-0.01 \
-p move_to_observation_on_start:=true \
-p auto_publish_on_detect:=trueClique para expandir D435i
source /opt/ros/humble/setup.bash
source ~/rebotarm_ros2/install/setup.bash
~/miniconda3/envs/yolov8/bin/python -m rebot_visual_grasp.grasp_yolo --ros-args \
-p yolo_model:=~/rebot_visual_model/yoloe-26s-seg.pt \
-p color_topic:=/camera/camera/color/image_raw \
-p depth_topic:=/camera/camera/aligned_depth_to_color/image_raw \
-p color_info_topic:=/camera/camera/color/camera_info \
-p optical_frame:=camera_color_optical_frame \
-p target_class:="cube" \
-p place_class:="box" \
-p yolo_device:=gpu \
-p grasp_z_offset_m:=0.01 \
-p place_z_offset_m:=0.1 \
-p grasp_y_offset_m:=0.01 \
-p grasp_x_offset_m:=-0.04 \
-p move_to_observation_on_start:=true \
-p auto_publish_on_detect:=true
| Parâmetro | Descrição |
|---|---|
yolo_device:=gpu | Usar a GPU; defina como cpu se você não tiver uma GPU dedicada. Você também pode usar yolo_device:=0 para a GPU 0 |
target_class | Nome de classe de texto YOLOE do objeto a ser agarrado; altere para corresponder ao objeto real. Suporta as classes padrão do YOLO |
place_class | Nome de classe de texto YOLOE do alvo de colocação; altere para corresponder ao objeto real. Suporta as classes padrão do YOLO |
grasp_x_offset_m | Deslocamento para frente/trás em base_link; um valor negativo puxa a pose para trás |
grasp_y_offset_m | Deslocamento de preensão esquerda/direita. 0.01 desloca 1 cm para a esquerda; um valor negativo desloca para a direita |
grasp_z_offset_m | Ajuste fino da altura de preensão. O padrão é para o gripper flexível, que é mais longo que o gripper padrão |
place_z_offset_m | Elevação extra usada ao colocar, para controlar a que altura o objeto é liberado acima do ponto de colocação |
Terminal D — Agarrar e colocar com um clique
O atraso de disparo padrão é de 3 segundos.
source /opt/ros/humble/setup.bash
source ~/rebotarm_ros2/install/setup.bash
ros2 launch rebot_visual_grasp grasp_go.launch.py
Para alterar o atraso, adicione um parâmetro. Por exemplo, disparar após 5 segundos:
ros2 launch rebot_visual_grasp grasp_go.launch.py trigger_delay_s:=5.0
Terminal E — Retornar para a posição inicial (opcional)
Na compilação mais recente do rebotarm, pressionar Ctrl + C no terminal faz o braço retornar automaticamente para a posição inicial. Para retorná-lo manualmente:
source /opt/ros/humble/setup.bash
source ~/rebotarm_ros2/install/setup.bash
ros2 service call /rebotarm/safe_home std_srvs/srv/Trigger {}
Contato
- Suporte técnico: Submit an Issue
- Página do projeto: GitHub
- Fórum: Seeed Studio Forum
Referências
- reBot Arm B601-RS Quick Start
- reBot Arm B601-RS ROS2 Integration
- rebot_visual_grasp
- OrbbecSDK_ROS2
- Orbbec Gemini 2 Product Page
- Orbbec Development Resources
- Orbbec SDK v2
- Orbbec SDK v2 API Guide
- pyorbbecsdk Repository
- pyorbbecsdk Documentation
- Orbbec ROS2 Wrapper
- realsense-ros
- RealSense SDK
- graspnet/graspnet-baseline
- Graspnet(Anygrasp) Docs