/SamCon

Pybullet implementation of SamCon (SIGGRAPH 2010 paper "Sampling-based Contact-rich Motion Control").

Primary LanguagePython

SamCon

PyBullet implementation of SamCon (SIGGRAPH 2010 paper "Sampling-based Contact-rich Motion Control").

SamCon is an easy-to-understand method for physics-based character animation.
This repository has these following features:

  • Core parts of SamCon: (1) samples generation, simulation and evaluation, (2) elite samples selection, (3) final best trajectory searching.
  • Humanoid URDF with similar topology to SMPL, which means we can get reference motion from a large-scale human motion dataset AMASS.
  • Scripts for generating reference motion from AMASS.
  • Master-worker parallelization (tested on windows & ubuntu).

Seeing demo videos in this page [demo]

Hope this repo can contribute to the physics-based character animation community. 😇

What's SamCon?

Given a reference motion (see the transparent humanoid), directly feeding it to PD controllers will make the simulated humanoid fall down.
gif

Running SamCon to optimize the reference motion, we can get a corrected motion. Tracking it again, the simulated humanoid will behave like the reference motion.
gif

Getting Started

Installation

git clone https://github.com/liangpan99/SamCon.git
pip install -r requirements.txt

code tested on windows & ubuntu

Reference motion

We use a large-scale 3D human motion dataset, i.e. AMASS, as the reference motion database.

To use pre-processed reference motion (only contains 252 sequences of "ACCAD"), download from google drive and place in the directory ./data/motion/.

To manually generate reference motion from AMASS, follow the following instructions:

  1. download AMASS dataset, and organize it into the following structure:
AMASS
|   - ACCAD
|         - Female1General_c3d
|                            - A1 - Stand_poses.npz
|                            - A2 - Sway_poses.npz
|                            - A2 - Sway t2_poses.npz
|                            - ...
|         - Female1Gestures_c3d
|         - Female1Running_c3d
|         - ...
|   - BioMotionLab_NTroje
|   - BMLhandball
|   - ...
  1. download amass_copycat_occlusion.pkl from google drive and place in the directory ./data/motion/. It's an annotation file that help avoid invalid motion sequences in AMASS, such as sitting on a chair, provided by Kin-Poly.

  2. change amass_dir & sequences variables in file process_amass_raw.py, one indicates the path to AMASS dataset and the other indicates sequences chosen to process. Then, run:

python process_amass/process_amass_raw.py
python process_amass/amass_to_bullet.py
  1. visualize reference motion:
python process_amass/vis_motion.py

It will ask you to input a sequence name, all names are lied in ./data/motion/all_seq_names.txt, you can pick one. Press [Q] to change sequence.

gif

Examples

We provide two configs (walk & cartwheel) and corresponding results to show you how to use this repo. All hyper-parameters are lied in .yml config, e.g. nIter, nSample, nSave and so on. Note that, because code requires a lot of disk I/O, please set tmp_dir to SSD disk for speeding up.

Highly recommended to "evaluate SamCon" first (all requirements are included in this repo).
"Run SamCon" will take you a little time to prepare reference motion.

Run SamCon

python scripts/run_samcon.py --cfg walk --num_processes 8
python scripts/run_samcon.py --cfg cartwheel --num_processes 8

maximum number of num_processes is equal to your computer's CPU cores

Evaluate SamCon

python scripts/eval_samcon.py --cfg walk --file "walk_ACCAD_Female1Walking_c3d_B12 - walk turn right (90)_poses.pkl"
python scripts/eval_samcon.py --cfg walk --file "walk_ACCAD_Male1Walking_c3d_Walk B10 - Walk turn left 45_poses.pkl"
python scripts/eval_samcon.py --cfg cartwheel --file "cartwheel_ACCAD_Female1Gestures_c3d_D6- CartWheel_poses.pkl"

You can find cost distribution images in the directory ./results/samcon/cfg_name/info/. gif

References

Algorithm: SamCon paper + Zhihu tutorial
Humanoid URDF: ScaDiver
Process AMASS: Kin-Poly