[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-72566":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":27,"readmeContent":28,"aiSummary":29,"trendingCount":16,"starSnapshotCount":16,"syncStatus":30,"lastSyncTime":31,"discoverSource":32},72566,"GMR","YanjieZe\u002FGMR","YanjieZe","[ICRA 2026] GMR: General Motion Retargeting. Retarget human motions into diverse humanoid robots in real time on CPU. Retargeter for TWIST.","",null,"Python",2320,390,13,71,0,18,58,166,54,109.78,"MIT License",false,"master",true,[],"2026-06-12 04:01:06","# GMR: General Motion Retargeting\n\n  \u003Ca href=\"https:\u002F\u002Farxiv.org\u002Fabs\u002F2505.02833\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpaper-arXiv%3A2505.02833-b31b1b.svg\" alt=\"arXiv Paper\"\u002F>\n  \u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Farxiv.org\u002Fabs\u002F2510.02252\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpaper-arXiv%3A2510.02252-b31b1b.svg\" alt=\"arXiv Paper\"\u002F>\n  \u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg\" alt=\"License: MIT\"\u002F>\n  \u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FYanjieZe\u002FGMR\u002Freleases\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fversion-0.2.0-blue.svg\" alt=\"Version\"\u002F>\n  \u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fx.com\u002FZeYanjie\u002Fstatus\u002F1952446745696469334\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Ftwitter-ZeYanjie-blue.svg\" alt=\"Twitter\"\u002F>\n  \u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fyanjieze.github.io\u002Fhumanoid-foundation\u002F#GMR\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fblog-GMR-blue.svg\" alt=\"Blog\"\u002F>\n  \u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1p1nazeEzC\u002F?share_source=copy_web&vd_source=c76e3ab14ac3f7219a9006b96b4b0f76\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Ftutorial-BILIBILI-blue.svg\" alt=\"Blog\"\u002F>\n  \u003C\u002Fa>\n\n![Banner for GMR](.\u002Fassets\u002FGMR.png)\n\n![GMR](.\u002Fassets\u002FGMR_pipeline.png)\n\n#### Key features of GMR:\n- Real-time high-quality retargeting, unlock the potential of real-time whole-body teleoperation, i.e., [TWIST](https:\u002F\u002Fgithub.com\u002FYanjieZe\u002FTWIST).\n- Carefully tuned for good performance of RL tracking policies.\n- Support multiple humanoid robots and multiple human motion data formats (See our table below).\n\n> [!NOTE]\n> If you want this repo to support a new robot or a new human motion data format, send the robot files (`.xml`, `.urdf`, and meshes) \u002F human motion data to \u003Ca href=\"mailto:lastyanjieze@gmail.com\">Yanjie Ze\u003C\u002Fa> or create an issue, we will support it as soon as possible. And please make sure the robot files you sent can be open-sourced in this repo.\n\nThis repo is licensed under the [MIT License](LICENSE).\n\n\n# News & Updates\n- **2026-01-21:** GMR now supports [Xsens](https:\u002F\u002Fwww.xsens.com\u002F) BVH offline data.\n- **2026-01-12:** GMR now supports [Fourier GR3](https:\u002F\u002Fwww.fftai.com\u002F), the 17th humanoid robot in the repo.\n- **2025-12-02:** GMR now supports [TWIST2](https:\u002F\u002Fyanjieze.com\u002FTWIST2), which utilizes [XRoboToolkit SDK](https:\u002F\u002Fgithub.com\u002FXR-Robotics\u002FXRoboToolkit-PC-Service).\n- **2025-11-17:** To join our community for discussions, you can add my WeChat contact [QR Code](https:\u002F\u002Fyanjieze.com\u002FTWIST2\u002Fimages\u002Fmy_wechat.jpg) with info like \"[GMR] [Your Name] [Your Affiliation]\".\n- **2025-11-08:** [MimicKit] from Jason Peng now supports GMR format. Check [here](https:\u002F\u002Fgithub.com\u002Fxbpeng\u002FMimicKit\u002Ftree\u002Fmain\u002Ftools\u002Fgmr_to_mimickit).\n- **2025-10-15:** Now supporting [PAL Robotics' Talos](https:\u002F\u002Fpal-robotics.com\u002Frobot\u002Ftalos\u002F), the 15th humanoid robot.\n- **2025-10-14:** GMR now supports [Nokov](https:\u002F\u002Fwww.nokov.com\u002F) BVH data.\n- **2025-10-14:** Add a doc on ik config. See [DOC.md](DOC.md)\n- **2025-10-09:** Check [TWIST](https:\u002F\u002Fgithub.com\u002FYanjieZe\u002FTWIST) open-sourced code for RL motion tracking.\n- **2025-10-02:** Tech report for GMR is now on [arXiv](https:\u002F\u002Farxiv.org\u002Fabs\u002F2510.02252).\n- **2025-10-01:** GMR now supports converting GMR pickle files to CSV (for beyondmimic), check `scripts\u002Fbatch_gmr_pkl_to_csv.py`.\n- **2025-09-25:** An introduction on GMR is available on [Bilibili](https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1p1nazeEzC\u002F?share_source=copy_web&vd_source=c76e3ab14ac3f7219a9006b96b4b0f76).\n- **2025-09-16:** GMR now supports to use [GVHMR](https:\u002F\u002Fgithub.com\u002Fzju3dv\u002FGVHMR) for extracting human pose from **monocular video** and retargeting to robot.\n- **2025-09-12:** GMR now supports [Tienkung](https:\u002F\u002Fgithub.com\u002FOpen-X-Humanoid\u002FTienKung-Lab), the 14th humanoid robot in the repo.\n- **2025-08-30:** GMR now supports [Unitree H1 2](https:\u002F\u002Fwww.unitree.com\u002Fcn\u002Fh1) and [PND Adam Lite](https:\u002F\u002Fpndbotics.com\u002F), the 12th and 13th humanoid robots in the repo.\n- **2025-08-28:** GMR now supports [Booster T1](https:\u002F\u002Fwww.boosterobotics.com\u002F) for both 23dof and 29dof.\n- **2025-08-28:** GMR now supports using exported offline FBX motion data from [OptiTrack](https:\u002F\u002Fwww.optitrack.com\u002F). \n- **2025-08-27:** GMR now supports [Berkeley Humanoid Lite](https:\u002F\u002Fgithub.com\u002FHybridRobotics\u002FBerkeley-Humanoid-Lite-Assets), the 11th humanoid robot in the repo.\n- **2025-08-24:** GMR now supports [Unitree H1](https:\u002F\u002Fwww.unitree.com\u002Fh1\u002F), the 10th humanoid robot in the repo.\n- **2025-08-24:** GMR now supports velocity limits for the robot motors, `use_velocity_limit=True` by default in `GeneralMotionRetargeting` class (and we use 3*pi as the velocity limit by default); we also add printing of robot DoF\u002FBody\u002FMotor names and their IDs by default, and you can access them via `robot_dof_names`, `robot_body_names`, and `robot_motor_names` attributes.\n- **2025-08-10:** GMR now supports [Booster K1](https:\u002F\u002Fwww.boosterobotics.com\u002F), the 9th robot in the repo.\n- **2025-08-09:** GMR now supports *Unitree G1 with Dex31 hands*.\n- **2025-08-07:** GMR now supports [Galexea R1 Pro](https:\u002F\u002Fgalaxea-dynamics.com\u002F) (this is a wheeled humanoid robot!) and [KUAVO](https:\u002F\u002Fwww.kuavo.ai\u002F), the 7th and 8th humanoid robots in the repo.\n- **2025-08-06:** GMR now supports [HighTorque Hi](https:\u002F\u002Fwww.hightorquerobotics.com\u002Fhi\u002F), the 6th humanoid robot in the repo.\n- **2025-08-04:** Initial release of GMR. Check our [twitter post](https:\u002F\u002Fx.com\u002FZeYanjie\u002Fstatus\u002F1952446745696469334).\n\n## Demos\n\n\u003Ctable>\n  \u003Ctr>\n    \u003Ctd align=\"center\" width=\"20%\">\n      \u003Cb>Demo 1\u003C\u002Fb>\u003Cbr>\n      Retargeting LAFAN1 dancing motion to 5 robots.\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F23566fa5-6335-46b9-957b-4b26aed11b9e\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\" width=\"20%\">\n      \u003Cb>Demo 2\u003C\u002Fb>\u003Cbr>\n      Galexea R1 Pro robot (view 1).\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F903ed0b0-0ac5-4226-8f82-5a88631e9b7c\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\" width=\"20%\">\n      \u003Cb>Demo 3\u003C\u002Fb>\u003Cbr>\n      Galexea R1 Pro robot (view 2).\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fdeea0e64-f1c6-41bc-8661-351682006d5d\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\" width=\"20%\">\n      \u003Cb>Demo 4\u003C\u002Fb>\u003Cbr>\n      Switching robots by changing one argument.\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F03f10902-c541-40b1-8104-715a5759fd5e\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\" width=\"20%\">\n      \u003Cb>Demo 5\u003C\u002Fb>\u003Cbr>\n      HighTorque robot doing a twist dance.\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F1d3e663b-f29e-41b1-8e15-5c0deb6a4a5c\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n  \u003C\u002Ftr>\n\n  \u003Ctr>\n    \u003Ctd align=\"center\">\n      \u003Cb>Demo 6\u003C\u002Fb>\u003Cbr>\n      Kuavo robot picking up a box.\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F02fc8f41-c363-484b-a329-4f4e83ed5b80\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Demo 7\u003C\u002Fb>\u003Cbr>\n      Unitree H1 robot doing a ChaCha dance.\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F28ee6f0f-be30-42bb-8543-cf1152d97724\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Demo 8\u003C\u002Fb>\u003Cbr>\n      Booster T1 robot jumping (view 1).\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F2c75a146-e28f-4327-930f-5281bfc2ca9c\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Demo 9\u003C\u002Fb>\u003Cbr>\n      Booster T1 robot jumping (view 2).\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fff10c7ef-4357-4789-9219-23c6db8dba6d\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Demo 10\u003C\u002Fb>\u003Cbr>\n      Unitree H1-2 robot jumping.\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F2382d8ce-7902-432f-ab45-348a11eeb312\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n  \u003C\u002Ftr>\n\n  \u003Ctr>\n    \u003Ctd align=\"center\">\n      \u003Cb>Demo 11\u003C\u002Fb>\u003Cbr>\n      PND Adam Lite robot.\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fa8ef1409-88f1-4393-9cd0-d2b14216d2a4\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Demo 12\u003C\u002Fb>\u003Cbr>\n      Tienkung robot walking.\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F7a775ecc-4254-450c-a3eb-49e843b8e331\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Demo 13\u003C\u002Fb>\u003Cbr>\n      Extracting human pose (GVHMR + GMR).\u003Cbr>\n      \u003Ca href=\"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Tnpmz9EaE\">▶ Watch on Bilibili\u003C\u002Fa>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Demo 14\u003C\u002Fb>\u003Cbr>\n      PAL Robotics’ Talos robot fighting.\u003Cbr>\n      \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F3ec0bf80-80c1-4181-a623-dc2b072c2ca2\" width=\"200\" controls>\u003C\u002Fvideo>\n    \u003C\u002Ftd>\n    \u003Ctd align=\"center\">\n      \u003Cb>Demo 15\u003C\u002Fb>\u003Cbr>\n      (Optional placeholder if you add a new one later!)\u003Cbr>\n      \u003Ci>Coming soon...\u003C\u002Fi>\n    \u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\n## Supported Robots and Data Formats\n\n\n\n| Assigned ID | Robot\u002FData Format | Robot DoF | SMPLX ([AMASS](https:\u002F\u002Famass.is.tue.mpg.de\u002F), [OMOMO](https:\u002F\u002Fgithub.com\u002Flijiaman\u002Fomomo_release)) | BVH [LAFAN1](https:\u002F\u002Fgithub.com\u002Fubisoft\u002Fubisoft-laforge-animation-dataset)| FBX ([OptiTrack](https:\u002F\u002Fwww.optitrack.com\u002F)) |  BVH [Nokov](https:\u002F\u002Fwww.nokov.com\u002F) | PICO ([XRoboToolkit](https:\u002F\u002Fgithub.com\u002FXR-Robotics\u002FXRoboToolkit-PC-Service)) | More formats coming soon | \n| --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| 0 | Unitree G1 `unitree_g1` | Leg (2\\*6) + Waist (3) + Arm (2\\*7) = 29 | ✅ | ✅ | ✅ |  ✅ | ✅ |\n| 1 | Unitree G1 with Hands `unitree_g1_with_hands` | Leg (2\\*6) + Waist (3) + Arm (2\\*7) + Hand (2\\*7) = 43 | ✅ | ✅ | ✅ | TBD | TBD |\n| 2 | Unitree H1 `unitree_h1` | Leg (2\\*5) + Waist (1) + Arm (2\\*4) = 19 | ✅ | TBD | TBD | TBD | TBD |\n| 3 | Unitree H1 2 `unitree_h1_2` | Leg (2\\*6) + Waist (1) + Arm (2\\*7) = 27 | ✅ | TBD | TBD | TBD | TBD |\n| 4 | Booster T1 `booster_t1` | TBD | ✅ |  TBD  | TBD | TBD |\n| 5 | Booster T1 29dof `booster_t1_29dof` | TBD | ✅ |  ✅  | TBD | TBD |\n| 6 | Booster K1 `booster_k1` | Neck (2) + Arm (2\\*4) + Leg (2\\*6) = 22 | ✅ | TBD | TBD | TBD |\n| 7 | Stanford ToddlerBot `stanford_toddy` | TBD | ✅ | ✅ | TBD | TBD |\n| 8 | Fourier N1 `fourier_n1` | TBD | ✅ | ✅ | TBD | TBD |\n| 9 | ENGINEAI PM01 `engineai_pm01` | TBD | ✅ | ✅ | TBD | TBD |\n| 10 | HighTorque Hi `hightorque_hi` | Head (2) + Arm (2\\*5) + Waist (1) + Leg (2\\*6) = 25 | ✅ | TBD | TBD | TBD |\n| 11 | Galaxea R1 Pro `galaxea_r1pro` (this is a wheeled robot!) |  Base (6) + Torso (4) + Arm (2*7) = 24 | ✅ | TBD | TBD | TBD |\n| 12 | Kuavo `kuavo_s45` |  Head (2) + Arm (2\\*7) + Leg (2\\*6) = 28 | ✅ | TBD | TBD | TBD |\n| 13 | Berkeley Humanoid Lite `berkeley_humanoid_lite` (need further tuning) | Leg (2\\*6) + Arm (2\\*5) = 22 | ✅ | TBD | TBD | TBD |\n| 14 | PND Adam Lite `pnd_adam_lite`  | Leg (2\\*6) + Waist (3) + Arm (2\\*5) = 25 | ✅ | TBD | TBD | TBD |\n| 15 | Tienkung `tienkung`  | Leg (2\\*6) + Arm (2\\*4) = 20 | ✅ | TBD | TBD | TBD |\n| 16 | PAL Robotics' Talos `pal_talos`  | Head (2) + Arm (2\\*7) + Waist (2) + Leg (2\\*6) = 30 | ✅ | TBD | TBD | TBD |\n| 17 | Fourier GR3 `fourier_gr3`  | Head (2) + Arm (2\\*7) + Waist (3) + Leg (2\\*6) = 31 | ✅ | TBD | TBD | TBD |\n| More robots coming soon ! |\n| 18 | AgiBot A2 `agibot_a2` | TBD | TBD | TBD | TBD | TBD |\n| 19 | OpenLoong `openloong` | TBD | TBD | TBD | TBD | TBD |\n\n\n\n\n## Installation\n\n> [!NOTE]\n> The code is tested on Ubuntu 22.04\u002F20.04.\n\nFirst create your conda environment:\n\n```bash\nconda create -n gmr python=3.10 -y\nconda activate gmr\n```\n\nThen, install GMR:\n\n```bash\npip install -e .\n```\n\nAfter installing SMPLX, change `ext` in `smplx\u002Fbody_models.py` from `npz` to `pkl` if you are using SMPL-X pkl files.\n\nAnd to resolve some possible rendering issues:\n\n```bash\nconda install -c conda-forge libstdcxx-ng -y\n```\n\n## Data Preparation\n\n[[SMPLX](https:\u002F\u002Fgithub.com\u002Fvchoutas\u002Fsmplx) body model] download SMPL-X body models to `assets\u002Fbody_models` from [SMPL-X](https:\u002F\u002Fsmpl-x.is.tue.mpg.de\u002F) and then structure as follows:\n```bash\n- assets\u002Fbody_models\u002Fsmplx\u002F\n-- SMPLX_NEUTRAL.pkl\n-- SMPLX_FEMALE.pkl\n-- SMPLX_MALE.pkl\n```\n\n[[AMASS](https:\u002F\u002Famass.is.tue.mpg.de\u002F) motion data] download raw SMPL-X data to any folder you want from [AMASS](https:\u002F\u002Famass.is.tue.mpg.de\u002F). NOTE: Do not download SMPL+H data.\n\n[[OMOMO](https:\u002F\u002Fgithub.com\u002Flijiaman\u002Fomomo_release) motion data] download raw OMOMO data to any folder you want from [this google drive file](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1tZVqLB7II0whI-Qjz-z-AU3ponSEyAmm\u002Fview?usp=sharing). And process the data into the SMPL-X format using `scripts\u002Fconvert_omomo_to_smplx.py`.\n\n[[LAFAN1](https:\u002F\u002Fgithub.com\u002Fubisoft\u002Fubisoft-laforge-animation-dataset) motion data] download raw LAFAN1 bvh files from [the official repo](https:\u002F\u002Fgithub.com\u002Fubisoft\u002Fubisoft-laforge-animation-dataset), i.e., [lafan1.zip](https:\u002F\u002Fgithub.com\u002Fubisoft\u002Fubisoft-laforge-animation-dataset\u002Fblob\u002Fmaster\u002Flafan1\u002Flafan1.zip).\n\n\n## Human\u002FRobot Motion Data Formulation\n\nTo better use this library, you can first have an understanding of the human motion data we use and the robot motion data we obtain.\n\nEach frame of **human motion data** is formulated as a dict of (human_body_name, 3d global translation + global rotation). The rotation is usually represented as quaternion (with wxyz order by default, to align with mujoco).\n\nEach frame of **robot motion data** can be understood as a tuple of (robot_base_translation, robot_base_rotation, robot_joint_positions).\n\n## Usage\n\n### [NEW] PICO Streaming to Robot (TWIST2)\n\nInstall PICO SDK:\n1. On your PICO, install PICO SDK: see [here](https:\u002F\u002Fgithub.com\u002FXR-Robotics\u002FXRoboToolkit-Unity-Client\u002Freleases\u002F).\n2. On your own PC, \n    - Download [deb package for ubuntu 22.04](https:\u002F\u002Fgithub.com\u002FXR-Robotics\u002FXRoboToolkit-PC-Service\u002Freleases\u002Fdownload\u002Fv1.0.0\u002FXRoboToolkit_PC_Service_1.0.0_ubuntu_22.04_amd64.deb), or build from the [repo source](https:\u002F\u002Fgithub.com\u002FXR-Robotics\u002FXRoboToolkit-PC-Service).\n    - To install, use command\n        ```bash\n        sudo dpkg -i XRoboToolkit_PC_Service_1.0.0_ubuntu_22.04_amd64.deb\n        ```\n        then you should see `xrobotoolkit-pc-service` in your APPs. remember to start this app before you do teleopperation.\n    - Build PICO PC Service SDK and Python SDK for PICO streaming:\n        ```bash\n        conda activate gmr\n\n        git clone https:\u002F\u002Fgithub.com\u002FYanjieZe\u002FXRoboToolkit-PC-Service-Pybind.git\n        cd XRoboToolkit-PC-Service-Pybind\n\n        mkdir -p tmp\n        cd tmp\n        git clone https:\u002F\u002Fgithub.com\u002FXR-Robotics\u002FXRoboToolkit-PC-Service.git\n        cd XRoboToolkit-PC-Service\u002FRoboticsService\u002FPXREARobotSDK \n        bash build.sh\n        cd ..\u002F..\u002F..\u002F..\n        \n\n        mkdir -p lib\n        mkdir -p include\n        cp tmp\u002FXRoboToolkit-PC-Service\u002FRoboticsService\u002FPXREARobotSDK\u002FPXREARobotSDK.h include\u002F\n        cp -r tmp\u002FXRoboToolkit-PC-Service\u002FRoboticsService\u002FPXREARobotSDK\u002Fnlohmann include\u002Fnlohmann\u002F\n        cp tmp\u002FXRoboToolkit-PC-Service\u002FRoboticsService\u002FPXREARobotSDK\u002Fbuild\u002FlibPXREARobotSDK.so lib\u002F\n        # rm -rf tmp\n\n        # Build the project\n        conda install -c conda-forge pybind11\n        pip uninstall -y xrobotoolkit_sdk\n        python setup.py install\n        ```\n\nYou should be all set!\n\nTo try it, check [this script from TWIST2](https:\u002F\u002Fgithub.com\u002Famazon-far\u002FTWIST2\u002Fblob\u002Fmaster\u002Fteleop.sh):\n```bash\nbash teleop.sh\n```\nYou should be able to see the retargeted robot motion in a mujoco window.\n\n### Retargeting from SMPL-X (AMASS, OMOMO) to Robot\n\n> [!NOTE]\n> NOTE: after install SMPL-X, change `ext` in `smplx\u002Fbody_models.py` from `npz` to `pkl` if you are using SMPL-X pkl files.\n\nRetarget a single motion:\n\n```bash\npython scripts\u002Fsmplx_to_robot.py --smplx_file \u003Cpath_to_smplx_data> --robot \u003Cpath_to_robot_data> --save_path \u003Cpath_to_save_robot_data.pkl> --rate_limit\n```\n\nBy default you should see the visualization of the retargeted robot motion in a mujoco window.\nIf you want to record video, add `--record_video` and `--video_path \u003Cyour_video_path,mp4>`.\n\n- `--rate_limit` is used to limit the rate of the retargeted robot motion to keep the same as the human motion. If you want it as fast as possible, remove `--rate_limit`.\n\nRetarget a folder of motions:\n\n```bash\npython scripts\u002Fsmplx_to_robot_dataset.py --src_folder \u003Cpath_to_dir_of_smplx_data> --tgt_folder \u003Cpath_to_dir_to_save_robot_data> --robot \u003Crobot_name>\n```\n\nBy default there is no visualization for batch retargeting.\n\n### Retargeting from GVHMR to Robot\n\nFirst, install GVHMR by following [their official instructions](https:\u002F\u002Fgithub.com\u002Fzju3dv\u002FGVHMR\u002Fblob\u002Fmain\u002Fdocs\u002FINSTALL.md).\n\nAnd run their demo that can extract human pose from monocular video:\n\n```bash\ncd path\u002Fto\u002FGVHMR\npython tools\u002Fdemo\u002Fdemo.py --video=docs\u002Fexample_video\u002Ftennis.mp4 -s\n```\n\nThen you should obtain the saved human pose data in `GVHMR\u002Foutputs\u002Fdemo\u002Ftennis\u002Fhmr4d_results.pt`.\n\nThen, run the command below to retarget the extracted human pose data to your robot:\n\n```bash\npython scripts\u002Fgvhmr_to_robot.py --gvhmr_pred_file \u003Cpath_to_hmr4d_results.pt> --robot unitree_g1 --record_video\n```\n\n\n\n## Retargeting from BVH (LAFAN1, Nokov) to Robot\n\nRetarget a single motion:\n\n```bash\n# single motion\npython scripts\u002Fbvh_to_robot.py --bvh_file \u003Cpath_to_bvh_data> --robot \u003Cpath_to_robot_data> --save_path \u003Cpath_to_save_robot_data.pkl> --rate_limit --format \u003Cformat>\n```\n\nBy default you should see the visualization of the retargeted robot motion in a mujoco window. \n- `--rate_limit` is used to limit the rate of the retargeted robot motion to keep the same as the human motion. If you want it as fast as possible, remove `--rate_limit`.\n- `--format` is used to specify the format of the BVH data. Supported formats are `lafan1` and `nokov`.\n\n\nRetarget a folder of motions:\n\n```bash\npython scripts\u002Fbvh_to_robot_dataset.py --src_folder \u003Cpath_to_dir_of_bvh_data> --tgt_folder \u003Cpath_to_dir_to_save_robot_data> --robot \u003Crobot_name>\n```\n\nBy default there is no visualization for batch retargeting.\n\n\n\n## Retargeting from Xsens to Robot\n\n### Offline: Xsens BVH to Robot\n\n#### Visualize Xsens BVH Data using MuJoCo\n\nInstall PyQt6:\n```bash\npip install PyQt6 PyQt6-Qt6 PyQt6-sip\n```\n\n\n```bash\npython general_motion_retargeting\u002Futils\u002Fxsens_vendor\u002Fmujoco_xsens_bvh_view.py \\\n  --bvh_file \u003Cpath_to_dir_of_bvh_data> \\\n  --scale \u003Cdisplacement scaling size> \\\n  --reset_to_zero\n```\nlike\n```bash\npython general_motion_retargeting\u002Futils\u002Fxsens_vendor\u002Fmujoco_xsens_bvh_view.py \\\n  --scale 0.01 \\\n  --bvh_file assets\u002Fxsens_bvh_test\u002F251021_04_boxing_120Hz_cm_3DsMax.bvh \\\n  --reset_to_zero\n```\n\n- `--start` is used to specify the initial processing frame. If no input is given, processing will start from the first frame by default.\n\n- `--end` is used to specify the final processing frame. If not input, it will be processed by default to the last frame.\n\n- `--reset_to_zero` is used to reset the displacement and Z-axis rotation to zero.This function, when used in combination with `--start`, will set the data to the initial zero position very well.Because sometimes the first one or two frames of some datasets differ too much from the subsequent data, these data need to be discarded.\n\n- `--scale` is used to set the scaling value of the displacement, which depends on the relationship between the unit used for the displacement in the dataset and the meter.\n\n- ##### Before using it, you must install PyQt6. `pip install PyQt6`\n- ##### Upon executing this command, a UI interface will be launched, enabling you to adjust the angle values for each channel in the x, y, and z directions of every joint. After completing the adjustments, click the `\"Apply and Preview\"` button, which will generate an `offset.json` file locally and perform a MuJoCo visualization playback of the BVH file. When running `xsens_bvh_to_robot.py`, it will read the data from this JSON file. Therefore, you need to execute `mujoco_xsens_bvh_view.py` prior to using `xsens_bvh_to_robot.py` for motion retargeting, to ensure that the `offset.json` file exists locally.\n\n#### Retarget a single motion:\n```bash\n# single motion\npython scripts\u002Fxsens_bvh_to_robot.py \\\n  --bvh_file \u003Cpath_to_bvh_data> \\\n  --robot \u003Cpath_to_robot_data> \\\n  --save_path \u003Cpath_to_save_robot_data.pkl> \\\n  --rate_limit \\\n  --start \u003Cnumber of the first frame> \\\n  --scale \u003Cdisplacement scaling size> \\\n  --reset_to_zero \\\n  --bvh_format \u003Cexported bvh format>\n```\nlike\n```bash\npython scripts\u002Fxsens_bvh_to_robot.py  \\\n  --robot unitree_h1_2 \\\n  --scale 0.01 \\\n  --reset_to_zero \\\n  --bvh_format 3DSM \\\n  --bvh_file assets\u002Fxsens_bvh_test\u002F251021_04_boxing_120Hz_cm_3DsMax.bvh \\\n  --save_path retargeting_data\u002Fh1\u002F251021_04_boxing_120Hz_cm_3DsMax.pkl\n```\n##### By default you should see the visualization of the retargeted robot motion in a mujoco window. \n- `--rate_limit` is used to limit the rate of the retargeted robot motion to keep the same as the human motion. If you want it as fast as possible, remove `--rate_limit`.\n\n- `--start` is used to specify the initial processing frame. If no input is given, processing will start from the first frame by default.\n\n- `--end` is used to specify the final processing frame. If not input, it will be processed by default to the last frame.\n\n- `--reset_to_zero` is used to reset the displacement and Z-axis rotation to zero.This function, when used in combination with `--start`, will set the data to the initial zero position very well.Because sometimes the first one or two frames of some datasets differ too much from the subsequent data, these data need to be discarded.\n\n- `--scale` is used to set the scaling value of the displacement, which depends on the relationship between the unit used for the displacement in the dataset and the meter.\n\n##### ！！！！！！！！！！！！！！！！！！ ATTENTION ！！！！！！！！！！！！！！！！！！！！\n- `--bvh_format` is used to set the format of the bvh being parsed. In the Xsens MVN software, BVH files in three formats can be exported. There will be some differences among BVH files in different formats. Here I recommend using the 3D Studio Max format.(In fact, I have not yet completed the parsing of data in other formats.)\n\n- The exported pkl file will represent quaternions in the `wxyz` format. ^ _ ^\n\n---\n\n### Online Streaming (Xsens MVN)\n\nStream live motion data from **Xsens MVN Software** directly into GMR for real-time robot retargeting.\n\n#### 1. Install the Xsens MVN UDP Data Parser\n\nThe `xsens_mvn_robot_python` library parses the Xsens MVN network datagram (Position + Orientation in quaternion format) into Python-accessible data structures. Install the correct `.whl` file for your Python version.\n\n```bash\n# Clone the parser repository\ngit clone https:\u002F\u002Fgithub.com\u002Fjiminghe\u002Fxsens_mvn_robot_python.git\ncd xsens_mvn_robot_python\n\n# Install the matching wheel for your Python version\n# Example for Python 3.10:\npip install xsens_mvn_robot_python-*-cp310-*.whl\n```\n\n> Select the `.whl` file whose filename contains your Python version tag (e.g. `cp310` for Python 3.10, `cp38` for Python 3.8). This library handles UDP socket binding and datagram unpacking automatically.\n\n#### 2. Configure the Xsens MVN Network Streamer\n\nLaunch **Xsens MVN Software** on either Windows or Linux. You can stream from a live recording session while wearing the Xsens Link \u002F Awinda suit, or replay a previously recorded `.mvn` file.\n\n| Step | Action |\n|---|---|\n| 1 | Click **Options → Network Streamer** |\n| 2 | In the pop-up window, click **Add** to create a new stream destination |\n| 3 | Set the **Host Address** (see table below) |\n| 4 | Under Network Streamer Options, tick **Position + Orientation (Quaternion)** only |\n| 5 | No other data sources are needed for GMR retargeting |\n| 6 | Click **OK** — confirm green status on the streamer |\n\n**Host Address Reference:**\n\n| Scenario | Host Address Setting |\n|---|---|\n| MVN on the same Linux machine (MVN Linux) | `127.0.0.1` (localhost) |\n| MVN on Windows → streaming to Ubuntu (same LAN) | Ubuntu IP address, e.g. `192.168.1.10` |\n\n> **Important:** When streaming from a Windows PC to an Ubuntu computer, ensure both machines are on the same LAN. Disable Windows Firewall for the MVN application or create an inbound UDP rule on the MVN default port (`9763`).\n\n#### 3. Run the GMR Live Streaming Script\n\nWith the Xsens MVN Network Streamer active and the conda environment loaded, run the live-streaming retargeting script. A MuJoCo window will open showing the retargeted Unitree G1 robot mirroring your movements in real time.\n\n```bash\n# Activate the GMR environment\nconda activate gmr\n\n# Run the Xsens live streaming retargeting script\npython scripts\u002Fxsens_live_streaming.py\n```\n\n### Retargeting from FBX (OptiTrack) to Robot\n\n#### Offline FBX Files\n\nRetarget a single motion:\n\n1. Install `fbx_sdk` by following [these instructions](https:\u002F\u002Fgithub.com\u002Fnv-tlabs\u002FASE\u002Ftree\u002Fmain\u002Fase\u002Fposelib#importing-from-fbx) and [these instructions](https:\u002F\u002Fgithub.com\u002Fnv-tlabs\u002FASE\u002Fissues\u002F61#issuecomment-2670315114). You will probably need a new conda environment for this.\n\n2. Activate the conda environment where you installed `fbx_sdk`.\nUse the following command to extract motion data from your `.fbx` file:\n\n```bash\ncd third_party\npython poselib\u002Ffbx_importer.py --input \u003Cpath_to_fbx_file.fbx> --output \u003Cpath_to_save_motion_data.pkl> --root-joint \u003Croot_joint_name> --fps \u003Cfps>\n```\n\n3. Then, run the command below to retarget the extracted motion data to your robot:\n\n```bash\nconda activate gmr\n# single motion\npython scripts\u002Ffbx_offline_to_robot.py --motion_file \u003Cpath_to_saved_motion_data.pkl> --robot \u003Cpath_to_robot_data> --save_path \u003Cpath_to_save_robot_data.pkl> --rate_limit\n```\n\nBy default you should see the visualization of the retargeted robot motion in a mujoco window. \n\n- `--rate_limit` is used to limit the rate of the retargeted robot motion to keep the same as the human motion. If you want it as fast as possible, remove `--rate_limit`.\n\n#### Online Streaming\n\nWe provide the script to use OptiTrack MoCap data for real-time streaming and retargeting.\n\nUsually you will have two computers, one is the server that installed with Motive (Desktop APP for OptiTrack) and the other is the client that installed with GMR.\n\nFind the server ip (the computer that installed with Motive) and client ip (your computer). Set the streaming as follows:\n\n![OptiTrack Streaming](.\u002Fassets\u002Foptitrack.png)\n\nAnd then run:\n\n```bash\npython scripts\u002Foptitrack_to_robot.py --server_ip \u003Cserver_ip> --client_ip \u003Cclient_ip> --use_multicast False --robot unitree_g1\n```\n\nYou should see the visualization of the retargeted robot motion in a mujoco window.\n\n### Visualize saved robot motion\n\nVisualize a single motions:\n\n```bash\npython scripts\u002Fvis_robot_motion.py --robot \u003Crobot_name> --robot_motion_path \u003Cpath_to_save_robot_data.pkl>\n```\n\nIf you want to record video, add `--record_video` and `--video_path \u003Cyour_video_path,mp4>`.\n\nVisualize a folder of motions:\n\n```bash\npython scripts\u002Fvis_robot_motion_dataset.py --robot \u003Crobot_name> --robot_motion_folder \u003Cpath_to_save_robot_data_folder>\n```\n\nAfter launching the MuJoCo visualization window and clicking on it, you can use the following keyboard controls::\n* `[`: play the previous motion\n* `]`: play the next motion\n* `space`: toggle play\u002Fpause\n\n## Speed Benchmark\n\n| CPU | Retargeting Speed |\n| --- | --- |\n| AMD Ryzen Threadripper 7960X 24-Cores | 60~70 FPS |\n| 13th Gen Intel Core i9-13900K 24-Cores | 35~45 FPS |\n| TBD | TBD |\n\n## Citation\n\nIf you find our code useful, please consider citing our related papers:\n\n```bibtex\n@article{joao2025gmr,\n  title={Retargeting Matters: General Motion Retargeting for Humanoid Motion Tracking},\n  author= {Joao Pedro Araujo and Yanjie Ze and Pei Xu and Jiajun Wu and C. Karen Liu},\n  year= {2025},\n  journal= {arXiv preprint arXiv:2510.02252}\n}\n```\n\n```bibtex\n@article{ze2025twist,\n  title={TWIST: Teleoperated Whole-Body Imitation System},\n  author= {Yanjie Ze and Zixuan Chen and João Pedro Araújo and Zi-ang Cao and Xue Bin Peng and Jiajun Wu and C. Karen Liu},\n  year= {2025},\n  journal= {arXiv preprint arXiv:2505.02833}\n}\n```\n\nand this github repo:\n\n```bibtex\n@software{ze2025gmr,\n  title={GMR: General Motion Retargeting},\n  author= {Yanjie Ze and João Pedro Araújo and Jiajun Wu and C. Karen Liu},\n  year= {2025},\n  url= {https:\u002F\u002Fgithub.com\u002FYanjieZe\u002FGMR},\n  note= {GitHub repository}\n}\n```\n\n## Known Issues\n\nDesigning a single config for all different humans is not trivial. We observe some motions might have bad retargeting results. If you observe some bad results, please let us know! We now have a collection of such motions in [TEST_MOTIONS.md](TEST_MOTIONS.md).\n\n## Acknowledgement\n\nOur IK solver is built upon [mink](https:\u002F\u002Fgithub.com\u002Fkevinzakka\u002Fmink) and [mujoco](https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fmujoco). Our visualization is built upon [mujoco](https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fmujoco). The human motion data we try includes [AMASS](https:\u002F\u002Famass.is.tue.mpg.de\u002F), [OMOMO](https:\u002F\u002Fgithub.com\u002Flijiaman\u002Fomomo_release), and [LAFAN1](https:\u002F\u002Fgithub.com\u002Fubisoft\u002Fubisoft-laforge-animation-dataset).\n\nThe original robot models can be found at the following locations:\n\n* [Berkley Humanoid Lite](https:\u002F\u002Fgithub.com\u002FHybridRobotics\u002FBerkeley-Humanoid-Lite-Assets): CC-BY-SA-4.0 license\n* [Booster K1](https:\u002F\u002Fwww.boosterobotics.com\u002F)\n* [Booster T1](https:\u002F\u002Fbooster.feishu.cn\u002Fwiki\u002FUvowwBes1iNvvUkoeeVc3p5wnUg) ([English](https:\u002F\u002Fbooster.feishu.cn\u002Fwiki\u002FDtFgwVXYxiBT8BksUPjcOwG4n4f))\n* [EngineAI PM01](https:\u002F\u002Fgithub.com\u002Fengineai-robotics\u002Fengineai_ros2_workspace): [Link to file](https:\u002F\u002Fgithub.com\u002Fengineai-robotics\u002Fengineai_ros2_workspace\u002Fblob\u002Fcommunity\u002Fsrc\u002Fsimulation\u002Fmujoco\u002Fassets\u002Fresource) \n* [Fourier N1](https:\u002F\u002Fgithub.com\u002FFFTAI\u002FWiki-GRx-Gym): [Link to file](https:\u002F\u002Fgithub.com\u002FFFTAI\u002FWiki-GRx-Gym\u002Ftree\u002FFourierN1\u002Flegged_gym\u002Fresources\u002Frobots\u002FN1)\n* [Galaxea R1 Pro](https:\u002F\u002Fgalaxea-dynamics.com\u002F): MIT license\n* [HighToqure Hi](https:\u002F\u002Fwww.hightorquerobotics.com\u002Fhi\u002F)\n* [LEJU Kuavo S45](https:\u002F\u002Fgitee.com\u002Fleju-robot\u002Fkuavo-ros-opensource\u002Fblob\u002Fmaster\u002FLICENSE): MIT license\n* [PAL Robotics' Talos](https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fmujoco_menagerie): [Link to file](https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fmujoco_menagerie\u002Ftree\u002Fmain\u002Fpal_talos)\n* [Toddlerbot](https:\u002F\u002Fgithub.com\u002Fhshi74\u002Ftoddlerbot): [Link to file](https:\u002F\u002Fgithub.com\u002Fhshi74\u002Ftoddlerbot\u002Ftree\u002Fmain\u002Ftoddlerbot\u002Fdescriptions\u002Ftoddlerbot_active)\n* [Unitree G1](https:\u002F\u002Fgithub.com\u002Funitreerobotics\u002Funitree_ros): [Link to file](https:\u002F\u002Fgithub.com\u002Funitreerobotics\u002Funitree_ros\u002Ftree\u002Fmaster\u002Frobots\u002Fg1_description)\n","GMR 是一个用于将人类动作实时重定向到各种类人机器人上的项目。其核心功能包括高质量的实时重定向，支持多种类人机器人和多种人类运动数据格式，并且经过精心调优以适应强化学习跟踪策略的需求。该项目采用 Python 编写，在 CPU 上运行，适用于需要实时全身远程操作的场景，如机器人控制、虚拟现实以及动画制作等领域。",2,"2026-06-11 03:42:37","high_star"]