Repository files navigation

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Paper of the day

This is the official repository for the paper:

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Tianshan Zhang*, Yijia Duan*, Yanjun Li*, Zeyu Zhang*, and Hao Tang

School of Computer Science, Peking University

*Equal contribution. Project lead. Corresponding author: bjdxtanghao@gmail.com.

Note

The simulation demo and real-robot demo are intentionally left as placeholders in this release. They will be added after the corresponding experiments are finalized.

teaser.mp4

Citation

If you find our code or paper useful, please consider citing:

@article{zhang2026dragmesh2,
title={DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects},
author={Zhang, Tianshan and Duan, Yijia and Li, Yanjun and Zhang, Zeyu and Tang, Hao},
journal={arXiv preprint arXiv:2606.15133},
year={2026}
}

Intro

DragMesh-2 is a contact-driven framework for dexterous hand interaction with articulated objects. It extends articulated interaction from object-centric generation to hand-driven hand-object interaction, where a target part can move only through physical contact between the dexterous hand and the handle.

The repository contains:

  • an Isaac Gym articulated-object interaction environment built around a 51-DoF SMPL-X right hand;
  • PPO training code with a separated PICA method module and GLA backbone;
  • deterministic and stochastic evaluation tools for damping and contact-load robustness;
  • trajectory-tracking baseline scripts.

News

2026/06/01: Initial public-code cleanup for DragMesh-2.

TODO List

  • Release core simulation and PPO/PICA code.
  • Add cleaned training, evaluation, and baseline entrypoints.
  • Add release README and setup instructions.
  • Release prepared trajectory/data package.
  • Release pretrained checkpoints.
  • Add simulation demo.
  • Add real-robot demo.

Quick Start

Environment Setup

The code is designed for Isaac Gym preview environments. Our internal runs use Python 3.8/3.9, CUDA-capable PyTorch, and Isaac Gym.

Install Python dependencies:

pip install -r requirements.txt

Install external packages that are not distributed through this repository:

# Isaac Gym# Download Isaac Gym from NVIDIA, then add it to PYTHONPATH.export ISAACGYM_ROOT=/path/to/isaacgym
export PYTHONPATH="${ISAACGYM_ROOT}/python:${PYTHONPATH}"# GLA encoder dependency used by PICA checkpoints.# Install flash-linear-attention or keep a local checkout at ./flash-linear-attention.export FLA_ROOT=/path/to/flash-linear-attention
export PYTHONPATH="${FLA_ROOT}:${PYTHONPATH}"

If you use a conda environment, also expose its runtime libraries:

export LD_LIBRARY_PATH="${CONDA_PREFIX}/lib:${LD_LIBRARY_PATH}"

Data Preparation

Prepare GAPartNet assets in this layout:

assets/
`-- gapartnet_example/
`-- 45661/
|-- mobility_annotation_gapartnet.urdf
|-- mobility_v2.json
`-- link_annotation_gapartnet.json

The default config expects:

hand.hand_asset_root: hands/floatingasset.asset_root: assetsasset.arti_obj_root: gapartnet_example

The repository already includes smplx_right_hand_floating.urdf. If you need to rebuild it from a base SMPL-X right-hand URDF:

python dataset/geometric/build_hand_urdf.py \
--input hands/smplx_variants/hands_only/smplx_right_hand.urdf \
--output hands/floating/smplx_right_hand_floating.urdf

Generate Contact Trajectories

Edit configs/env/hand_config.yaml to select the GAPartNet object IDs, then run:

python dataset/geometric/run_hand_drag.py --config configs/env/hand_config.yaml --headless

Generated trajectories are written under:

output/hand_drag/<object_id>/trajectory.json

For batch training/evaluation, create a manifest at data/manifest.csv:

sample_id,object_id,trajectory,enabled45661,45661,output/hand_drag/45661/trajectory.json,1

You can also pass --trajectory directly to all training and evaluation commands.

Training

Train the main PICA configuration:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
RUN_NAME=dragmesh2_45661_pica \
bash scripts/train/train_pica.sh

Equivalent direct command:

python ppo/train.py \
--train_config configs/train/pica/train_config_gla_pica_drand12_aux_v2c.yaml \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--num_envs 64 \
--max_epochs 150 \
--experiment_name dragmesh2_45661_pica

Checkpoints are saved under:

runs/<experiment_name>/nn/

Evaluation

Run deterministic and stochastic damping evaluation:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
CHECKPOINT=runs/dragmesh2_45661_pica/nn \
OUT_ROOT=output/eval/dragmesh2_45661_pica \
bash scripts/eval/eval_det_stoch_damping.sh

Run a single deterministic evaluation:

python scripts/evaluate_ppo_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--checkpoint runs/dragmesh2_45661_pica/nn \
--checkpoint-kind best \
--episodes 20 \
--summary_json output/eval/45661_summary.json

Baselines

Run the non-learned trajectory-tracking baseline:

python scripts/track_trajectory_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--phase drag \
--summary_json output/baselines/45661_tracking.json

Batch baseline evaluation over data/manifest.csv:

python scripts/run_trajectory_baselines.py \
--manifest data/manifest.csv \
--phase drag

Repository Layout

.
|-- dataset/geometric/ # Geometry-only dataset generator
|-- hands/ # Dexterous hand assets
|-- configs/ # Environment and training YAML files
|-- backbones/ # GLA backbone plus MLP/GRU/Transformer notes
|-- pica/ # PICA agent extension and method notes
|-- ppo/ # PPO trainer, task, and rl-games environment wrapper
|-- scripts/
| |-- train/ # Standard training wrappers
| |-- eval/ # Standard evaluation wrappers
| `-- baselines/ # Baseline wrappers
|-- assets/ # External articulated assets live here
|-- data/ # Manifest templates and local data pointers
`-- demos/ # Simulation and real-robot demos, coming soon

Acknowledgement

We thank the authors of Isaac Gym, GAPartNet, SMPL-X, rl-games, and flash-linear-attention for their open-source code and datasets.

About

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Paper of the day

This is the official repository for the paper:

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Tianshan Zhang*, Yijia Duan*, Yanjun Li*, Zeyu Zhang*, and Hao Tang

School of Computer Science, Peking University

*Equal contribution. Project lead. Corresponding author: bjdxtanghao@gmail.com.

Note

The simulation demo and real-robot demo are intentionally left as placeholders in this release. They will be added after the corresponding experiments are finalized.

teaser.mp4

Citation

If you find our code or paper useful, please consider citing:

@article{zhang2026dragmesh2,
title={DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects},
author={Zhang, Tianshan and Duan, Yijia and Li, Yanjun and Zhang, Zeyu and Tang, Hao},
journal={arXiv preprint arXiv:2606.15133},
year={2026}
}

Intro

DragMesh-2 is a contact-driven framework for dexterous hand interaction with articulated objects. It extends articulated interaction from object-centric generation to hand-driven hand-object interaction, where a target part can move only through physical contact between the dexterous hand and the handle.

The repository contains:

  • an Isaac Gym articulated-object interaction environment built around a 51-DoF SMPL-X right hand;
  • PPO training code with a separated PICA method module and GLA backbone;
  • deterministic and stochastic evaluation tools for damping and contact-load robustness;
  • trajectory-tracking baseline scripts.

News

2026/06/01: Initial public-code cleanup for DragMesh-2.

TODO List

  • Release core simulation and PPO/PICA code.
  • Add cleaned training, evaluation, and baseline entrypoints.
  • Add release README and setup instructions.
  • Release prepared trajectory/data package.
  • Release pretrained checkpoints.
  • Add simulation demo.
  • Add real-robot demo.

Quick Start

Environment Setup

The code is designed for Isaac Gym preview environments. Our internal runs use Python 3.8/3.9, CUDA-capable PyTorch, and Isaac Gym.

Install Python dependencies:

pip install -r requirements.txt

Install external packages that are not distributed through this repository:

# Isaac Gym# Download Isaac Gym from NVIDIA, then add it to PYTHONPATH.export ISAACGYM_ROOT=/path/to/isaacgym
export PYTHONPATH="${ISAACGYM_ROOT}/python:${PYTHONPATH}"# GLA encoder dependency used by PICA checkpoints.# Install flash-linear-attention or keep a local checkout at ./flash-linear-attention.export FLA_ROOT=/path/to/flash-linear-attention
export PYTHONPATH="${FLA_ROOT}:${PYTHONPATH}"

If you use a conda environment, also expose its runtime libraries:

export LD_LIBRARY_PATH="${CONDA_PREFIX}/lib:${LD_LIBRARY_PATH}"

Data Preparation

Prepare GAPartNet assets in this layout:

assets/
`-- gapartnet_example/
`-- 45661/
|-- mobility_annotation_gapartnet.urdf
|-- mobility_v2.json
`-- link_annotation_gapartnet.json

The default config expects:

hand.hand_asset_root: hands/floatingasset.asset_root: assetsasset.arti_obj_root: gapartnet_example

The repository already includes smplx_right_hand_floating.urdf. If you need to rebuild it from a base SMPL-X right-hand URDF:

python dataset/geometric/build_hand_urdf.py \
--input hands/smplx_variants/hands_only/smplx_right_hand.urdf \
--output hands/floating/smplx_right_hand_floating.urdf

Generate Contact Trajectories

Edit configs/env/hand_config.yaml to select the GAPartNet object IDs, then run:

python dataset/geometric/run_hand_drag.py --config configs/env/hand_config.yaml --headless

Generated trajectories are written under:

output/hand_drag/<object_id>/trajectory.json

For batch training/evaluation, create a manifest at data/manifest.csv:

sample_id,object_id,trajectory,enabled45661,45661,output/hand_drag/45661/trajectory.json,1

You can also pass --trajectory directly to all training and evaluation commands.

Training

Train the main PICA configuration:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
RUN_NAME=dragmesh2_45661_pica \
bash scripts/train/train_pica.sh

Equivalent direct command:

python ppo/train.py \
--train_config configs/train/pica/train_config_gla_pica_drand12_aux_v2c.yaml \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--num_envs 64 \
--max_epochs 150 \
--experiment_name dragmesh2_45661_pica

Checkpoints are saved under:

runs/<experiment_name>/nn/

Evaluation

Run deterministic and stochastic damping evaluation:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
CHECKPOINT=runs/dragmesh2_45661_pica/nn \
OUT_ROOT=output/eval/dragmesh2_45661_pica \
bash scripts/eval/eval_det_stoch_damping.sh

Run a single deterministic evaluation:

python scripts/evaluate_ppo_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--checkpoint runs/dragmesh2_45661_pica/nn \
--checkpoint-kind best \
--episodes 20 \
--summary_json output/eval/45661_summary.json

Baselines

Run the non-learned trajectory-tracking baseline:

python scripts/track_trajectory_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--phase drag \
--summary_json output/baselines/45661_tracking.json

Batch baseline evaluation over data/manifest.csv:

python scripts/run_trajectory_baselines.py \
--manifest data/manifest.csv \
--phase drag

Repository Layout

.
|-- dataset/geometric/ # Geometry-only dataset generator
|-- hands/ # Dexterous hand assets
|-- configs/ # Environment and training YAML files
|-- backbones/ # GLA backbone plus MLP/GRU/Transformer notes
|-- pica/ # PICA agent extension and method notes
|-- ppo/ # PPO trainer, task, and rl-games environment wrapper
|-- scripts/
| |-- train/ # Standard training wrappers
| |-- eval/ # Standard evaluation wrappers
| `-- baselines/ # Baseline wrappers
|-- assets/ # External articulated assets live here
|-- data/ # Manifest templates and local data pointers
`-- demos/ # Simulation and real-robot demos, coming soon

Acknowledgement

We thank the authors of Isaac Gym, GAPartNet, SMPL-X, rl-games, and flash-linear-attention for their open-source code and datasets.

About

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Paper of the day

This is the official repository for the paper:

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Tianshan Zhang*, Yijia Duan*, Yanjun Li*, Zeyu Zhang*, and Hao Tang

School of Computer Science, Peking University

*Equal contribution. Project lead. Corresponding author: bjdxtanghao@gmail.com.

Note

The simulation demo and real-robot demo are intentionally left as placeholders in this release. They will be added after the corresponding experiments are finalized.

teaser.mp4

Citation

If you find our code or paper useful, please consider citing:

@article{zhang2026dragmesh2,
title={DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects},
author={Zhang, Tianshan and Duan, Yijia and Li, Yanjun and Zhang, Zeyu and Tang, Hao},
journal={arXiv preprint arXiv:2606.15133},
year={2026}
}

Intro

DragMesh-2 is a contact-driven framework for dexterous hand interaction with articulated objects. It extends articulated interaction from object-centric generation to hand-driven hand-object interaction, where a target part can move only through physical contact between the dexterous hand and the handle.

The repository contains:

  • an Isaac Gym articulated-object interaction environment built around a 51-DoF SMPL-X right hand;
  • PPO training code with a separated PICA method module and GLA backbone;
  • deterministic and stochastic evaluation tools for damping and contact-load robustness;
  • trajectory-tracking baseline scripts.

News

2026/06/01: Initial public-code cleanup for DragMesh-2.

TODO List

  • Release core simulation and PPO/PICA code.
  • Add cleaned training, evaluation, and baseline entrypoints.
  • Add release README and setup instructions.
  • Release prepared trajectory/data package.
  • Release pretrained checkpoints.
  • Add simulation demo.
  • Add real-robot demo.

Quick Start

Environment Setup

The code is designed for Isaac Gym preview environments. Our internal runs use Python 3.8/3.9, CUDA-capable PyTorch, and Isaac Gym.

Install Python dependencies:

pip install -r requirements.txt

Install external packages that are not distributed through this repository:

# Isaac Gym# Download Isaac Gym from NVIDIA, then add it to PYTHONPATH.export ISAACGYM_ROOT=/path/to/isaacgym
export PYTHONPATH="${ISAACGYM_ROOT}/python:${PYTHONPATH}"# GLA encoder dependency used by PICA checkpoints.# Install flash-linear-attention or keep a local checkout at ./flash-linear-attention.export FLA_ROOT=/path/to/flash-linear-attention
export PYTHONPATH="${FLA_ROOT}:${PYTHONPATH}"

If you use a conda environment, also expose its runtime libraries:

export LD_LIBRARY_PATH="${CONDA_PREFIX}/lib:${LD_LIBRARY_PATH}"

Data Preparation

Prepare GAPartNet assets in this layout:

assets/
`-- gapartnet_example/
`-- 45661/
|-- mobility_annotation_gapartnet.urdf
|-- mobility_v2.json
`-- link_annotation_gapartnet.json

The default config expects:

hand.hand_asset_root: hands/floatingasset.asset_root: assetsasset.arti_obj_root: gapartnet_example

The repository already includes smplx_right_hand_floating.urdf. If you need to rebuild it from a base SMPL-X right-hand URDF:

python dataset/geometric/build_hand_urdf.py \
--input hands/smplx_variants/hands_only/smplx_right_hand.urdf \
--output hands/floating/smplx_right_hand_floating.urdf

Generate Contact Trajectories

Edit configs/env/hand_config.yaml to select the GAPartNet object IDs, then run:

python dataset/geometric/run_hand_drag.py --config configs/env/hand_config.yaml --headless

Generated trajectories are written under:

output/hand_drag/<object_id>/trajectory.json

For batch training/evaluation, create a manifest at data/manifest.csv:

sample_id,object_id,trajectory,enabled45661,45661,output/hand_drag/45661/trajectory.json,1

You can also pass --trajectory directly to all training and evaluation commands.

Training

Train the main PICA configuration:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
RUN_NAME=dragmesh2_45661_pica \
bash scripts/train/train_pica.sh

Equivalent direct command:

python ppo/train.py \
--train_config configs/train/pica/train_config_gla_pica_drand12_aux_v2c.yaml \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--num_envs 64 \
--max_epochs 150 \
--experiment_name dragmesh2_45661_pica

Checkpoints are saved under:

runs/<experiment_name>/nn/

Evaluation

Run deterministic and stochastic damping evaluation:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
CHECKPOINT=runs/dragmesh2_45661_pica/nn \
OUT_ROOT=output/eval/dragmesh2_45661_pica \
bash scripts/eval/eval_det_stoch_damping.sh

Run a single deterministic evaluation:

python scripts/evaluate_ppo_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--checkpoint runs/dragmesh2_45661_pica/nn \
--checkpoint-kind best \
--episodes 20 \
--summary_json output/eval/45661_summary.json

Baselines

Run the non-learned trajectory-tracking baseline:

python scripts/track_trajectory_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--phase drag \
--summary_json output/baselines/45661_tracking.json

Batch baseline evaluation over data/manifest.csv:

python scripts/run_trajectory_baselines.py \
--manifest data/manifest.csv \
--phase drag

Repository Layout

.
|-- dataset/geometric/ # Geometry-only dataset generator
|-- hands/ # Dexterous hand assets
|-- configs/ # Environment and training YAML files
|-- backbones/ # GLA backbone plus MLP/GRU/Transformer notes
|-- pica/ # PICA agent extension and method notes
|-- ppo/ # PPO trainer, task, and rl-games environment wrapper
|-- scripts/
| |-- train/ # Standard training wrappers
| |-- eval/ # Standard evaluation wrappers
| `-- baselines/ # Baseline wrappers
|-- assets/ # External articulated assets live here
|-- data/ # Manifest templates and local data pointers
`-- demos/ # Simulation and real-robot demos, coming soon

Acknowledgement

We thank the authors of Isaac Gym, GAPartNet, SMPL-X, rl-games, and flash-linear-attention for their open-source code and datasets.

About

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Paper of the day

This is the official repository for the paper:

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Tianshan Zhang*, Yijia Duan*, Yanjun Li*, Zeyu Zhang*, and Hao Tang

School of Computer Science, Peking University

*Equal contribution. Project lead. Corresponding author: bjdxtanghao@gmail.com.

Note

The simulation demo and real-robot demo are intentionally left as placeholders in this release. They will be added after the corresponding experiments are finalized.

teaser.mp4

Citation

If you find our code or paper useful, please consider citing:

@article{zhang2026dragmesh2,
title={DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects},
author={Zhang, Tianshan and Duan, Yijia and Li, Yanjun and Zhang, Zeyu and Tang, Hao},
journal={arXiv preprint arXiv:2606.15133},
year={2026}
}

Intro

DragMesh-2 is a contact-driven framework for dexterous hand interaction with articulated objects. It extends articulated interaction from object-centric generation to hand-driven hand-object interaction, where a target part can move only through physical contact between the dexterous hand and the handle.

The repository contains:

  • an Isaac Gym articulated-object interaction environment built around a 51-DoF SMPL-X right hand;
  • PPO training code with a separated PICA method module and GLA backbone;
  • deterministic and stochastic evaluation tools for damping and contact-load robustness;
  • trajectory-tracking baseline scripts.

News

2026/06/01: Initial public-code cleanup for DragMesh-2.

TODO List

  • Release core simulation and PPO/PICA code.
  • Add cleaned training, evaluation, and baseline entrypoints.
  • Add release README and setup instructions.
  • Release prepared trajectory/data package.
  • Release pretrained checkpoints.
  • Add simulation demo.
  • Add real-robot demo.

Quick Start

Environment Setup

The code is designed for Isaac Gym preview environments. Our internal runs use Python 3.8/3.9, CUDA-capable PyTorch, and Isaac Gym.

Install Python dependencies:

pip install -r requirements.txt

Install external packages that are not distributed through this repository:

# Isaac Gym# Download Isaac Gym from NVIDIA, then add it to PYTHONPATH.export ISAACGYM_ROOT=/path/to/isaacgym
export PYTHONPATH="${ISAACGYM_ROOT}/python:${PYTHONPATH}"# GLA encoder dependency used by PICA checkpoints.# Install flash-linear-attention or keep a local checkout at ./flash-linear-attention.export FLA_ROOT=/path/to/flash-linear-attention
export PYTHONPATH="${FLA_ROOT}:${PYTHONPATH}"

If you use a conda environment, also expose its runtime libraries:

export LD_LIBRARY_PATH="${CONDA_PREFIX}/lib:${LD_LIBRARY_PATH}"

Data Preparation

Prepare GAPartNet assets in this layout:

assets/
`-- gapartnet_example/
`-- 45661/
|-- mobility_annotation_gapartnet.urdf
|-- mobility_v2.json
`-- link_annotation_gapartnet.json

The default config expects:

hand.hand_asset_root: hands/floatingasset.asset_root: assetsasset.arti_obj_root: gapartnet_example

The repository already includes smplx_right_hand_floating.urdf. If you need to rebuild it from a base SMPL-X right-hand URDF:

python dataset/geometric/build_hand_urdf.py \
--input hands/smplx_variants/hands_only/smplx_right_hand.urdf \
--output hands/floating/smplx_right_hand_floating.urdf

Generate Contact Trajectories

Edit configs/env/hand_config.yaml to select the GAPartNet object IDs, then run:

python dataset/geometric/run_hand_drag.py --config configs/env/hand_config.yaml --headless

Generated trajectories are written under:

output/hand_drag/<object_id>/trajectory.json

For batch training/evaluation, create a manifest at data/manifest.csv:

sample_id,object_id,trajectory,enabled45661,45661,output/hand_drag/45661/trajectory.json,1

You can also pass --trajectory directly to all training and evaluation commands.

Training

Train the main PICA configuration:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
RUN_NAME=dragmesh2_45661_pica \
bash scripts/train/train_pica.sh

Equivalent direct command:

python ppo/train.py \
--train_config configs/train/pica/train_config_gla_pica_drand12_aux_v2c.yaml \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--num_envs 64 \
--max_epochs 150 \
--experiment_name dragmesh2_45661_pica

Checkpoints are saved under:

runs/<experiment_name>/nn/

Evaluation

Run deterministic and stochastic damping evaluation:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
CHECKPOINT=runs/dragmesh2_45661_pica/nn \
OUT_ROOT=output/eval/dragmesh2_45661_pica \
bash scripts/eval/eval_det_stoch_damping.sh

Run a single deterministic evaluation:

python scripts/evaluate_ppo_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--checkpoint runs/dragmesh2_45661_pica/nn \
--checkpoint-kind best \
--episodes 20 \
--summary_json output/eval/45661_summary.json

Baselines

Run the non-learned trajectory-tracking baseline:

python scripts/track_trajectory_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--phase drag \
--summary_json output/baselines/45661_tracking.json

Batch baseline evaluation over data/manifest.csv:

python scripts/run_trajectory_baselines.py \
--manifest data/manifest.csv \
--phase drag

Repository Layout

.
|-- dataset/geometric/ # Geometry-only dataset generator
|-- hands/ # Dexterous hand assets
|-- configs/ # Environment and training YAML files
|-- backbones/ # GLA backbone plus MLP/GRU/Transformer notes
|-- pica/ # PICA agent extension and method notes
|-- ppo/ # PPO trainer, task, and rl-games environment wrapper
|-- scripts/
| |-- train/ # Standard training wrappers
| |-- eval/ # Standard evaluation wrappers
| `-- baselines/ # Baseline wrappers
|-- assets/ # External articulated assets live here
|-- data/ # Manifest templates and local data pointers
`-- demos/ # Simulation and real-robot demos, coming soon

Acknowledgement

We thank the authors of Isaac Gym, GAPartNet, SMPL-X, rl-games, and flash-linear-attention for their open-source code and datasets.

About

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Paper of the day

This is the official repository for the paper:

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Tianshan Zhang*, Yijia Duan*, Yanjun Li*, Zeyu Zhang*, and Hao Tang

School of Computer Science, Peking University

*Equal contribution. Project lead. Corresponding author: bjdxtanghao@gmail.com.

Note

The simulation demo and real-robot demo are intentionally left as placeholders in this release. They will be added after the corresponding experiments are finalized.

teaser.mp4

Citation

If you find our code or paper useful, please consider citing:

@article{zhang2026dragmesh2,
title={DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects},
author={Zhang, Tianshan and Duan, Yijia and Li, Yanjun and Zhang, Zeyu and Tang, Hao},
journal={arXiv preprint arXiv:2606.15133},
year={2026}
}

Intro

DragMesh-2 is a contact-driven framework for dexterous hand interaction with articulated objects. It extends articulated interaction from object-centric generation to hand-driven hand-object interaction, where a target part can move only through physical contact between the dexterous hand and the handle.

The repository contains:

  • an Isaac Gym articulated-object interaction environment built around a 51-DoF SMPL-X right hand;
  • PPO training code with a separated PICA method module and GLA backbone;
  • deterministic and stochastic evaluation tools for damping and contact-load robustness;
  • trajectory-tracking baseline scripts.

News

2026/06/01: Initial public-code cleanup for DragMesh-2.

TODO List

  • Release core simulation and PPO/PICA code.
  • Add cleaned training, evaluation, and baseline entrypoints.
  • Add release README and setup instructions.
  • Release prepared trajectory/data package.
  • Release pretrained checkpoints.
  • Add simulation demo.
  • Add real-robot demo.

Quick Start

Environment Setup

The code is designed for Isaac Gym preview environments. Our internal runs use Python 3.8/3.9, CUDA-capable PyTorch, and Isaac Gym.

Install Python dependencies:

pip install -r requirements.txt

Install external packages that are not distributed through this repository:

# Isaac Gym# Download Isaac Gym from NVIDIA, then add it to PYTHONPATH.export ISAACGYM_ROOT=/path/to/isaacgym
export PYTHONPATH="${ISAACGYM_ROOT}/python:${PYTHONPATH}"# GLA encoder dependency used by PICA checkpoints.# Install flash-linear-attention or keep a local checkout at ./flash-linear-attention.export FLA_ROOT=/path/to/flash-linear-attention
export PYTHONPATH="${FLA_ROOT}:${PYTHONPATH}"

If you use a conda environment, also expose its runtime libraries:

export LD_LIBRARY_PATH="${CONDA_PREFIX}/lib:${LD_LIBRARY_PATH}"

Data Preparation

Prepare GAPartNet assets in this layout:

assets/
`-- gapartnet_example/
`-- 45661/
|-- mobility_annotation_gapartnet.urdf
|-- mobility_v2.json
`-- link_annotation_gapartnet.json

The default config expects:

hand.hand_asset_root: hands/floatingasset.asset_root: assetsasset.arti_obj_root: gapartnet_example

The repository already includes smplx_right_hand_floating.urdf. If you need to rebuild it from a base SMPL-X right-hand URDF:

python dataset/geometric/build_hand_urdf.py \
--input hands/smplx_variants/hands_only/smplx_right_hand.urdf \
--output hands/floating/smplx_right_hand_floating.urdf

Generate Contact Trajectories

Edit configs/env/hand_config.yaml to select the GAPartNet object IDs, then run:

python dataset/geometric/run_hand_drag.py --config configs/env/hand_config.yaml --headless

Generated trajectories are written under:

output/hand_drag/<object_id>/trajectory.json

For batch training/evaluation, create a manifest at data/manifest.csv:

sample_id,object_id,trajectory,enabled45661,45661,output/hand_drag/45661/trajectory.json,1

You can also pass --trajectory directly to all training and evaluation commands.

Training

Train the main PICA configuration:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
RUN_NAME=dragmesh2_45661_pica \
bash scripts/train/train_pica.sh

Equivalent direct command:

python ppo/train.py \
--train_config configs/train/pica/train_config_gla_pica_drand12_aux_v2c.yaml \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--num_envs 64 \
--max_epochs 150 \
--experiment_name dragmesh2_45661_pica

Checkpoints are saved under:

runs/<experiment_name>/nn/

Evaluation

Run deterministic and stochastic damping evaluation:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
CHECKPOINT=runs/dragmesh2_45661_pica/nn \
OUT_ROOT=output/eval/dragmesh2_45661_pica \
bash scripts/eval/eval_det_stoch_damping.sh

Run a single deterministic evaluation:

python scripts/evaluate_ppo_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--checkpoint runs/dragmesh2_45661_pica/nn \
--checkpoint-kind best \
--episodes 20 \
--summary_json output/eval/45661_summary.json

Baselines

Run the non-learned trajectory-tracking baseline:

python scripts/track_trajectory_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--phase drag \
--summary_json output/baselines/45661_tracking.json

Batch baseline evaluation over data/manifest.csv:

python scripts/run_trajectory_baselines.py \
--manifest data/manifest.csv \
--phase drag

Repository Layout

.
|-- dataset/geometric/ # Geometry-only dataset generator
|-- hands/ # Dexterous hand assets
|-- configs/ # Environment and training YAML files
|-- backbones/ # GLA backbone plus MLP/GRU/Transformer notes
|-- pica/ # PICA agent extension and method notes
|-- ppo/ # PPO trainer, task, and rl-games environment wrapper
|-- scripts/
| |-- train/ # Standard training wrappers
| |-- eval/ # Standard evaluation wrappers
| `-- baselines/ # Baseline wrappers
|-- assets/ # External articulated assets live here
|-- data/ # Manifest templates and local data pointers
`-- demos/ # Simulation and real-robot demos, coming soon

Acknowledgement

We thank the authors of Isaac Gym, GAPartNet, SMPL-X, rl-games, and flash-linear-attention for their open-source code and datasets.

About

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Paper of the day

This is the official repository for the paper:

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Tianshan Zhang*, Yijia Duan*, Yanjun Li*, Zeyu Zhang*, and Hao Tang

School of Computer Science, Peking University

*Equal contribution. Project lead. Corresponding author: bjdxtanghao@gmail.com.

Note

The simulation demo and real-robot demo are intentionally left as placeholders in this release. They will be added after the corresponding experiments are finalized.

teaser.mp4

Citation

If you find our code or paper useful, please consider citing:

@article{zhang2026dragmesh2,
title={DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects},
author={Zhang, Tianshan and Duan, Yijia and Li, Yanjun and Zhang, Zeyu and Tang, Hao},
journal={arXiv preprint arXiv:2606.15133},
year={2026}
}

Intro

DragMesh-2 is a contact-driven framework for dexterous hand interaction with articulated objects. It extends articulated interaction from object-centric generation to hand-driven hand-object interaction, where a target part can move only through physical contact between the dexterous hand and the handle.

The repository contains:

  • an Isaac Gym articulated-object interaction environment built around a 51-DoF SMPL-X right hand;
  • PPO training code with a separated PICA method module and GLA backbone;
  • deterministic and stochastic evaluation tools for damping and contact-load robustness;
  • trajectory-tracking baseline scripts.

News

2026/06/01: Initial public-code cleanup for DragMesh-2.

TODO List

  • Release core simulation and PPO/PICA code.
  • Add cleaned training, evaluation, and baseline entrypoints.
  • Add release README and setup instructions.
  • Release prepared trajectory/data package.
  • Release pretrained checkpoints.
  • Add simulation demo.
  • Add real-robot demo.

Quick Start

Environment Setup

The code is designed for Isaac Gym preview environments. Our internal runs use Python 3.8/3.9, CUDA-capable PyTorch, and Isaac Gym.

Install Python dependencies:

pip install -r requirements.txt

Install external packages that are not distributed through this repository:

# Isaac Gym# Download Isaac Gym from NVIDIA, then add it to PYTHONPATH.export ISAACGYM_ROOT=/path/to/isaacgym
export PYTHONPATH="${ISAACGYM_ROOT}/python:${PYTHONPATH}"# GLA encoder dependency used by PICA checkpoints.# Install flash-linear-attention or keep a local checkout at ./flash-linear-attention.export FLA_ROOT=/path/to/flash-linear-attention
export PYTHONPATH="${FLA_ROOT}:${PYTHONPATH}"

If you use a conda environment, also expose its runtime libraries:

export LD_LIBRARY_PATH="${CONDA_PREFIX}/lib:${LD_LIBRARY_PATH}"

Data Preparation

Prepare GAPartNet assets in this layout:

assets/
`-- gapartnet_example/
`-- 45661/
|-- mobility_annotation_gapartnet.urdf
|-- mobility_v2.json
`-- link_annotation_gapartnet.json

The default config expects:

hand.hand_asset_root: hands/floatingasset.asset_root: assetsasset.arti_obj_root: gapartnet_example

The repository already includes smplx_right_hand_floating.urdf. If you need to rebuild it from a base SMPL-X right-hand URDF:

python dataset/geometric/build_hand_urdf.py \
--input hands/smplx_variants/hands_only/smplx_right_hand.urdf \
--output hands/floating/smplx_right_hand_floating.urdf

Generate Contact Trajectories

Edit configs/env/hand_config.yaml to select the GAPartNet object IDs, then run:

python dataset/geometric/run_hand_drag.py --config configs/env/hand_config.yaml --headless

Generated trajectories are written under:

output/hand_drag/<object_id>/trajectory.json

For batch training/evaluation, create a manifest at data/manifest.csv:

sample_id,object_id,trajectory,enabled45661,45661,output/hand_drag/45661/trajectory.json,1

You can also pass --trajectory directly to all training and evaluation commands.

Training

Train the main PICA configuration:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
RUN_NAME=dragmesh2_45661_pica \
bash scripts/train/train_pica.sh

Equivalent direct command:

python ppo/train.py \
--train_config configs/train/pica/train_config_gla_pica_drand12_aux_v2c.yaml \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--num_envs 64 \
--max_epochs 150 \
--experiment_name dragmesh2_45661_pica

Checkpoints are saved under:

runs/<experiment_name>/nn/

Evaluation

Run deterministic and stochastic damping evaluation:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
CHECKPOINT=runs/dragmesh2_45661_pica/nn \
OUT_ROOT=output/eval/dragmesh2_45661_pica \
bash scripts/eval/eval_det_stoch_damping.sh

Run a single deterministic evaluation:

python scripts/evaluate_ppo_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--checkpoint runs/dragmesh2_45661_pica/nn \
--checkpoint-kind best \
--episodes 20 \
--summary_json output/eval/45661_summary.json

Baselines

Run the non-learned trajectory-tracking baseline:

python scripts/track_trajectory_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--phase drag \
--summary_json output/baselines/45661_tracking.json

Batch baseline evaluation over data/manifest.csv:

python scripts/run_trajectory_baselines.py \
--manifest data/manifest.csv \
--phase drag

Repository Layout

.
|-- dataset/geometric/ # Geometry-only dataset generator
|-- hands/ # Dexterous hand assets
|-- configs/ # Environment and training YAML files
|-- backbones/ # GLA backbone plus MLP/GRU/Transformer notes
|-- pica/ # PICA agent extension and method notes
|-- ppo/ # PPO trainer, task, and rl-games environment wrapper
|-- scripts/
| |-- train/ # Standard training wrappers
| |-- eval/ # Standard evaluation wrappers
| `-- baselines/ # Baseline wrappers
|-- assets/ # External articulated assets live here
|-- data/ # Manifest templates and local data pointers
`-- demos/ # Simulation and real-robot demos, coming soon

Acknowledgement

We thank the authors of Isaac Gym, GAPartNet, SMPL-X, rl-games, and flash-linear-attention for their open-source code and datasets.

About

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Paper of the day

This is the official repository for the paper:

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Tianshan Zhang*, Yijia Duan*, Yanjun Li*, Zeyu Zhang*, and Hao Tang

School of Computer Science, Peking University

*Equal contribution. Project lead. Corresponding author: bjdxtanghao@gmail.com.

Note

The simulation demo and real-robot demo are intentionally left as placeholders in this release. They will be added after the corresponding experiments are finalized.

teaser.mp4

Citation

If you find our code or paper useful, please consider citing:

@article{zhang2026dragmesh2,
title={DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects},
author={Zhang, Tianshan and Duan, Yijia and Li, Yanjun and Zhang, Zeyu and Tang, Hao},
journal={arXiv preprint arXiv:2606.15133},
year={2026}
}

Intro

DragMesh-2 is a contact-driven framework for dexterous hand interaction with articulated objects. It extends articulated interaction from object-centric generation to hand-driven hand-object interaction, where a target part can move only through physical contact between the dexterous hand and the handle.

The repository contains:

  • an Isaac Gym articulated-object interaction environment built around a 51-DoF SMPL-X right hand;
  • PPO training code with a separated PICA method module and GLA backbone;
  • deterministic and stochastic evaluation tools for damping and contact-load robustness;
  • trajectory-tracking baseline scripts.

News

2026/06/01: Initial public-code cleanup for DragMesh-2.

TODO List

  • Release core simulation and PPO/PICA code.
  • Add cleaned training, evaluation, and baseline entrypoints.
  • Add release README and setup instructions.
  • Release prepared trajectory/data package.
  • Release pretrained checkpoints.
  • Add simulation demo.
  • Add real-robot demo.

Quick Start

Environment Setup

The code is designed for Isaac Gym preview environments. Our internal runs use Python 3.8/3.9, CUDA-capable PyTorch, and Isaac Gym.

Install Python dependencies:

pip install -r requirements.txt

Install external packages that are not distributed through this repository:

# Isaac Gym# Download Isaac Gym from NVIDIA, then add it to PYTHONPATH.export ISAACGYM_ROOT=/path/to/isaacgym
export PYTHONPATH="${ISAACGYM_ROOT}/python:${PYTHONPATH}"# GLA encoder dependency used by PICA checkpoints.# Install flash-linear-attention or keep a local checkout at ./flash-linear-attention.export FLA_ROOT=/path/to/flash-linear-attention
export PYTHONPATH="${FLA_ROOT}:${PYTHONPATH}"

If you use a conda environment, also expose its runtime libraries:

export LD_LIBRARY_PATH="${CONDA_PREFIX}/lib:${LD_LIBRARY_PATH}"

Data Preparation

Prepare GAPartNet assets in this layout:

assets/
`-- gapartnet_example/
`-- 45661/
|-- mobility_annotation_gapartnet.urdf
|-- mobility_v2.json
`-- link_annotation_gapartnet.json

The default config expects:

hand.hand_asset_root: hands/floatingasset.asset_root: assetsasset.arti_obj_root: gapartnet_example

The repository already includes smplx_right_hand_floating.urdf. If you need to rebuild it from a base SMPL-X right-hand URDF:

python dataset/geometric/build_hand_urdf.py \
--input hands/smplx_variants/hands_only/smplx_right_hand.urdf \
--output hands/floating/smplx_right_hand_floating.urdf

Generate Contact Trajectories

Edit configs/env/hand_config.yaml to select the GAPartNet object IDs, then run:

python dataset/geometric/run_hand_drag.py --config configs/env/hand_config.yaml --headless

Generated trajectories are written under:

output/hand_drag/<object_id>/trajectory.json

For batch training/evaluation, create a manifest at data/manifest.csv:

sample_id,object_id,trajectory,enabled45661,45661,output/hand_drag/45661/trajectory.json,1

You can also pass --trajectory directly to all training and evaluation commands.

Training

Train the main PICA configuration:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
RUN_NAME=dragmesh2_45661_pica \
bash scripts/train/train_pica.sh

Equivalent direct command:

python ppo/train.py \
--train_config configs/train/pica/train_config_gla_pica_drand12_aux_v2c.yaml \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--num_envs 64 \
--max_epochs 150 \
--experiment_name dragmesh2_45661_pica

Checkpoints are saved under:

runs/<experiment_name>/nn/

Evaluation

Run deterministic and stochastic damping evaluation:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
CHECKPOINT=runs/dragmesh2_45661_pica/nn \
OUT_ROOT=output/eval/dragmesh2_45661_pica \
bash scripts/eval/eval_det_stoch_damping.sh

Run a single deterministic evaluation:

python scripts/evaluate_ppo_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--checkpoint runs/dragmesh2_45661_pica/nn \
--checkpoint-kind best \
--episodes 20 \
--summary_json output/eval/45661_summary.json

Baselines

Run the non-learned trajectory-tracking baseline:

python scripts/track_trajectory_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--phase drag \
--summary_json output/baselines/45661_tracking.json

Batch baseline evaluation over data/manifest.csv:

python scripts/run_trajectory_baselines.py \
--manifest data/manifest.csv \
--phase drag

Repository Layout

.
|-- dataset/geometric/ # Geometry-only dataset generator
|-- hands/ # Dexterous hand assets
|-- configs/ # Environment and training YAML files
|-- backbones/ # GLA backbone plus MLP/GRU/Transformer notes
|-- pica/ # PICA agent extension and method notes
|-- ppo/ # PPO trainer, task, and rl-games environment wrapper
|-- scripts/
| |-- train/ # Standard training wrappers
| |-- eval/ # Standard evaluation wrappers
| `-- baselines/ # Baseline wrappers
|-- assets/ # External articulated assets live here
|-- data/ # Manifest templates and local data pointers
`-- demos/ # Simulation and real-robot demos, coming soon

Acknowledgement

We thank the authors of Isaac Gym, GAPartNet, SMPL-X, rl-games, and flash-linear-attention for their open-source code and datasets.

About

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Paper of the day

This is the official repository for the paper:

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Tianshan Zhang*, Yijia Duan*, Yanjun Li*, Zeyu Zhang*, and Hao Tang

School of Computer Science, Peking University

*Equal contribution. Project lead. Corresponding author: bjdxtanghao@gmail.com.

Note

The simulation demo and real-robot demo are intentionally left as placeholders in this release. They will be added after the corresponding experiments are finalized.

teaser.mp4

Citation

If you find our code or paper useful, please consider citing:

@article{zhang2026dragmesh2,
title={DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects},
author={Zhang, Tianshan and Duan, Yijia and Li, Yanjun and Zhang, Zeyu and Tang, Hao},
journal={arXiv preprint arXiv:2606.15133},
year={2026}
}

Intro

DragMesh-2 is a contact-driven framework for dexterous hand interaction with articulated objects. It extends articulated interaction from object-centric generation to hand-driven hand-object interaction, where a target part can move only through physical contact between the dexterous hand and the handle.

The repository contains:

  • an Isaac Gym articulated-object interaction environment built around a 51-DoF SMPL-X right hand;
  • PPO training code with a separated PICA method module and GLA backbone;
  • deterministic and stochastic evaluation tools for damping and contact-load robustness;
  • trajectory-tracking baseline scripts.

News

2026/06/01: Initial public-code cleanup for DragMesh-2.

TODO List

  • Release core simulation and PPO/PICA code.
  • Add cleaned training, evaluation, and baseline entrypoints.
  • Add release README and setup instructions.
  • Release prepared trajectory/data package.
  • Release pretrained checkpoints.
  • Add simulation demo.
  • Add real-robot demo.

Quick Start

Environment Setup

The code is designed for Isaac Gym preview environments. Our internal runs use Python 3.8/3.9, CUDA-capable PyTorch, and Isaac Gym.

Install Python dependencies:

pip install -r requirements.txt

Install external packages that are not distributed through this repository:

# Isaac Gym# Download Isaac Gym from NVIDIA, then add it to PYTHONPATH.export ISAACGYM_ROOT=/path/to/isaacgym
export PYTHONPATH="${ISAACGYM_ROOT}/python:${PYTHONPATH}"# GLA encoder dependency used by PICA checkpoints.# Install flash-linear-attention or keep a local checkout at ./flash-linear-attention.export FLA_ROOT=/path/to/flash-linear-attention
export PYTHONPATH="${FLA_ROOT}:${PYTHONPATH}"

If you use a conda environment, also expose its runtime libraries:

export LD_LIBRARY_PATH="${CONDA_PREFIX}/lib:${LD_LIBRARY_PATH}"

Data Preparation

Prepare GAPartNet assets in this layout:

assets/
`-- gapartnet_example/
`-- 45661/
|-- mobility_annotation_gapartnet.urdf
|-- mobility_v2.json
`-- link_annotation_gapartnet.json

The default config expects:

hand.hand_asset_root: hands/floatingasset.asset_root: assetsasset.arti_obj_root: gapartnet_example

The repository already includes smplx_right_hand_floating.urdf. If you need to rebuild it from a base SMPL-X right-hand URDF:

python dataset/geometric/build_hand_urdf.py \
--input hands/smplx_variants/hands_only/smplx_right_hand.urdf \
--output hands/floating/smplx_right_hand_floating.urdf

Generate Contact Trajectories

Edit configs/env/hand_config.yaml to select the GAPartNet object IDs, then run:

python dataset/geometric/run_hand_drag.py --config configs/env/hand_config.yaml --headless

Generated trajectories are written under:

output/hand_drag/<object_id>/trajectory.json

For batch training/evaluation, create a manifest at data/manifest.csv:

sample_id,object_id,trajectory,enabled45661,45661,output/hand_drag/45661/trajectory.json,1

You can also pass --trajectory directly to all training and evaluation commands.

Training

Train the main PICA configuration:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
RUN_NAME=dragmesh2_45661_pica \
bash scripts/train/train_pica.sh

Equivalent direct command:

python ppo/train.py \
--train_config configs/train/pica/train_config_gla_pica_drand12_aux_v2c.yaml \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--num_envs 64 \
--max_epochs 150 \
--experiment_name dragmesh2_45661_pica

Checkpoints are saved under:

runs/<experiment_name>/nn/

Evaluation

Run deterministic and stochastic damping evaluation:

OBJECT_ID=45661 \
TRAJECTORY=output/hand_drag/45661/trajectory.json \
CHECKPOINT=runs/dragmesh2_45661_pica/nn \
OUT_ROOT=output/eval/dragmesh2_45661_pica \
bash scripts/eval/eval_det_stoch_damping.sh

Run a single deterministic evaluation:

python scripts/evaluate_ppo_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--checkpoint runs/dragmesh2_45661_pica/nn \
--checkpoint-kind best \
--episodes 20 \
--summary_json output/eval/45661_summary.json

Baselines

Run the non-learned trajectory-tracking baseline:

python scripts/track_trajectory_baseline.py \
--object_id 45661 \
--trajectory output/hand_drag/45661/trajectory.json \
--phase drag \
--summary_json output/baselines/45661_tracking.json

Batch baseline evaluation over data/manifest.csv:

python scripts/run_trajectory_baselines.py \
--manifest data/manifest.csv \
--phase drag

Repository Layout

.
|-- dataset/geometric/ # Geometry-only dataset generator
|-- hands/ # Dexterous hand assets
|-- configs/ # Environment and training YAML files
|-- backbones/ # GLA backbone plus MLP/GRU/Transformer notes
|-- pica/ # PICA agent extension and method notes
|-- ppo/ # PPO trainer, task, and rl-games environment wrapper
|-- scripts/
| |-- train/ # Standard training wrappers
| |-- eval/ # Standard evaluation wrappers
| `-- baselines/ # Baseline wrappers
|-- assets/ # External articulated assets live here
|-- data/ # Manifest templates and local data pointers
`-- demos/ # Simulation and real-robot demos, coming soon

Acknowledgement

We thank the authors of Isaac Gym, GAPartNet, SMPL-X, rl-games, and flash-linear-attention for their open-source code and datasets.

About

DragMesh-2: Physically Plausible Dexterous Hand-Object Interaction with Articulated Objects

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages