メインコンテンツまでスキップ

reBot Arm B601-DM GraspNet ビジュアル把持 on Jetson

このWikiでは、NVIDIA Jetson 上で reBot Arm B601-DM ビジュアル把持デモ をデプロイする方法を説明します。このデモは、RGB-D カメラ、YOLO インスタンスセグメンテーション、GraspNet 6自由度把持姿勢推定、アイインハンドキャリブレーション、実機ロボット制御を組み合わせ、アームがテーブル上の一般的な物体を選択して把持できるようにします。

本ガイドのバージョン 1.0 では、信頼性の高い単一 Jetson デプロイと日常運用フローに焦点を当てています。デフォルト構成では、RGB-D カメラとして Orbbec Gemini 2、ターゲットフィルタリングとして YOLO11n-seg TensorRT、汎用 6自由度把持姿勢生成として GraspNet を使用します。

Jetson Orin 付き reBot Arm B601-DM バンドル

作成するもの

ランタイムパイプラインは次のとおりです:

Orbbec Gemini 2 RGB-D camera
|
YOLO instance segmentation for target filtering
|
GraspNet 6-DoF grasp pose estimation
|
Eye-in-hand calibration transform
|
reBot Arm IK trajectory and gripper force control
|
Optional base rotation and object placement

このプロジェクトでは、システムを利用するための実用的な 3 つの方法を提供します:

モードエントリーポイント典型的な用途
Web UIscripts/grasp_web.pyライブ映像、ターゲット選択、把持プレビュー、実際の把持、オフセット調整
CLIscripts/grasp.pyヘッドレス把持やスクリプトによるテスト
HTTP APIscripts/grasp_curl.sh and scripts/grasp_api_client.pyリモート制御、自動化、他アプリとの連携

ハードウェアとシステムの準備

開始する前に、以下のハードウェアを準備します:

  • reBot Arm B601-DM
  • JetPack 6.x または JetPack 7.x を実行している NVIDIA Jetson デバイス
  • Orbbec Gemini 2 RGB-D カメラ
  • ロボット CAN バス用 USB2CAN アダプタ
  • カメラ用 USB 3.0 ケーブル
  • ハンドアイキャリブレーション用 ArUco マーカー、DICT_4X4_50、ID 0、一辺 0.1 m
  • 安定したテーブル、アーム周辺の十分なクリアランス、および緊急電源遮断手段
警告

このデモは実際のロボットアームを駆動します。すべての動作テストおよび把持テスト中は、手、ケーブル、緩んだ物体をアームの作業空間から遠ざけてください。--dry-run、読み取り専用チェック、小さなジョグ値から開始し、その後で完全なロボット実行を有効にしてください。

ハードウェアを接続します:

  1. Gemini 2 を USB 3.0 で Jetson に接続します。
  2. USB2CAN アダプタを reBot Arm の CAN バスに接続し、その後 Jetson に接続します。
  3. reBot Arm の電源を入れます。
  4. デバイスが認識されていることを確認します:
lsusb
ls /dev/ttyUSB* /dev/ttyACM* 2>/dev/null || true

初回起動のために一時的なデバイスパーミッションを設定します:

sudo chmod a+rw /dev/bus/usb/*/*
sudo chmod 666 /dev/ttyUSB0 2>/dev/null || true
sudo chmod 666 /dev/ttyACM0 2>/dev/null || true

シリアルデバイスについては、現在のユーザーを dialout に追加し、その後ログアウトして再ログインすることも推奨されます:

sudo usermod -aG dialout $USER

Jetson へのプロジェクトデプロイ

ステップ 1. システムパッケージと Miniconda をインストールする

sudo apt update
sudo apt install -y git wget curl build-essential cmake libusb-1.0-0-dev python3-pip

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
bash Miniconda3-latest-Linux-aarch64.sh
source ~/.bashrc

ステップ 2. プロジェクトをクローンする

git clone https://github.com/jjjadand/reBot-DevArm-Grasp.git rebot_grasp-jetson
cd rebot_grasp-jetson

パブリックリポジトリではなく社内パッケージを使用している場合は、そのプロジェクトディレクトリを Jetson にコピーし、プロジェクトルートから残りのコマンドを実行してください。

ステップ 3. Python 環境を作成する

JetPack 6.x では Python 3.10 を使用します。JetPack 7.x / Thor では Python 3.12 を使用します。

# JetPack 6.x
conda create -y -n graspnet python=3.10

# JetPack 7.x / Thor
# conda create -y -n graspnet python=3.12

conda activate graspnet
python -m pip install -U pip wheel setuptools

JetPack と CUDA のバージョンを確認します:

cat /etc/nv_tegra_release
nvcc --version

ステップ 4. Jetson 対応の PyTorch をインストールする

Jetson では、汎用の PyPI CPU/GPU PyTorch パッケージをインストールしないでください。JetPack、Python、CUDA のバージョンに一致する wheel をインストールします。reComputer ユーザーは、専用ガイド「Install Pytorch for reComputer Jetson」に従うこともできます。

一般的な出発点は次のとおりです:

# JetPack 6.x, CUDA 12.x, Python 3.10
pip install --extra-index-url https://pypi.jetson-ai-lab.io/jp6/cu126 torch torchvision

# JetPack 7.x / Thor, CUDA 13.x, Python 3.12
pip install --extra-index-url https://pypi.jetson-ai-lab.io/sbsa/cu130 torch torchvision

Python から CUDA を検証します:

python - <<'PY'
import torch
print("torch:", torch.__version__)
print("cuda available:", torch.cuda.is_available())
print("device:", torch.cuda.get_device_name(0) if torch.cuda.is_available() else "none")
PY

続行する前に、cuda availableTrue である必要があります。

ステップ 5. Python 依存パッケージをインストールする

pip install -r requirements-graspnet-jetson.txt

ステップ 6. ロボット、GraspNet、および GraspNet API SDK をインストールする

mkdir -p sdk

git clone https://github.com/vectorBH6/reBotArm_control_py.git sdk/reBotArm_control_py
pip install -e sdk/reBotArm_control_py

git clone https://github.com/graspnet/graspnet-baseline.git sdk/graspnet-baseline
git clone https://github.com/graspnet/graspnetAPI.git sdk/graspnetAPI
pip install -e sdk/graspnetAPI

GraspNet のダウンロードページから GraspNet の事前学習済みチェックポイントをダウンロードし、次の場所に配置します:

sdk/graspnet-baseline/checkpoints/checkpoint-rs.tar

ステップ 7. CUDA パスを設定し、GraspNet CUDA オペレータをビルドする

JetPack バージョンに応じて CUDA パスを設定します:

# JetPack 6.x example
export CUDA_HOME=/usr/local/cuda-12.6

# JetPack 7.x / Thor example
# export CUDA_HOME=/usr/local/cuda-13.0

export PATH="$CUDA_HOME/bin:$PATH"
export LD_LIBRARY_PATH="$CUDA_HOME/lib64:$LD_LIBRARY_PATH"

GraspNet が使用する CUDA 拡張をビルドします:

bash scripts/install_graspnet_cuda_ops.sh
bash scripts/install_graspnet_cuda_ops.sh --check

後で JetPack、Python、CUDA、または PyTorch を変更した場合は、次のコマンドで再ビルドします:

bash scripts/install_graspnet_cuda_ops.sh --force

ステップ 8. Orbbec カメラ SDK をインストールする

このプロジェクトには、アクティブな Python 環境に pyorbbecsdk2 をインストールするヘルパーが含まれています:

bash scripts/install_pyorbbecsdk.sh

SDK をローカルでビルドする必要がある場合は、まずソースツリーをクローンし、ソースモードを実行します:

git clone https://github.com/orbbec/pyorbbecsdk.git sdk/pyorbbecsdk
bash scripts/install_pyorbbecsdk.sh --from-source

SDK ソースツリーが利用可能な場合は、Orbbec の udev ルールをインストールします:

sudo bash sdk/pyorbbecsdk/scripts/env_setup/install_udev_rules.sh
sudo udevadm control --reload-rules
sudo udevadm trigger

ステップ 9. YOLO の重みをダウンロードし、対象 Jetson 上で TensorRT をエクスポートする

TensorRT エンジンファイルはデバイス固有です。デモを実行する Jetson 上で必ず .engine をエクスポートしてください。

mkdir -p models
wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-seg.pt -O models/yolo11n-seg.pt

yolo export model=models/yolo11n-seg.pt format=engine imgsz=640 half=True device=0 workspace=4

期待される出力は次のとおりです:

models/yolo11n-seg.engine

プラットフォーム上で FP16 エクスポートが失敗する場合は、half=True を指定せずにエクスポートします:

yolo export model=models/yolo11n-seg.pt format=engine imgsz=640 device=0 workspace=4

検証とキャリブレーション

実際の把持を試みる前に、次のチェックを順番に実行します。

1. RGB-D カメラを確認する

conda activate graspnet
cd ~/rebot_grasp-jetson

python scripts/verify_pyorbbec_stream.py
python scripts/verify_pyorbbec_stream.py --preview --seconds 10

テキストのみのチェックでは、RGB と深度フレーム情報が報告されるはずです。プレビューのチェックでは、デスクトップディスプレイが利用可能な場合に RGB と深度のウィンドウが表示されるはずです。

2. ロボット接続を確認する

読み取り専用モードから開始します:

python scripts/verify_rebot_arm_motion.py --read-only

アームの経路がクリアであることを確認したら、joint6 の小さなジョグを実行します:

python scripts/verify_rebot_arm_motion.py --deg 5

3. GraspNet スタックを確認する

python scripts/verify_graspnet_stack.py

カメラがまだ接続されていないが、Python、CUDA、GraspNet、および YOLO ファイルだけを確認したい場合:

python scripts/verify_graspnet_stack.py --skip-camera

4. アイインハンドキャリブレーションを実行する

このプロジェクトではアイインハンドキャリブレーションを使用します。カメラはエンドエフェクタに取り付けられ、ArUco マーカーはテーブル上に固定されます。デフォルト設定では、DICT_4X4_50、ID 0、0.1 m マーカーを想定しています。リポジトリには aruco100x100.pdf などの印刷可能なマーカーファイルが含まれています。

自動収集:

python scripts/collect_handeye_eih.py

重力補償付きの手動収集:

python scripts/collect_handeye_eih.py --manual

キャリブレーション結果は、アクティブなカメラディレクトリ配下に保存されます:

config/calibration/orbbec_gemini2/hand_eye.npz
config/calibration/orbbec_gemini2/intrinsics.npz

保存されたキャリブレーションを検証します:

python scripts/verify_handeye_calibration.py

カメラマウント、グリッパー、ArUco ボードサイズ、またはテーブル形状が変わった場合は、必ず再キャリブレーションを行ってください。

Web デモを実行する

Web UI は、最初に使用するインターフェースとして推奨されます。ライブ MJPEG ビデオ、ターゲット選択、把持プレビュー、実際の把持実行、補正調整、ベースのジョグ、グリッパー制御、レディポーズ、およびリセット操作を提供します。

まずプレビューモードで開始します。これは実際のロボット動作は行いません:

conda activate graspnet
cd ~/rebot_grasp-jetson

python scripts/grasp_web.py \
--host 0.0.0.0 \
--port 8090 \
--num-point 12000 \
--cloud-crop-nsample 32

ブラウザから Web UI を開きます:

http://<jetson_ip>:8090

プレビューモードを使用して、カメラストリーム、YOLO 検出、ターゲットフィルタリング、および把持点生成を確認します。Web UI の infer または refresh コントロールをクリックして、GraspNet プレビューを更新します。

シーンが安定し、検証ステップが完了したら、実際のロボット実行を開始します:

python scripts/grasp_web.py \
--host 0.0.0.0 \
--port 8090 \
--enable-robot \
--num-point 12000 \
--cloud-crop-nsample 32

最初の実機テストでは、把持後の配置を無効にして、アームが把持と復帰動作のみを行うようにします:

python scripts/grasp_web.py \
--host 0.0.0.0 \
--port 8090 \
--enable-robot \
--no-place-after-grasp \
--num-point 12000 \
--cloud-crop-nsample 32

便利な起動オプション:

オプション目的
--enable-robot実際のアームとグリッパーの動作を許可
--target-class cupターゲットクラスを事前選択
--no-yoloYOLO フィルタリングを無効にしてシーン全体に対して GraspNet を実行
--camera-type orbbec_gemini2カメラドライバを強制指定
--no-place-after-grasp把持後のベース回転と配置をスキップ
--num-point 12000Jetson のメモリ向けに GraspNet のポイント数を削減
--cloud-crop-nsample 32Jetson のメモリ向けに CloudCrop サンプル数を削減
--graspnet-interval 2.0有効時の GraspNet 自動更新間隔を設定

通常の Web UI ワークフローは次のとおりです:

  1. Ready をクリックして、アームをレディポーズに移動します。
  2. ターゲットクラスを選択するか、空のままにして検出された物体を使用します。
  3. Infer または Refresh をクリックして把持姿勢を計算します。
  4. ビデオ内の把持マーカーが妥当な位置に見えることを確認します。
  5. 必要に応じて、グリッパー、カメラ、またはベースの補正を調整します。
  6. アームの経路が安全である場合にのみ Real Grasp をクリックします。
  7. シーンが変化した場合やロボットを安全な状態に戻す必要がある場合は Reset を使用します。

補正値は、小さな機械的誤差やキャリブレーション誤差を補正するために使用されます。Web UI で調整した後、値を config/compensation.json に保存するか、安定した値をデプロイ用メモにコピーしてください。位置オフセットには 0.005 m、回転オフセットには 1〜2 度など、小さな刻みで調整します。

CLI と API の使用

ヘッドレスのドライランには次を使用します:

python scripts/grasp.py --dry-run --camera-type orbbec_gemini2 --target-class cup

YOLO フィルタリングなしでシーン全体に対して GraspNet を実行する場合:

python scripts/grasp.py --dry-run --camera-type orbbec_gemini2 --no-yolo

実際の CLI 実行:

python scripts/grasp.py --camera-type orbbec_gemini2 --target-class cup

CLI での立ち上げ時に配置を無効にするには:

python scripts/grasp.py \
--camera-type orbbec_gemini2 \
--target-class cup \
--no-place-after-grasp

ロボットを動かさずに GraspNet のライブ出力を確認するには:

python scripts/graspnet_camera_demo.py --auto --target-class cup
python scripts/graspnet_camera_demo.py --auto --no-yolo --no-visualizer

HTTP 自動化のために、ヘルパーを使って Web サービスを起動します:

bash scripts/grasp_curl.sh serve --enable-robot --no-auto-graspnet

別のターミナルで:

bash scripts/grasp_curl.sh state
bash scripts/grasp_curl.sh ready
bash scripts/grasp_curl.sh target bottle
bash scripts/grasp_curl.sh infer
bash scripts/grasp_curl.sh grasp
bash scripts/grasp_curl.sh reset

同じ操作は curl を使って直接呼び出すこともできます:

BASE=http://127.0.0.1:8090

curl -s "$BASE/state"
curl -s -X POST "$BASE/ready" -H "Content-Type: application/json" -d "{}"
curl -s -X POST "$BASE/target" -H "Content-Type: application/json" -d '{"class_name":"bottle"}'
curl -s -X POST "$BASE/infer" -H "Content-Type: application/json" -d "{}"
curl -s -X POST "$BASE/grasp" -H "Content-Type: application/json" -d "{}"

その他の有用なエンドポイント:

エンドポイントメソッド目的
/stateGET現在の検出結果、把持情報、および Web ランタイム状態
/robot/stateGETロボットの関節、TCP 姿勢、グリッパー状態
/stream.mjpgGETMJPEG カメラストリーム
/compensationPOSTグリッパー、カメラ、ベースの補正値を設定
/joint/limitsGET関節位置とリミットを読み取り
/joint/jogPOST1 つの関節をジョグ(ベーステストでは多くの場合 joint1
/move/jointsPOSTすべての関節を絶対位置に移動
/move/posePOSTIK または軌道モードで TCP をターゲット姿勢に移動
/gripperPOSTグリッパーのオープン、クローズ、リリース、または状態読み取り
/auto_graspPOSTバックグラウンドでターゲット探索と把持サイクルを実行

設定とチューニング

主な設定ファイルは次のとおりです:

config/default.yaml

デフォルトのカメラ設定:

camera:
type: orbbec_gemini2
color_width: 1280
color_height: 720
depth_width: 1280
depth_height: 720
fps: 30

デフォルトの検出および GraspNet 設定:

yolo:
model_name: "yolo11n-seg.engine"
device: "auto"

graspnet:
checkpoint: "checkpoint-rs.tar"

デフォルトの配置動作:

grasp_pipeline:
place:
enabled: true
base_joint: joint1
base_delta_deg: 90.0
base_direction: auto
base_rotate_duration: 2.5
base_safety_margin_deg: 5.0
return_home: false

グリッパーが一貫して物体を取り逃す場合は、次の順序で調整します:

症状最初に調整すべき対象
グリッパーが前後方向に離れすぎているgrasp_forward_offset / Web グリッパー前方補正
グリッパーが左右に外れるgrasp_lateral_offset またはカメラの X/Y 補正
グリッパーが高すぎる/低すぎるgrasp_vertical_offset またはカメラの Z 補正
手首の角度が正しくないグリッパーのロール・ピッチ・ヨー補正
すべての把持が同じ方向にずれるカメラまたはベースの補正

デモ動画

トラブルシューティング

torch.cuda.is_available()False を返す:JetPack に対応した PyTorch ホイールを再インストールしてください。汎用の PyPI torch は Jetson でのデプロイには適していません。

No module named pointnet2._ext または No module named knn_pytorch.knn_pytorch:GraspNet の CUDA オペレータを再ビルドします:

bash scripts/install_graspnet_cuda_ops.sh --force

pyorbbecsdk import failed またはカメラを開けない:SDK を再インストールし、USB パーミッションを確認します:

bash scripts/install_pyorbbecsdk.sh
sudo chmod a+rw /dev/bus/usb/*/*
python scripts/verify_pyorbbec_stream.py

YOLO の .engine が読み込めない:同じ Jetson 上で再エクスポートしてください。Engine ファイルは Jetson モデル、JetPack バージョン、TensorRT バージョン間でコピーすべきではありません。

ArUco マーカーが検出されない:マーカー辞書が DICT_4X4_50、ID が 0、マーカーの一辺の長さが 0.1 m であること、照明が安定していること、マーカーが平坦で完全に見えていることを確認してください。

ロボットは接続されているが動作しない:verify_rebot_arm_motion.py --read-only を実行し、USB2CAN デバイスを確認し、モータ電源をチェックし、把持実行を再試行する前に小さな --deg 5 ジョグをテストしてください。

GraspNet がメモリ不足になる:--num-point を減らし、--cloud-crop-nsample を減らし、デスクトップアプリケーションを閉じ、複数の重い推論プロセスを同時に実行しないようにします。

リソース

技術サポートと製品ディスカッション

当社製品をお選びいただきありがとうございます。ご質問、ディスカッション、問題報告のために、いくつかのサポートチャネルをご用意しています。

Loading Comments...