{"id":85187,"date":"2026-07-27T05:00:43","date_gmt":"2026-07-26T21:00:43","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/85187.html"},"modified":"2026-07-27T05:00:43","modified_gmt":"2026-07-26T21:00:43","slug":"%e3%80%90locomotion%e3%80%91sonic%e5%85%a8%e8%ba%ab%e8%bf%90%e5%8a%a8%e8%b7%9f%e8%b8%aa%e4%bb%bf%e7%9c%9f%e9%83%a8%e7%bd%b2%e4%bf%9d%e5%a7%86%e7%ba%a7%e6%8c%87%e5%8d%97%ef%bc%9a%e9%80%82%e9%85%8d","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/85187.html","title":{"rendered":"\u3010locomotion\u3011SONIC\u5168\u8eab\u8fd0\u52a8\u8ddf\u8e2a\u4eff\u771f\u90e8\u7f72\u4fdd\u59c6\u7ea7\u6307\u5357\uff1a\u9002\u914d\u670d\u52a1\u5668\u7b49\u65e0\u53ef\u89c6\u5316\u754c\u9762\u60c5\u51b5"},"content":{"rendered":"<h3>\u5b98\u7f51\u6559\u7a0b<\/h3>\n<p>GR00T-WholeBodyControl \u8bba\u6587\u6807\u9898: SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control \u4f5c\u8005\u673a\u6784: \u82f1\u4f1f\u8fbe (Nvidia) \u8bba\u6587\u5730\u5740: https:\/\/arxiv.org\/abs\/2511.07820 \u9879\u76ee\u4e3b\u9875: https:\/\/nvlabs.github.io\/SONIC\/<\/p>\n<hr \/>\n<h3>Install<\/h3>\n<h4>0. \u5148\u5b89\u88c5TensorRT<\/h4>\n<p>\u8fdb\u5165NVIDIA \u5f00\u53d1\u8005\u7f51\u7ad9&#xff0c;\u627e\u4e00\u4e2a\u5bf9\u5e94\u7248\u672c\u7684\u5305\u8fdb\u884c\u4e0b\u8f7d\u3002\u6211\u8fd9\u91cc\u9009\u7684\u662f10.13\u7248\u672c&#xff0c;\u627e\u4e00\u4e2a\u5bf9\u5e94linux\u548ccuda\u7248\u672c\u7684tar\u5b89\u88c5\u5305&#xff0c;\u590d\u5236\u94fe\u63a5&#xff0c;\u7136\u540e\u7ec8\u7aef\u8f93\u5165&#xff1a;<\/p>\n<p><span class=\"token comment\"># wget &#043; \u4f60\u590d\u5236\u7684\u94fe\u63a5<\/span><br \/>\n<span class=\"token function\">wget<\/span> https:\/\/developer.nvidia.com\/downloads\/compute\/machine-learning\/tensorrt\/10.13.0\/tars\/TensorRT-10.13.0.35.Linux.x86_64-gnu.cuda-12.9.tar.gz<\/p>\n<p>\u4e0b\u8f7d\u5230\u672c\u5730\u76ee\u5f55\u5373\u53ef\u3002<\/p>\n<p>\u7136\u540e\u6309\u7167\u5b98\u65b9\u6559\u7a0b\u4e0b\u8f7dpv\u5e76\u89e3\u538btar\u5305&#xff1a;<\/p>\n<p><span class=\"token function\">sudo<\/span> <span class=\"token function\">apt-get<\/span> <span class=\"token function\">install<\/span> <span class=\"token parameter variable\">-y<\/span> <span class=\"token function\">pv<\/span><br \/>\n<span class=\"token comment\"># pv TensorRT-*.tar.gz | tar -xz -f -&#xff08;\u8fd9\u91cc\u6362\u6210\u4f60\u4e0b\u8f7d\u7684tar\u5305&#xff09;<\/span><br \/>\n<span class=\"token function\">pv<\/span> TensorRT-10.13.0.35.Linux.x86_64-gnu.cuda-12.9.tar.gz <span class=\"token operator\">|<\/span> <span class=\"token function\">tar<\/span> <span class=\"token parameter variable\">-xz<\/span> <span class=\"token parameter variable\">-f<\/span> &#8211;<\/p>\n<p>\u89e3\u538b\u540e\u6587\u4ef6\u4f4d\u7f6e&#xff1a;path\/to\/your\/packages\/TensorRT-10.13.0.35 \u9700\u8981\u5199\u5165~\/.bashrc&#xff0c;\u8fd9\u91cc\u4e3a\u4e86\u9632\u6b62\u673a\u5b50\u6bcf\u65e5\u5237\u65b0&#xff0c;\u76f4\u63a5\u5199\u6210\u56fa\u5b9a\u811a\u672c\u4e86&#xff0c;\u8bb0\u5f97\u4fee\u6539\u6210\u81ea\u5df1\u7684\u8def\u5f84&#xff1a;<\/p>\n<p><span class=\"token assign-left variable\">TENSORRT_ROOT<\/span><span class=\"token operator\">&#061;<\/span>path\/to\/your\/packages\/TensorRT-10.13.0.35<\/p>\n<p><span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-q<\/span> <span class=\"token string\">&#039;export TensorRT_ROOT&#061;path\/to\/your\/packages\/TensorRT-10.13.0.35&#039;<\/span> ~\/.bashrc <span class=\"token operator\">||<\/span> <span class=\"token function\">cat<\/span> <span class=\"token operator\">&gt;&gt;<\/span> ~\/.bashrc <span class=\"token operator\">&lt;&lt;<\/span><span class=\"token string\">EOF<\/p>\n<p># TensorRT<br \/>\nexport TensorRT_ROOT&#061;<span class=\"token variable\">$TENSORRT_ROOT<\/span><br \/>\nexport LD_LIBRARY_PATH&#061;\\\\<span class=\"token variable\">$TensorRT_ROOT<\/span>\/lib:\\\\<span class=\"token variable\">${LD_LIBRARY_PATH}<\/span><br \/>\nEOF<\/span><\/p>\n<p><span class=\"token builtin class-name\">source<\/span> ~\/.bashrc<\/p>\n<p><span class=\"token comment\"># \u68c0\u67e5<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token variable\">$TensorRT_ROOT<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token variable\">$LD_LIBRARY_PATH<\/span><\/p>\n<p>\u770b\u5230\u6253\u5370\u51fa\u7ed3\u679c&#xff0c;\u8bf4\u660e\u8fd9\u4e00\u6b65\u914d\u7f6e\u6210\u529f\u3002<\/p>\n<hr \/>\n<h4>1. \u514b\u9686\u4ed3\u5e93<\/h4>\n<p><span class=\"token function\">git<\/span> clone https:\/\/github.com\/NVlabs\/GR00T-WholeBodyControl.git<br \/>\n<span class=\"token builtin class-name\">cd<\/span> GR00T-WholeBodyControl<br \/>\n<span class=\"token function\">git<\/span> lfs pull          <span class=\"token comment\"># make sure all large files are fetched<\/span><\/p>\n<hr \/>\n<h4>2. Setup<\/h4>\n<p>\u8fd9\u91cc\u63a8\u8350\u7528\u5b98\u65b9\u7684Native Development&#xff1a;<\/p>\n<h5>2.1 \u5b89\u88c5\u7cfb\u7edf\u4f9d\u8d56\u9879<\/h5>\n<p><span class=\"token builtin class-name\">cd<\/span> gear_sonic_deploy<br \/>\n<span class=\"token function\">chmod<\/span> &#043;x scripts\/install_deps.sh<br \/>\n.\/scripts\/install_deps.sh<\/p>\n<h5>2.2 \u73af\u5883\u8bbe\u7f6e<\/h5>\n<p><span class=\"token builtin class-name\">source<\/span> scripts\/setup_env.sh<\/p>\n<h5>2.3 \u6784\u5efa\u9879\u76ee<\/h5>\n<p>just build<\/p>\n<h5>2.4 \u4e0b\u8f7dcheckpoints<\/h5>\n<p>\u5148\u7b80\u5355\u88c5\u4e2a\u73af\u5883&#xff0c;\u8fd9\u4e00\u6b65\u53ef\u6709\u53ef\u65e0<\/p>\n<p>conda create <span class=\"token parameter variable\">-n<\/span> sonic <span class=\"token assign-left variable\">python<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">3.10<\/span> <span class=\"token parameter variable\">-y<\/span><br \/>\nconda activate sonic<\/p>\n<p>\u5b89\u88c5\u4f9d\u8d56\u9879<\/p>\n<p>pip <span class=\"token function\">install<\/span> huggingface_hub<\/p>\n<p>\u8fd0\u884c\u4e0b\u8f7d\u811a\u672c<\/p>\n<p><span class=\"token builtin class-name\">cd<\/span> <span class=\"token punctuation\">..<\/span><br \/>\npython download_from_hf.py<\/p>\n<hr \/>\n<h4>3. \u4e00\u952e\u5b89\u88c5mujoco<\/h4>\n<p><span class=\"token function\">bash<\/span> install_scripts\/install_mujoco_sim.sh<\/p>\n<hr \/>\n<h3>Quick Start<\/h3>\n<h4>\u9488\u5bf9\u670d\u52a1\u5668\u7b49\u65e0\u53ef\u89c6\u5316\u754c\u9762\u60c5\u51b5<\/h4>\n<p>\u601d\u8def\u662f\u5148\u8fd0\u884cheadless\u5f97\u5230\u8fc7\u7a0b\u53c2\u6570&#xff0c;\u518d\u53e6\u5916\u7528\u53ef\u89c6\u5316\u811a\u672c\u6e32\u67d3\u51fa\u89c6\u9891\u5e76\u4fdd\u5b58\u3002<\/p>\n<h5>\u6bcf\u6b21\u73af\u5883\u542f\u52a8&#xff1a;<\/h5>\n<p><span class=\"token builtin class-name\">cd<\/span> gear_sonic_deploy<br \/>\n<span class=\"token builtin class-name\">source<\/span> scripts\/setup_env.sh<br \/>\njust build<\/p>\n<p><span class=\"token builtin class-name\">cd<\/span> <span class=\"token punctuation\">..<\/span><br \/>\n<span class=\"token builtin class-name\">source<\/span> .venv_sim\/bin\/activate<\/p>\n<h5>\u63a8\u7406\u90e8\u5206&#xff1a;<\/h5>\n<p>\u81ea\u5df1\u5199\u4e86\u4e00\u4e2aheadless\u542f\u52a8\u63a8\u7406 &#043; \u6e32\u67d3\u4e3a\u89c6\u9891\u7684\u811a\u672c&#xff0c;\u80fd\u6839\u636e\u9884\u8bbehumanoid motion\u5e8f\u5217\u6267\u884c\u3002<\/p>\n<h6>phase 1&#xff1a;headless\u542f\u52a8\u63a8\u7406<\/h6>\n<p><span class=\"token function\">bash<\/span> .\/gear_sonic\/scripts\/run_headless_reference_motion_phase1.sh<\/p>\n<h6>phase 2&#xff1a;\u6e32\u67d3\u4e3a\u89c6\u9891<\/h6>\n<p><span class=\"token function\">bash<\/span> .\/gear_sonic\/scripts\/run_headless_reference_motion_phase2.sh <span class=\"token punctuation\">\\\\<\/span><br \/>\n  .\/outputs\/headless_test\/sim_states.npz<\/p>\n<p>\u4e0b\u9762\u9644\u811a\u672c\u548c\u4ee3\u7801&#xff0c;\u90fd\u653e\u5728.\/gear_sonic\/scripts\u76ee\u5f55\u4e0b\u5373\u53ef&#xff1a;<\/p>\n<h6>run_headless_reference_motion_phase1.sh<\/h6>\n<p><span class=\"token shebang important\">#!\/usr\/bin\/env bash<\/span><br \/>\n<span class=\"token builtin class-name\">set<\/span> <span class=\"token parameter variable\">-euo<\/span> pipefail<\/p>\n<p><span class=\"token assign-left variable\">SCRIPT_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">cd<\/span> <span class=\"token string\">&#034;<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">dirname<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">${<span class=\"token environment constant\">BASH_SOURCE<\/span><span class=\"token punctuation\">[<\/span>0<span class=\"token punctuation\">]<\/span>}<\/span>&#034;<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token assign-left variable\">REPO_ROOT<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">cd<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$SCRIPT_DIR<\/span>\/..\/..&#034;<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token assign-left variable\">MOTION_PATH<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">${1<span class=\"token operator\">:-<\/span>$REPO_ROOT<span class=\"token operator\">\/<\/span>gear_sonic_deploy<span class=\"token operator\">\/<\/span>reference<span class=\"token operator\">\/<\/span>example<span class=\"token operator\">\/<\/span>squat_001__A359}<\/span>&#034;<\/span><\/p>\n<p><span class=\"token assign-left variable\">OUTPUT_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">${2<span class=\"token operator\">:-<\/span>$REPO_ROOT<span class=\"token operator\">\/<\/span>outputs<span class=\"token operator\">\/<\/span>headless_test}<\/span>&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">STATE_NAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">${3<span class=\"token operator\">:-<\/span>sim_states.npz}<\/span>&#034;<\/span><\/p>\n<p><span class=\"token assign-left variable\">EXTRA_ARGS<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">[<\/span> <span class=\"token variable\">$#<\/span> <span class=\"token parameter variable\">-gt<\/span> <span class=\"token number\">3<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n  <span class=\"token assign-left variable\">EXTRA_ARGS<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;<span class=\"token variable\">${&#064;<span class=\"token operator\">:<\/span>4}<\/span>&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token assign-left variable\">START_TIME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%s<span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token function-name function\">finish<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token builtin class-name\">local<\/span> <span class=\"token assign-left variable\">exit_code<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$?<\/span><br \/>\n  <span class=\"token builtin class-name\">local<\/span> end_time elapsed<br \/>\n  <span class=\"token assign-left variable\">end_time<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%s<span class=\"token variable\">)<\/span><\/span><br \/>\n  <span class=\"token assign-left variable\">elapsed<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$((<\/span>end_time <span class=\"token operator\">&#8211;<\/span> START_TIME<span class=\"token variable\">))<\/span><\/span><br \/>\n  <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[INFO] Phase 1 shell elapsed: <span class=\"token variable\">${elapsed}<\/span>s (exit&#061;<span class=\"token variable\">${exit_code}<\/span>)&#034;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token builtin class-name\">trap<\/span> finish EXIT<\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">[<\/span> <span class=\"token operator\">!<\/span> <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$REPO_ROOT<\/span>\/.venv_sim&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n  <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;.venv_sim was not found under <span class=\"token variable\">$REPO_ROOT<\/span>&#034;<\/span> <span class=\"token operator\">&gt;<\/span><span class=\"token file-descriptor important\">&amp;2<\/span><br \/>\n  <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Run: bash install_scripts\/install_mujoco_sim.sh&#034;<\/span> <span class=\"token operator\">&gt;<\/span><span class=\"token file-descriptor important\">&amp;2<\/span><br \/>\n  <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token builtin class-name\">source<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$REPO_ROOT<\/span>\/.venv_sim\/bin\/activate&#034;<\/span><\/p>\n<p>python <span class=\"token string\">&#034;<span class=\"token variable\">$SCRIPT_DIR<\/span>\/run_headless_reference_motion_phase1.py&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;motion-path <span class=\"token string\">&#034;<span class=\"token variable\">$MOTION_PATH<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;output-dir <span class=\"token string\">&#034;<span class=\"token variable\">$OUTPUT_DIR<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;state-name <span class=\"token string\">&#034;<span class=\"token variable\">$STATE_NAME<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;video-width <span class=\"token number\">1440<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;video-height <span class=\"token number\">832<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token string\">&#034;<span class=\"token variable\">${EXTRA_ARGS<span class=\"token punctuation\">[<\/span>&#064;<span class=\"token punctuation\">]<\/span>}<\/span>&#034;<\/span><\/p>\n<h6>run_headless_reference_motion_phase1.py<\/h6>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;Run SONIC headless reference motion Phase 1 only and save recorded qpos.&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> argparse<br \/>\n<span class=\"token keyword\">import<\/span> os<br \/>\n<span class=\"token keyword\">import<\/span> subprocess<br \/>\n<span class=\"token keyword\">import<\/span> threading<br \/>\n<span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">from<\/span> pathlib <span class=\"token keyword\">import<\/span> Path<\/p>\n<p><span class=\"token keyword\">import<\/span> numpy <span class=\"token keyword\">as<\/span> np<\/p>\n<p><span class=\"token keyword\">import<\/span> run_headless_reference_motion <span class=\"token keyword\">as<\/span> combined<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">parse_args<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> argparse<span class=\"token punctuation\">.<\/span>Namespace<span class=\"token punctuation\">:<\/span><br \/>\n    parser <span class=\"token operator\">&#061;<\/span> argparse<span class=\"token punctuation\">.<\/span>ArgumentParser<span class=\"token punctuation\">(<\/span><br \/>\n        description<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Run SONIC reference motion Phase 1 only and save times\/qpos snapshots.&#034;<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;motion-path&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>combined<span class=\"token punctuation\">.<\/span>DEPLOY_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;reference&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;example&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token string\">&#034;Either a motion dataset directory containing subfolders, or a single motion folder &#034;<\/span><br \/>\n            <span class=\"token string\">&#034;containing joint_pos.csv\/body_pos.csv\/etc.&#034;<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;motion-index&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Motion index inside the dataset directory. Ignored for a single motion folder.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;output-dir&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>combined<span class=\"token punctuation\">.<\/span>DEFAULT_OUTPUT_DIR<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Directory for the recorded qpos dump and deploy log.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;state-name&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>combined<span class=\"token punctuation\">.<\/span>DEFAULT_STATE_DUMP_NAME<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Output NPZ filename. The file stores both &#096;times&#096; and &#096;qpos&#096;.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;log-name&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>combined<span class=\"token punctuation\">.<\/span>DEFAULT_LOG_NAME<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Deploy log filename.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;video-width&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1280<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;video-height&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">720<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;warmup-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Wait time after starting the simulator before launching deploy.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;control-ready-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0.5<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Extra wait time after deploy init completes before sending the start key.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;play-delay-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Wait time between starting control and dropping the robot to the ground.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;drop-settle-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Wait time after dropping the robot before recording and starting playback.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;post-complete-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Extra simulation time after the motion completes before stopping.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;timeout-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">300.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Fail if the motion does not complete within this many seconds.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;sim-frequency&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">200<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Simulation frequency for the MuJoCo loop.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-distance&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2.8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Unused in Phase 1, kept for compatibility with the shared simulator builder.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-azimuth&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">120.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Unused in Phase 1, kept for compatibility with the shared simulator builder.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-elevation&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">25.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Unused in Phase 1, kept for compatibility with the shared simulator builder.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-lookat&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        nargs<span class=\"token operator\">&#061;<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.7<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        metavar<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;X&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Y&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Z&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Unused in Phase 1, kept for compatibility with the shared simulator builder.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;decoder&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>combined<span class=\"token punctuation\">.<\/span>DEPLOY_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;policy&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;release&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;model_decoder.onnx&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Decoder model path.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;encoder&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>combined<span class=\"token punctuation\">.<\/span>DEPLOY_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;policy&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;release&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;model_encoder.onnx&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Encoder model path.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;planner&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Optional planner model path. Leave unset for fixed reference-motion playback.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;obs-config&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>combined<span class=\"token punctuation\">.<\/span>DEPLOY_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;policy&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;release&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;observation_config.yaml&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Observation config path.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;skip-build&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        action<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;store_true&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Do not auto-build the deploy binary when missing.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> parser<span class=\"token punctuation\">.<\/span>parse_args<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">format_elapsed<\/span><span class=\"token punctuation\">(<\/span>seconds<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    minutes<span class=\"token punctuation\">,<\/span> seconds <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">divmod<\/span><span class=\"token punctuation\">(<\/span>seconds<span class=\"token punctuation\">,<\/span> <span class=\"token number\">60.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    hours<span class=\"token punctuation\">,<\/span> minutes <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">divmod<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>minutes<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">60<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> hours <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>hours<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">h <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>minutes<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">m <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>seconds<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#034;<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> minutes <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>minutes<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">m <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>seconds<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#034;<\/span><\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>seconds<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#034;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">resolve_optional_path<\/span><span class=\"token punctuation\">(<\/span>path<span class=\"token punctuation\">:<\/span> Path <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Path <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> path <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> path<span class=\"token punctuation\">.<\/span>expanduser<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">ensure_phase1_paths<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">:<\/span> argparse<span class=\"token punctuation\">.<\/span>Namespace<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    required_paths <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        args<span class=\"token punctuation\">.<\/span>decoder<span class=\"token punctuation\">,<\/span><br \/>\n        args<span class=\"token punctuation\">.<\/span>encoder<span class=\"token punctuation\">,<\/span><br \/>\n        args<span class=\"token punctuation\">.<\/span>obs_config<span class=\"token punctuation\">,<\/span><br \/>\n        args<span class=\"token punctuation\">.<\/span>motion_path<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> args<span class=\"token punctuation\">.<\/span>planner <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        required_paths<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>planner<span class=\"token punctuation\">)<\/span><br \/>\n    missing <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>path<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> path <span class=\"token keyword\">in<\/span> required_paths <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> missing<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Missing required paths:\\\\n  &#034;<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\n  &#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>missing<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">list_motion_folders<\/span><span class=\"token punctuation\">(<\/span>dataset_root<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>Path<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span><br \/>\n            path<br \/>\n            <span class=\"token keyword\">for<\/span> path <span class=\"token keyword\">in<\/span> dataset_root<span class=\"token punctuation\">.<\/span>iterdir<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> path<span class=\"token punctuation\">.<\/span>is_dir<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">and<\/span> <span class=\"token punctuation\">(<\/span>path <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;joint_pos.csv&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        key<span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">lambda<\/span> path<span class=\"token punctuation\">:<\/span> path<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">read_reference_timing<\/span><span class=\"token punctuation\">(<\/span>motion_dir<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">|<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">|<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    joint_pos_path <span class=\"token operator\">&#061;<\/span> motion_dir <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;joint_pos.csv&#034;<\/span><br \/>\n    metadata_path <span class=\"token operator\">&#061;<\/span> motion_dir <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;metadata.txt&#034;<\/span><br \/>\n    info_path <span class=\"token operator\">&#061;<\/span> motion_dir <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;info.txt&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> joint_pos_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;joint_pos.csv not found under motion folder: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>motion_dir<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">with<\/span> joint_pos_path<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;r&#034;<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">,<\/span> errors<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;ignore&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> f<span class=\"token punctuation\">:<\/span><br \/>\n        frame_count <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">max<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">sum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token keyword\">for<\/span> _ <span class=\"token keyword\">in<\/span> f<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    target_fps <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">50.0<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> info_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> line <span class=\"token keyword\">in<\/span> info_path<span class=\"token punctuation\">.<\/span>read_text<span class=\"token punctuation\">(<\/span>encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">,<\/span> errors<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;ignore&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>splitlines<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> line<span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;target_fps:&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                target_fps <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>line<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;:&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> line<span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Target FPS:&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                target_fps <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>line<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;:&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><br \/>\n    <span class=\"token keyword\">elif<\/span> metadata_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> line <span class=\"token keyword\">in<\/span> metadata_path<span class=\"token punctuation\">.<\/span>read_text<span class=\"token punctuation\">(<\/span>encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">,<\/span> errors<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;ignore&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>splitlines<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> line<span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Total timesteps:&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                metadata_frames <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>line<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;:&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> metadata_frames <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">and<\/span> frame_count <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    frame_count <span class=\"token operator\">&#061;<\/span> metadata_frames<br \/>\n                <span class=\"token keyword\">break<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> target_fps <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        target_fps <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">50.0<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;motion_name&#034;<\/span><span class=\"token punctuation\">:<\/span> motion_dir<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;reference_frames&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>frame_count<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;reference_fps&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>target_fps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;reference_duration_seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>frame_count<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>target_fps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">write_state_metadata<\/span><span class=\"token punctuation\">(<\/span>state_path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span> reference_timing<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">|<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">|<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> np<span class=\"token punctuation\">.<\/span>load<span class=\"token punctuation\">(<\/span>state_path<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> data<span class=\"token punctuation\">:<\/span><br \/>\n        payload <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span>name<span class=\"token punctuation\">:<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">[<\/span>name<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> name <span class=\"token keyword\">in<\/span> data<span class=\"token punctuation\">.<\/span>files<span class=\"token punctuation\">}<\/span><\/p>\n<p>    times <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;times&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><br \/>\n    recorded_duration <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> times<span class=\"token punctuation\">.<\/span>size <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token number\">0.0<\/span><br \/>\n    reference_duration <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>reference_timing<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;reference_duration_seconds&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    render_end_time <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">min<\/span><span class=\"token punctuation\">(<\/span>reference_duration<span class=\"token punctuation\">,<\/span> recorded_duration<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> recorded_duration <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token number\">0.0<\/span><\/p>\n<p>    payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;reference_frames&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>reference_timing<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;reference_frames&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>int64<span class=\"token punctuation\">)<\/span><br \/>\n    payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;reference_fps&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>reference_timing<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;reference_fps&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><br \/>\n    payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;reference_duration_seconds&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>reference_duration<span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><br \/>\n    payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;render_start_time_seconds&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span><span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><br \/>\n    payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;render_end_time_seconds&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>render_end_time<span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><\/p>\n<p>    tmp_path <span class=\"token operator\">&#061;<\/span> state_path<span class=\"token punctuation\">.<\/span>with_name<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>state_path<span class=\"token punctuation\">.<\/span>stem<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">.tmp.npz&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    np<span class=\"token punctuation\">.<\/span>savez_compressed<span class=\"token punctuation\">(<\/span>tmp_path<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>payload<span class=\"token punctuation\">)<\/span><br \/>\n    tmp_path<span class=\"token punctuation\">.<\/span>replace<span class=\"token punctuation\">(<\/span>state_path<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;recorded_duration_seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> recorded_duration<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;render_end_time_seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> render_end_time<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    args <span class=\"token operator\">&#061;<\/span> parse_args<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    start_time <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    args<span class=\"token punctuation\">.<\/span>motion_path <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>motion_path<span class=\"token punctuation\">.<\/span>expanduser<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    args<span class=\"token punctuation\">.<\/span>output_dir <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>output_dir<span class=\"token punctuation\">.<\/span>expanduser<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    args<span class=\"token punctuation\">.<\/span>decoder <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>decoder<span class=\"token punctuation\">.<\/span>expanduser<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    args<span class=\"token punctuation\">.<\/span>encoder <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>encoder<span class=\"token punctuation\">.<\/span>expanduser<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    args<span class=\"token punctuation\">.<\/span>obs_config <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>obs_config<span class=\"token punctuation\">.<\/span>expanduser<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    args<span class=\"token punctuation\">.<\/span>planner <span class=\"token operator\">&#061;<\/span> resolve_optional_path<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>planner<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        ensure_phase1_paths<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">)<\/span><br \/>\n        combined<span class=\"token punctuation\">.<\/span>ensure_deploy_binary<span class=\"token punctuation\">(<\/span>skip_build<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>skip_build<span class=\"token punctuation\">)<\/span><\/p>\n<p>        args<span class=\"token punctuation\">.<\/span>output_dir<span class=\"token punctuation\">.<\/span>mkdir<span class=\"token punctuation\">(<\/span>parents<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> exist_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        state_path <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>output_dir <span class=\"token operator\">\/<\/span> args<span class=\"token punctuation\">.<\/span>state_name<br \/>\n        log_path <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>output_dir <span class=\"token operator\">\/<\/span> args<span class=\"token punctuation\">.<\/span>log_name<\/p>\n<p>        dataset_root<span class=\"token punctuation\">,<\/span> dataset_motion_index<span class=\"token punctuation\">,<\/span> temp_dir <span class=\"token operator\">&#061;<\/span> combined<span class=\"token punctuation\">.<\/span>prepare_motion_dataset<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>motion_path<span class=\"token punctuation\">)<\/span><br \/>\n        motion_index <span class=\"token operator\">&#061;<\/span> dataset_motion_index <span class=\"token keyword\">if<\/span> temp_dir <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token keyword\">else<\/span> args<span class=\"token punctuation\">.<\/span>motion_index<br \/>\n        motion_folders <span class=\"token operator\">&#061;<\/span> list_motion_folders<span class=\"token punctuation\">(<\/span>dataset_root<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> motion_folders<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;No motion folders with joint_pos.csv found under: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>dataset_root<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> motion_index <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">or<\/span> motion_index <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>motion_folders<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> IndexError<span class=\"token punctuation\">(<\/span><br \/>\n                <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Motion index <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>motion_index<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> is out of range for dataset <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>dataset_root<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> &#034;<\/span><\/span><br \/>\n                <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;(found <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>motion_folders<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> motions).&#034;<\/span><\/span><br \/>\n            <span class=\"token punctuation\">)<\/span><br \/>\n        selected_motion_dir <span class=\"token operator\">&#061;<\/span> motion_folders<span class=\"token punctuation\">[<\/span>motion_index<span class=\"token punctuation\">]<\/span><br \/>\n        reference_timing <span class=\"token operator\">&#061;<\/span> read_reference_timing<span class=\"token punctuation\">(<\/span>selected_motion_dir<span class=\"token punctuation\">)<\/span><\/p>\n<p>        stop_event <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        record_event <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        sim_ready_event <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        sim_status<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">object<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        sim_thread <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Thread<span class=\"token punctuation\">(<\/span><br \/>\n            target<span class=\"token operator\">&#061;<\/span>combined<span class=\"token punctuation\">.<\/span>run_headless_simulation<span class=\"token punctuation\">,<\/span><br \/>\n            args<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">,<\/span> state_path<span class=\"token punctuation\">,<\/span> stop_event<span class=\"token punctuation\">,<\/span> record_event<span class=\"token punctuation\">,<\/span> sim_ready_event<span class=\"token punctuation\">,<\/span> sim_status<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            daemon<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><\/p>\n<p>        process<span class=\"token punctuation\">:<\/span> subprocess<span class=\"token punctuation\">.<\/span>Popen<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">bytes<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n        master_fd<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n        monitor<span class=\"token punctuation\">:<\/span> combined<span class=\"token punctuation\">.<\/span>DeployMonitor <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p>        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            sim_thread<span class=\"token punctuation\">.<\/span>start<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> sim_ready_event<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">30.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">raise<\/span> TimeoutError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Timed out waiting for the headless simulator to start.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;error&#034;<\/span> <span class=\"token keyword\">in<\/span> sim_status<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Simulator thread failed during startup: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>sim_status<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;error&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>warmup_seconds<span class=\"token punctuation\">)<\/span><\/p>\n<p>            process<span class=\"token punctuation\">,<\/span> master_fd<span class=\"token punctuation\">,<\/span> monitor <span class=\"token operator\">&#061;<\/span> combined<span class=\"token punctuation\">.<\/span>launch_deploy<span class=\"token punctuation\">(<\/span><br \/>\n                dataset_root<span class=\"token operator\">&#061;<\/span>dataset_root<span class=\"token punctuation\">,<\/span><br \/>\n                args<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">,<\/span><br \/>\n                log_path<span class=\"token operator\">&#061;<\/span>log_path<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">)<\/span><br \/>\n            combined<span class=\"token punctuation\">.<\/span>automate_deploy<span class=\"token punctuation\">(<\/span><br \/>\n                process<span class=\"token operator\">&#061;<\/span>process<span class=\"token punctuation\">,<\/span><br \/>\n                master_fd<span class=\"token operator\">&#061;<\/span>master_fd<span class=\"token punctuation\">,<\/span><br \/>\n                monitor<span class=\"token operator\">&#061;<\/span>monitor<span class=\"token punctuation\">,<\/span><br \/>\n                motion_index<span class=\"token operator\">&#061;<\/span>motion_index<span class=\"token punctuation\">,<\/span><br \/>\n                control_ready_seconds<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>control_ready_seconds<span class=\"token punctuation\">,<\/span><br \/>\n                play_delay_seconds<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>play_delay_seconds<span class=\"token punctuation\">,<\/span><br \/>\n                drop_settle_seconds<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>drop_settle_seconds<span class=\"token punctuation\">,<\/span><br \/>\n                post_complete_seconds<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>post_complete_seconds<span class=\"token punctuation\">,<\/span><br \/>\n                timeout_seconds<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>timeout_seconds<span class=\"token punctuation\">,<\/span><br \/>\n                sim_status<span class=\"token operator\">&#061;<\/span>sim_status<span class=\"token punctuation\">,<\/span><br \/>\n                record_event<span class=\"token operator\">&#061;<\/span>record_event<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">)<\/span><br \/>\n            combined<span class=\"token punctuation\">.<\/span>wait_for_process_exit<span class=\"token punctuation\">(<\/span>process<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            stop_event<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            sim_thread<span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">10.0<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> monitor <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                monitor<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> master_fd <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    os<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span>master_fd<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">except<\/span> OSError<span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">pass<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> process <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token keyword\">and<\/span> process<span class=\"token punctuation\">.<\/span>poll<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                combined<span class=\"token punctuation\">.<\/span>wait_for_process_exit<span class=\"token punctuation\">(<\/span>process<span class=\"token punctuation\">,<\/span> timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">5.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> temp_dir <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                temp_dir<span class=\"token punctuation\">.<\/span>cleanup<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;error&#034;<\/span> <span class=\"token keyword\">in<\/span> sim_status<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Simulator thread failed: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>sim_status<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;error&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> state_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Expected recorded state dump was not created: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>state_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        state_timing <span class=\"token operator\">&#061;<\/span> write_state_metadata<span class=\"token punctuation\">(<\/span>state_path<span class=\"token punctuation\">,<\/span> reference_timing<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">with<\/span> np<span class=\"token punctuation\">.<\/span>load<span class=\"token punctuation\">(<\/span>state_path<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> data<span class=\"token punctuation\">:<\/span><br \/>\n            times <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;times&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><br \/>\n        duration_seconds <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> times<span class=\"token punctuation\">.<\/span>size <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token number\">0.0<\/span><\/p>\n<p>        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\\\\nPhase 1 state dump saved to: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>state_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Deploy log saved to: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>log_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Recorded frames: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">.<\/span>size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Recorded motion duration: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>duration_seconds<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token string\">&#034;Reference motion window: &#034;<\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>reference_timing<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;reference_duration_seconds&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s &#034;<\/span><\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;(<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>reference_timing<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;reference_frames&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> frames &#064; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>reference_timing<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;reference_fps&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">Hz)&#034;<\/span><\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Auto-trim render end time: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>state_timing<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;render_end_time_seconds&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><br \/>\n    <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        elapsed <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> start_time<br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Phase 1 elapsed time: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>format_elapsed<span class=\"token punctuation\">(<\/span>elapsed<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">raise<\/span> SystemExit<span class=\"token punctuation\">(<\/span>main<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h6>run_headless_reference_motion_phase2.sh<\/h6>\n<p><span class=\"token shebang important\">#!\/usr\/bin\/env bash<\/span><br \/>\n<span class=\"token builtin class-name\">set<\/span> <span class=\"token parameter variable\">-euo<\/span> pipefail<\/p>\n<p><span class=\"token assign-left variable\">SCRIPT_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">cd<\/span> <span class=\"token string\">&#034;<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">dirname<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">${<span class=\"token environment constant\">BASH_SOURCE<\/span><span class=\"token punctuation\">[<\/span>0<span class=\"token punctuation\">]<\/span>}<\/span>&#034;<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token assign-left variable\">REPO_ROOT<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token builtin class-name\">cd<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$SCRIPT_DIR<\/span>\/..\/..&#034;<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token builtin class-name\">pwd<\/span><span class=\"token variable\">)<\/span><\/span><\/p>\n<p><span class=\"token assign-left variable\">STATE_PATH<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">${1<span class=\"token operator\">:-<\/span>$REPO_ROOT<span class=\"token operator\">\/<\/span>outputs<span class=\"token operator\">\/<\/span>headless_test<span class=\"token operator\">\/<\/span>sim_states.npz}<\/span>&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">OUTPUT_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">${2<span class=\"token operator\">:-<\/span>$(dirname &#034;$STATE_PATH&#034;)}<\/span>&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">VIDEO_NAME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">${3<span class=\"token operator\">:-<\/span>headless_motion.mp4}<\/span>&#034;<\/span><\/p>\n<p><span class=\"token assign-left variable\">EXTRA_ARGS<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">[<\/span> <span class=\"token variable\">$#<\/span> <span class=\"token parameter variable\">-gt<\/span> <span class=\"token number\">3<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n  <span class=\"token assign-left variable\">EXTRA_ARGS<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;<span class=\"token variable\">${&#064;<span class=\"token operator\">:<\/span>4}<\/span>&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token assign-left variable\">START_TIME<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%s<span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token function-name function\">finish<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token builtin class-name\">local<\/span> <span class=\"token assign-left variable\">exit_code<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\">$?<\/span><br \/>\n  <span class=\"token builtin class-name\">local<\/span> end_time elapsed<br \/>\n  <span class=\"token assign-left variable\">end_time<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%s<span class=\"token variable\">)<\/span><\/span><br \/>\n  <span class=\"token assign-left variable\">elapsed<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$((<\/span>end_time <span class=\"token operator\">&#8211;<\/span> START_TIME<span class=\"token variable\">))<\/span><\/span><br \/>\n  <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;[INFO] Phase 2 shell elapsed: <span class=\"token variable\">${elapsed}<\/span>s (exit&#061;<span class=\"token variable\">${exit_code}<\/span>)&#034;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token builtin class-name\">trap<\/span> finish EXIT<\/p>\n<p><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">[<\/span> <span class=\"token operator\">!<\/span> <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$REPO_ROOT<\/span>\/.venv_sim&#034;<\/span> <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">then<\/span><br \/>\n  <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;.venv_sim was not found under <span class=\"token variable\">$REPO_ROOT<\/span>&#034;<\/span> <span class=\"token operator\">&gt;<\/span><span class=\"token file-descriptor important\">&amp;2<\/span><br \/>\n  <span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Run: bash install_scripts\/install_mujoco_sim.sh&#034;<\/span> <span class=\"token operator\">&gt;<\/span><span class=\"token file-descriptor important\">&amp;2<\/span><br \/>\n  <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">fi<\/span><\/p>\n<p><span class=\"token builtin class-name\">source<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$REPO_ROOT<\/span>\/.venv_sim\/bin\/activate&#034;<\/span><\/p>\n<p>python <span class=\"token string\">&#034;<span class=\"token variable\">$SCRIPT_DIR<\/span>\/run_headless_reference_motion_phase2.py&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;state-path <span class=\"token string\">&#034;<span class=\"token variable\">$STATE_PATH<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;output-dir <span class=\"token string\">&#034;<span class=\"token variable\">$OUTPUT_DIR<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;video-name <span class=\"token string\">&#034;<span class=\"token variable\">$VIDEO_NAME<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;video-width <span class=\"token number\">1440<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;video-height <span class=\"token number\">832<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  &#8211;video-fps <span class=\"token number\">15<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token string\">&#034;<span class=\"token variable\">${EXTRA_ARGS<span class=\"token punctuation\">[<\/span>&#064;<span class=\"token punctuation\">]<\/span>}<\/span>&#034;<\/span><\/p>\n<h6>run_headless_reference_motion_phase2.py<\/h6>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;Run SONIC headless reference motion Phase 2 only and render a video from qpos.&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> argparse<br \/>\n<span class=\"token keyword\">import<\/span> re<br \/>\n<span class=\"token keyword\">import<\/span> tempfile<br \/>\n<span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">from<\/span> pathlib <span class=\"token keyword\">import<\/span> Path<\/p>\n<p><span class=\"token keyword\">import<\/span> numpy <span class=\"token keyword\">as<\/span> np<\/p>\n<p><span class=\"token keyword\">import<\/span> run_headless_reference_motion <span class=\"token keyword\">as<\/span> combined<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">parse_args<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> argparse<span class=\"token punctuation\">.<\/span>Namespace<span class=\"token punctuation\">:<\/span><br \/>\n    parser <span class=\"token operator\">&#061;<\/span> argparse<span class=\"token punctuation\">.<\/span>ArgumentParser<span class=\"token punctuation\">(<\/span><br \/>\n        description<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Render a recorded SONIC qpos dump into an MP4 video.&#034;<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;state-path&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>combined<span class=\"token punctuation\">.<\/span>DEFAULT_OUTPUT_DIR <span class=\"token operator\">\/<\/span> combined<span class=\"token punctuation\">.<\/span>DEFAULT_STATE_DUMP_NAME<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Input NPZ path produced by Phase 1. The file must contain &#096;times&#096; and &#096;qpos&#096;.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;output-dir&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Directory for the rendered video. Defaults to the state file parent directory.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;video-name&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;headless_motion.mp4&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Output video filename.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;video-width&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1280<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;video-height&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">720<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;video-fps&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">15<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;no-auto-trim&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        action<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;store_true&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Render the full recorded qpos dump instead of trimming to the saved reference-motion window.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;trim-end-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Optional manual render end time in seconds. Overrides the auto-trim window.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;sim-frequency&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">200<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Simulation frequency used to build the offscreen simulator.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-distance&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2.8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Tracking camera distance.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-azimuth&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">120.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Tracking camera azimuth in degrees.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-elevation&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">25.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Tracking camera elevation in degrees.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-lookat&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        nargs<span class=\"token operator\">&#061;<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.7<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        metavar<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;X&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Y&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Z&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Tracking camera lookat point.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> parser<span class=\"token punctuation\">.<\/span>parse_args<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">format_elapsed<\/span><span class=\"token punctuation\">(<\/span>seconds<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    minutes<span class=\"token punctuation\">,<\/span> seconds <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">divmod<\/span><span class=\"token punctuation\">(<\/span>seconds<span class=\"token punctuation\">,<\/span> <span class=\"token number\">60.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    hours<span class=\"token punctuation\">,<\/span> minutes <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">divmod<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>minutes<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">60<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> hours <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>hours<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">h <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>minutes<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">m <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>seconds<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#034;<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> minutes <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>minutes<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">m <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>seconds<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#034;<\/span><\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>seconds<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#034;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">ensure_phase2_inputs<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">:<\/span> argparse<span class=\"token punctuation\">.<\/span>Namespace<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> args<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Phase 1 state file not found: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>args<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> args<span class=\"token punctuation\">.<\/span>video_width <span class=\"token operator\">%<\/span> <span class=\"token number\">2<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">or<\/span> args<span class=\"token punctuation\">.<\/span>video_height <span class=\"token operator\">%<\/span> <span class=\"token number\">2<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;H.264 yuv420p output requires even video dimensions.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    combined<span class=\"token punctuation\">.<\/span>ensure_ffmpeg_available<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">infer_trim_end_from_deploy_log<\/span><span class=\"token punctuation\">(<\/span>state_path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    log_path <span class=\"token operator\">&#061;<\/span> state_path<span class=\"token punctuation\">.<\/span>with_name<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;deploy.log&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> log_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p>    text <span class=\"token operator\">&#061;<\/span> log_path<span class=\"token punctuation\">.<\/span>read_text<span class=\"token punctuation\">(<\/span>encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">,<\/span> errors<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;ignore&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    matches <span class=\"token operator\">&#061;<\/span> re<span class=\"token punctuation\">.<\/span>findall<span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;Loaded .* \\\\((\\\\d&#043;) timesteps\\\\)&#034;<\/span><span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> matches<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p>    timesteps <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>matches<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> timesteps <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>timesteps<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">50.0<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">build_trimmed_state_file<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">:<\/span> argparse<span class=\"token punctuation\">.<\/span>Namespace<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span>Path<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> np<span class=\"token punctuation\">.<\/span>load<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> data<span class=\"token punctuation\">:<\/span><br \/>\n        payload <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span>name<span class=\"token punctuation\">:<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">[<\/span>name<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> name <span class=\"token keyword\">in<\/span> data<span class=\"token punctuation\">.<\/span>files<span class=\"token punctuation\">}<\/span><\/p>\n<p>    times <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;times&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><br \/>\n    qpos <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;qpos&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> times<span class=\"token punctuation\">.<\/span>size <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;The input state dump is empty.&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    trim_start <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><br \/>\n    trim_end<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> args<span class=\"token punctuation\">.<\/span>trim_end_seconds <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        trim_end <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>trim_end_seconds<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">elif<\/span> <span class=\"token keyword\">not<\/span> args<span class=\"token punctuation\">.<\/span>no_auto_trim <span class=\"token keyword\">and<\/span> <span class=\"token string\">&#034;render_end_time_seconds&#034;<\/span> <span class=\"token keyword\">in<\/span> payload<span class=\"token punctuation\">:<\/span><br \/>\n        trim_end <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;render_end_time_seconds&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>item<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;render_start_time_seconds&#034;<\/span> <span class=\"token keyword\">in<\/span> payload<span class=\"token punctuation\">:<\/span><br \/>\n            trim_start <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;render_start_time_seconds&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>item<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">elif<\/span> <span class=\"token keyword\">not<\/span> args<span class=\"token punctuation\">.<\/span>no_auto_trim<span class=\"token punctuation\">:<\/span><br \/>\n        trim_end <span class=\"token operator\">&#061;<\/span> infer_trim_end_from_deploy_log<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> trim_end <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> args<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;trim_applied&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;render_duration_seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> times<span class=\"token punctuation\">.<\/span>size <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>    trim_start <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">max<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> trim_start<span class=\"token punctuation\">)<\/span><br \/>\n    trim_end <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">max<\/span><span class=\"token punctuation\">(<\/span>trim_start<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">min<\/span><span class=\"token punctuation\">(<\/span>trim_end<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    mask <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>times <span class=\"token operator\">&gt;&#061;<\/span> trim_start <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1e-9<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;<\/span> <span class=\"token punctuation\">(<\/span>times <span class=\"token operator\">&lt;&#061;<\/span> trim_end <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1e-9<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> np<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">any<\/span><span class=\"token punctuation\">(<\/span>mask<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        nearest <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>np<span class=\"token punctuation\">.<\/span>argmin<span class=\"token punctuation\">(<\/span>np<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">abs<\/span><span class=\"token punctuation\">(<\/span>times <span class=\"token operator\">&#8211;<\/span> trim_end<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        mask <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>zeros<span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">.<\/span>shape<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        mask<span class=\"token punctuation\">[<\/span>nearest<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><\/p>\n<p>    trimmed_times <span class=\"token operator\">&#061;<\/span> times<span class=\"token punctuation\">[<\/span>mask<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>copy<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    trimmed_qpos <span class=\"token operator\">&#061;<\/span> qpos<span class=\"token punctuation\">[<\/span>mask<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>copy<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    trimmed_times <span class=\"token operator\">-&#061;<\/span> trimmed_times<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>    payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;times&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> trimmed_times<br \/>\n    payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;qpos&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> trimmed_qpos<br \/>\n    payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;render_start_time_seconds&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span><span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><br \/>\n    payload<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;render_end_time_seconds&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>trimmed_times<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> trimmed_times<span class=\"token punctuation\">.<\/span>size <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">with<\/span> tempfile<span class=\"token punctuation\">.<\/span>NamedTemporaryFile<span class=\"token punctuation\">(<\/span>prefix<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;phase2_trimmed_&#034;<\/span><span class=\"token punctuation\">,<\/span> suffix<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;.npz&#034;<\/span><span class=\"token punctuation\">,<\/span> delete<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> tmp<span class=\"token punctuation\">:<\/span><br \/>\n        temp_state_path <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>tmp<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">)<\/span><br \/>\n    np<span class=\"token punctuation\">.<\/span>savez_compressed<span class=\"token punctuation\">(<\/span>temp_state_path<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>payload<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> temp_state_path<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;trim_applied&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>trimmed_times<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;render_duration_seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>trimmed_times<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> trimmed_times<span class=\"token punctuation\">.<\/span>size <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    args <span class=\"token operator\">&#061;<\/span> parse_args<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    start_time <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    args<span class=\"token punctuation\">.<\/span>state_path <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">.<\/span>expanduser<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    args<span class=\"token punctuation\">.<\/span>output_dir <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n        args<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">.<\/span>parent <span class=\"token keyword\">if<\/span> args<span class=\"token punctuation\">.<\/span>output_dir <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token keyword\">else<\/span> args<span class=\"token punctuation\">.<\/span>output_dir<span class=\"token punctuation\">.<\/span>expanduser<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        ensure_phase2_inputs<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">)<\/span><br \/>\n        args<span class=\"token punctuation\">.<\/span>output_dir<span class=\"token punctuation\">.<\/span>mkdir<span class=\"token punctuation\">(<\/span>parents<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> exist_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        video_path <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>output_dir <span class=\"token operator\">\/<\/span> args<span class=\"token punctuation\">.<\/span>video_name<\/p>\n<p>        <span class=\"token keyword\">with<\/span> np<span class=\"token punctuation\">.<\/span>load<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> data<span class=\"token punctuation\">:<\/span><br \/>\n            times <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;times&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><br \/>\n        duration_seconds <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> times<span class=\"token punctuation\">.<\/span>size <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token number\">0.0<\/span><\/p>\n<p>        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Input state file: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>args<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Input frames: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">.<\/span>size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Input motion duration: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>duration_seconds<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        state_for_render<span class=\"token punctuation\">,<\/span> trim_info <span class=\"token operator\">&#061;<\/span> build_trimmed_state_file<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> state_for_render <span class=\"token operator\">!&#061;<\/span> args<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Trimmed render duration: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>trim_info<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;render_duration_seconds&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            combined<span class=\"token punctuation\">.<\/span>render_recorded_video<span class=\"token punctuation\">(<\/span><br \/>\n                args<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">,<\/span><br \/>\n                state_path<span class=\"token operator\">&#061;<\/span>state_for_render<span class=\"token punctuation\">,<\/span><br \/>\n                video_path<span class=\"token operator\">&#061;<\/span>video_path<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> state_for_render <span class=\"token operator\">!&#061;<\/span> args<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">:<\/span><br \/>\n                state_for_render<span class=\"token punctuation\">.<\/span>unlink<span class=\"token punctuation\">(<\/span>missing_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> video_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Expected output video was not created: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>video_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\\\\nPhase 2 video saved to: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>video_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><br \/>\n    <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        elapsed <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> start_time<br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Phase 2 elapsed time: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>format_elapsed<span class=\"token punctuation\">(<\/span>elapsed<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">raise<\/span> SystemExit<span class=\"token punctuation\">(<\/span>main<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h6>run_headless_reference_motion.py<\/h6>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;Run a headless SONIC reference motion in two phases and save an MP4.<\/p>\n<p>Phase 1:<br \/>\n&#8211; start MuJoCo &#043; deploy headlessly<br \/>\n&#8211; run the reference motion without any rendering work in the control loop<br \/>\n&#8211; record MuJoCo qpos snapshots to disk<\/p>\n<p>Phase 2:<br \/>\n&#8211; replay the recorded qpos snapshots offscreen<br \/>\n&#8211; encode the final video with ffmpeg\/libx264 for broad player compatibility<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> argparse<br \/>\n<span class=\"token keyword\">import<\/span> os<br \/>\n<span class=\"token keyword\">import<\/span> pty<br \/>\n<span class=\"token keyword\">import<\/span> shlex<br \/>\n<span class=\"token keyword\">import<\/span> shutil<br \/>\n<span class=\"token keyword\">import<\/span> subprocess<br \/>\n<span class=\"token keyword\">import<\/span> sys<br \/>\n<span class=\"token keyword\">import<\/span> tempfile<br \/>\n<span class=\"token keyword\">import<\/span> threading<br \/>\n<span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">import<\/span> xml<span class=\"token punctuation\">.<\/span>etree<span class=\"token punctuation\">.<\/span>ElementTree <span class=\"token keyword\">as<\/span> ET<br \/>\n<span class=\"token keyword\">from<\/span> pathlib <span class=\"token keyword\">import<\/span> Path<\/p>\n<p><span class=\"token comment\"># Configure headless MuJoCo before importing mujoco.<\/span><br \/>\nos<span class=\"token punctuation\">.<\/span>environ<span class=\"token punctuation\">.<\/span>setdefault<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;MUJOCO_GL&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;egl&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\nos<span class=\"token punctuation\">.<\/span>environ<span class=\"token punctuation\">.<\/span>setdefault<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;PYOPENGL_PLATFORM&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;egl&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">import<\/span> mujoco<br \/>\n<span class=\"token keyword\">import<\/span> numpy <span class=\"token keyword\">as<\/span> np<\/p>\n<p><span class=\"token keyword\">from<\/span> gear_sonic<span class=\"token punctuation\">.<\/span>utils<span class=\"token punctuation\">.<\/span>mujoco_sim<span class=\"token punctuation\">.<\/span>base_sim <span class=\"token keyword\">import<\/span> BaseSimulator<br \/>\n<span class=\"token keyword\">from<\/span> gear_sonic<span class=\"token punctuation\">.<\/span>utils<span class=\"token punctuation\">.<\/span>mujoco_sim<span class=\"token punctuation\">.<\/span>configs <span class=\"token keyword\">import<\/span> SimLoopConfig<\/p>\n<p>REPO_ROOT <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>__file__<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>parents<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span><br \/>\nDEPLOY_ROOT <span class=\"token operator\">&#061;<\/span> REPO_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;gear_sonic_deploy&#034;<\/span><br \/>\nDEPLOY_BIN <span class=\"token operator\">&#061;<\/span> DEPLOY_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;target&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;release&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;g1_deploy_onnx_ref&#034;<\/span><br \/>\nDEFAULT_OUTPUT_DIR <span class=\"token operator\">&#061;<\/span> REPO_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;outputs&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;headless_reference_motion&#034;<\/span><br \/>\nDEFAULT_STATE_DUMP_NAME <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;sim_states.npz&#034;<\/span><br \/>\nDEFAULT_LOG_NAME <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;deploy.log&#034;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">DeployMonitor<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;Consume PTY output, mirror it to stdout\/log, and detect lifecycle events.&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> master_fd<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> log_path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>master_fd <span class=\"token operator\">&#061;<\/span> master_fd<br \/>\n        self<span class=\"token punctuation\">.<\/span>log_path <span class=\"token operator\">&#061;<\/span> log_path<br \/>\n        self<span class=\"token punctuation\">.<\/span>log_file <span class=\"token operator\">&#061;<\/span> log_path<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;w&#034;<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_buffer <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#034;<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_reader_thread <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Thread<span class=\"token punctuation\">(<\/span>target<span class=\"token operator\">&#061;<\/span>self<span class=\"token punctuation\">.<\/span>_reader_loop<span class=\"token punctuation\">,<\/span> daemon<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_running <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_running<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>init_done <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>loaded_motions <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>motion_started <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>motion_completed <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>last_lines<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">start<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_reader_thread<span class=\"token punctuation\">.<\/span>start<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_running<span class=\"token punctuation\">.<\/span>clear<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_reader_thread<span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>log_file<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_reader_loop<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">while<\/span> self<span class=\"token punctuation\">.<\/span>_running<span class=\"token punctuation\">.<\/span>is_set<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                chunk <span class=\"token operator\">&#061;<\/span> os<span class=\"token punctuation\">.<\/span>read<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>master_fd<span class=\"token punctuation\">,<\/span> <span class=\"token number\">4096<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">except<\/span> OSError<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> chunk<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><\/p>\n<p>            text <span class=\"token operator\">&#061;<\/span> chunk<span class=\"token punctuation\">.<\/span>decode<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">,<\/span> errors<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;replace&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            sys<span class=\"token punctuation\">.<\/span>stdout<span class=\"token punctuation\">.<\/span>write<span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><br \/>\n            sys<span class=\"token punctuation\">.<\/span>stdout<span class=\"token punctuation\">.<\/span>flush<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>log_file<span class=\"token punctuation\">.<\/span>write<span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>log_file<span class=\"token punctuation\">.<\/span>flush<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            self<span class=\"token punctuation\">.<\/span>_buffer <span class=\"token operator\">&#043;&#061;<\/span> text<br \/>\n            <span class=\"token keyword\">while<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span> <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>_buffer<span class=\"token punctuation\">:<\/span><br \/>\n                line<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>_buffer <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_buffer<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                self<span class=\"token punctuation\">.<\/span>_handle_line<span class=\"token punctuation\">(<\/span>line<span class=\"token punctuation\">.<\/span>rstrip<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\r&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_handle_line<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> line<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> line<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><\/p>\n<p>        self<span class=\"token punctuation\">.<\/span>last_lines<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>line<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>last_lines<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">200<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>last_lines <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>last_lines<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">200<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> line <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;Init Done&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>init_done<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token string\">&#034;Total motions loaded:&#034;<\/span> <span class=\"token keyword\">in<\/span> line<br \/>\n            <span class=\"token keyword\">or<\/span> line <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;\u2713 Motion data loaded successfully!&#034;<\/span><br \/>\n            <span class=\"token keyword\">or<\/span> line<span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Started with motion:&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>loaded_motions<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> line<span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Playing motion &#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>motion_started<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> line<span class=\"token punctuation\">.<\/span>startswith<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Motion &#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">and<\/span> <span class=\"token string\">&#034; completed.&#034;<\/span> <span class=\"token keyword\">in<\/span> line<span class=\"token punctuation\">:<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>motion_completed<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">StateRecorder<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;Record MuJoCo qpos snapshots for later offline rendering.&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> state_path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>state_path <span class=\"token operator\">&#061;<\/span> state_path<br \/>\n        self<span class=\"token punctuation\">.<\/span>_times<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_qpos<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>np<span class=\"token punctuation\">.<\/span>ndarray<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_step_index <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">capture<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> simulator<span class=\"token punctuation\">:<\/span> BaseSimulator<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_times<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>_step_index <span class=\"token operator\">*<\/span> simulator<span class=\"token punctuation\">.<\/span>sim_dt<span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_qpos<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>mj_data<span class=\"token punctuation\">.<\/span>qpos<span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>copy<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_step_index <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">1<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">has_data<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>_times<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">save<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> self<span class=\"token punctuation\">.<\/span>_times<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;No simulation states were recorded for offline rendering.&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        np<span class=\"token punctuation\">.<\/span>savez_compressed<span class=\"token punctuation\">(<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>state_path<span class=\"token punctuation\">,<\/span><br \/>\n            times<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>_times<span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            qpos<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>_qpos<span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">parse_args<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> argparse<span class=\"token punctuation\">.<\/span>Namespace<span class=\"token punctuation\">:<\/span><br \/>\n    parser <span class=\"token operator\">&#061;<\/span> argparse<span class=\"token punctuation\">.<\/span>ArgumentParser<span class=\"token punctuation\">(<\/span><br \/>\n        description<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Run one SONIC reference motion headlessly and save an MP4.&#034;<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;motion-path&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>DEPLOY_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;reference&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;example&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token string\">&#034;Either a motion dataset directory containing subfolders, or a single motion folder &#034;<\/span><br \/>\n            <span class=\"token string\">&#034;containing joint_pos.csv\/body_pos.csv\/etc.&#034;<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;motion-index&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Motion index inside the dataset directory. Ignored when &#8211;motion-path is a single motion folder.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;output-dir&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>DEFAULT_OUTPUT_DIR<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Directory for the output video, logs, and recorded sim states.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;video-name&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;headless_motion.mp4&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Output video filename.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;video-width&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1280<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;video-height&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">720<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;video-fps&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">15<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;warmup-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Wait time after starting the simulator before launching deploy.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;control-ready-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0.5<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Extra wait time after deploy init completes before sending the start key.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;play-delay-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Wait time between starting control and dropping the robot to the ground.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;drop-settle-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Wait time after dropping the robot before recording and starting playback.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;post-complete-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Extra simulation time after the motion completes before stopping.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;timeout-seconds&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">300.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Fail if the motion does not complete within this many seconds.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;sim-frequency&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">200<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Simulation frequency for the MuJoCo loop.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-distance&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2.8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Tracking camera distance.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-azimuth&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token number\">120.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Tracking camera azimuth in degrees.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-elevation&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">25.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Tracking camera elevation in degrees.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;camera-lookat&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        nargs<span class=\"token operator\">&#061;<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.7<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        metavar<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;X&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Y&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Z&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Tracking camera lookat point.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;decoder&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>DEPLOY_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;policy&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;release&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;model_decoder.onnx&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Decoder model path.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;encoder&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>DEPLOY_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;policy&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;release&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;model_encoder.onnx&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Encoder model path.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;planner&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Optional planner model path. Leave unset for fixed reference-motion playback.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;obs-config&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">type<\/span><span class=\"token operator\">&#061;<\/span>Path<span class=\"token punctuation\">,<\/span><br \/>\n        default<span class=\"token operator\">&#061;<\/span>DEPLOY_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;policy&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;release&#034;<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;observation_config.yaml&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Observation config path.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    parser<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;skip-build&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        action<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;store_true&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">help<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;Do not auto-build the deploy binary when missing.&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> parser<span class=\"token punctuation\">.<\/span>parse_args<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">ensure_paths<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">:<\/span> argparse<span class=\"token punctuation\">.<\/span>Namespace<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    required_paths <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        args<span class=\"token punctuation\">.<\/span>decoder<span class=\"token punctuation\">,<\/span><br \/>\n        args<span class=\"token punctuation\">.<\/span>encoder<span class=\"token punctuation\">,<\/span><br \/>\n        args<span class=\"token punctuation\">.<\/span>obs_config<span class=\"token punctuation\">,<\/span><br \/>\n        args<span class=\"token punctuation\">.<\/span>motion_path<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> args<span class=\"token punctuation\">.<\/span>planner <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        required_paths<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>planner<span class=\"token punctuation\">)<\/span><br \/>\n    missing <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>path<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> path <span class=\"token keyword\">in<\/span> required_paths <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> missing<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Missing required paths:\\\\n  &#034;<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\n  &#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>missing<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> args<span class=\"token punctuation\">.<\/span>video_width <span class=\"token operator\">%<\/span> <span class=\"token number\">2<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span> <span class=\"token keyword\">or<\/span> args<span class=\"token punctuation\">.<\/span>video_height <span class=\"token operator\">%<\/span> <span class=\"token number\">2<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;H.264 yuv420p output requires even video dimensions.&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">ensure_ffmpeg_available<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    ffmpeg_bin <span class=\"token operator\">&#061;<\/span> shutil<span class=\"token punctuation\">.<\/span>which<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;ffmpeg&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> ffmpeg_bin <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;ffmpeg is required for H.264 MP4 output but was not found in PATH.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> ffmpeg_bin<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">ensure_deploy_binary<\/span><span class=\"token punctuation\">(<\/span>skip_build<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> DEPLOY_BIN<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> skip_build<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Deploy binary not found: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>DEPLOY_BIN<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\\\\n&#034;<\/span><\/span><br \/>\n            <span class=\"token string\">&#034;Build it first with &#096;cd gear_sonic_deploy &amp;&amp; source scripts\/setup_env.sh &amp;&amp; just build&#096;.&#034;<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><\/p>\n<p>    build_cmd <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;source scripts\/setup_env.sh &gt;\/dev\/null 2&gt;&amp;1 &amp;&amp; just build&#034;<\/span><br \/>\n    subprocess<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;bash&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-lc&#034;<\/span><span class=\"token punctuation\">,<\/span> build_cmd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        cwd<span class=\"token operator\">&#061;<\/span>DEPLOY_ROOT<span class=\"token punctuation\">,<\/span><br \/>\n        check<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">prepare_motion_dataset<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    motion_path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span>Path<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> tempfile<span class=\"token punctuation\">.<\/span>TemporaryDirectory<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;Return a dataset root and motion index compatible with MotionDataReader.&#034;&#034;&#034;<\/span><br \/>\n    tmp_parent <span class=\"token operator\">&#061;<\/span> REPO_ROOT <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;tmp&#034;<\/span><br \/>\n    tmp_parent<span class=\"token punctuation\">.<\/span>mkdir<span class=\"token punctuation\">(<\/span>parents<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> exist_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>motion_path <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#034;joint_pos.csv&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        temp_dir <span class=\"token operator\">&#061;<\/span> tempfile<span class=\"token punctuation\">.<\/span>TemporaryDirectory<span class=\"token punctuation\">(<\/span>prefix<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;headless_motion_&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dir<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>tmp_parent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        temp_root <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>temp_dir<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">)<\/span><br \/>\n        link_path <span class=\"token operator\">&#061;<\/span> temp_root <span class=\"token operator\">\/<\/span> motion_path<span class=\"token punctuation\">.<\/span>name<br \/>\n        link_path<span class=\"token punctuation\">.<\/span>symlink_to<span class=\"token punctuation\">(<\/span>motion_path<span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> target_is_directory<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> temp_root<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> temp_dir<\/p>\n<p>    <span class=\"token keyword\">return<\/span> motion_path<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">prepare_scene_xml_for_offscreen<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    scene_ref<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    offwidth<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    offheight<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> Path <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;Create a temporary scene XML with a larger offscreen framebuffer if needed.&#034;&#034;&#034;<\/span><br \/>\n    scene_path <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>scene_ref<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> scene_path<span class=\"token punctuation\">.<\/span>is_absolute<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        scene_path <span class=\"token operator\">&#061;<\/span> REPO_ROOT <span class=\"token operator\">\/<\/span> scene_path<\/p>\n<p>    tree <span class=\"token operator\">&#061;<\/span> ET<span class=\"token punctuation\">.<\/span>parse<span class=\"token punctuation\">(<\/span>scene_path<span class=\"token punctuation\">)<\/span><br \/>\n    root <span class=\"token operator\">&#061;<\/span> tree<span class=\"token punctuation\">.<\/span>getroot<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    visual <span class=\"token operator\">&#061;<\/span> root<span class=\"token punctuation\">.<\/span>find<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;visual&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> visual <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        visual <span class=\"token operator\">&#061;<\/span> ET<span class=\"token punctuation\">.<\/span>SubElement<span class=\"token punctuation\">(<\/span>root<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;visual&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    global_elem <span class=\"token operator\">&#061;<\/span> visual<span class=\"token punctuation\">.<\/span>find<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;global&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> global_elem <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        global_elem <span class=\"token operator\">&#061;<\/span> ET<span class=\"token punctuation\">.<\/span>SubElement<span class=\"token punctuation\">(<\/span>visual<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;global&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    current_offwidth <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>global_elem<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;offwidth&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;640&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    current_offheight <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>global_elem<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;offheight&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;480&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    target_offwidth <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">max<\/span><span class=\"token punctuation\">(<\/span>current_offwidth<span class=\"token punctuation\">,<\/span> offwidth<span class=\"token punctuation\">)<\/span><br \/>\n    target_offheight <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">max<\/span><span class=\"token punctuation\">(<\/span>current_offheight<span class=\"token punctuation\">,<\/span> offheight<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> target_offwidth <span class=\"token operator\">&#061;&#061;<\/span> current_offwidth <span class=\"token keyword\">and<\/span> target_offheight <span class=\"token operator\">&#061;&#061;<\/span> current_offheight<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>scene_path<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p>    global_elem<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;offwidth&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>target_offwidth<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    global_elem<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;offheight&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>target_offheight<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    fd<span class=\"token punctuation\">,<\/span> tmp_path <span class=\"token operator\">&#061;<\/span> tempfile<span class=\"token punctuation\">.<\/span>mkstemp<span class=\"token punctuation\">(<\/span><br \/>\n        prefix<span class=\"token operator\">&#061;<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>scene_path<span class=\"token punctuation\">.<\/span>stem<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">_offscreen_&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n        suffix<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;.xml&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">dir<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>scene_path<span class=\"token punctuation\">.<\/span>parent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    os<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><br \/>\n    tree<span class=\"token punctuation\">.<\/span>write<span class=\"token punctuation\">(<\/span>tmp_path<span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;unicode&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> tmp_path<span class=\"token punctuation\">,<\/span> Path<span class=\"token punctuation\">(<\/span>tmp_path<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">build_tracking_camera<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    simulator<span class=\"token punctuation\">:<\/span> BaseSimulator<span class=\"token punctuation\">,<\/span><br \/>\n    distance<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    azimuth<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    elevation<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    lookat<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> mujoco<span class=\"token punctuation\">.<\/span>MjvCamera<span class=\"token punctuation\">:<\/span><br \/>\n    camera <span class=\"token operator\">&#061;<\/span> mujoco<span class=\"token punctuation\">.<\/span>MjvCamera<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    mujoco<span class=\"token punctuation\">.<\/span>mjv_defaultCamera<span class=\"token punctuation\">(<\/span>camera<span class=\"token punctuation\">)<\/span><br \/>\n    camera<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">type<\/span> <span class=\"token operator\">&#061;<\/span> mujoco<span class=\"token punctuation\">.<\/span>mjtCamera<span class=\"token punctuation\">.<\/span>mjCAMERA_TRACKING<br \/>\n    camera<span class=\"token punctuation\">.<\/span>trackbodyid <span class=\"token operator\">&#061;<\/span> simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>mj_model<span class=\"token punctuation\">.<\/span>body<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;pelvis&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">id<\/span><br \/>\n    camera<span class=\"token punctuation\">.<\/span>distance <span class=\"token operator\">&#061;<\/span> distance<br \/>\n    camera<span class=\"token punctuation\">.<\/span>azimuth <span class=\"token operator\">&#061;<\/span> azimuth<br \/>\n    camera<span class=\"token punctuation\">.<\/span>elevation <span class=\"token operator\">&#061;<\/span> elevation<br \/>\n    camera<span class=\"token punctuation\">.<\/span>lookat<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>lookat<span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> camera<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">create_simulator<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    args<span class=\"token punctuation\">:<\/span> argparse<span class=\"token punctuation\">.<\/span>Namespace<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token operator\">*<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    enable_elastic_band<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span>BaseSimulator<span class=\"token punctuation\">,<\/span> Path <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    sim_cfg <span class=\"token operator\">&#061;<\/span> SimLoopConfig<span class=\"token punctuation\">(<\/span><br \/>\n        enable_onscreen<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        enable_offscreen<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        sim_frequency<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>sim_frequency<span class=\"token punctuation\">,<\/span><br \/>\n        verbose<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        interface<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;sim&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    wbc_config <span class=\"token operator\">&#061;<\/span> sim_cfg<span class=\"token punctuation\">.<\/span>load_wbc_yaml<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    wbc_config<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;ENV_NAME&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> sim_cfg<span class=\"token punctuation\">.<\/span>env_name<br \/>\n    wbc_config<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;ENABLE_ONSCREEN&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><br \/>\n    wbc_config<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;ENABLE_OFFSCREEN&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><br \/>\n    wbc_config<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;ENABLE_ELASTIC_BAND&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> enable_elastic_band<br \/>\n    scene_ref<span class=\"token punctuation\">,<\/span> scene_temp_path <span class=\"token operator\">&#061;<\/span> prepare_scene_xml_for_offscreen<span class=\"token punctuation\">(<\/span><br \/>\n        scene_ref<span class=\"token operator\">&#061;<\/span>wbc_config<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;ROBOT_SCENE&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        offwidth<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>video_width<span class=\"token punctuation\">,<\/span><br \/>\n        offheight<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>video_height<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    wbc_config<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;ROBOT_SCENE&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> scene_ref<\/p>\n<p>    camera_configs <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;recording&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;height&#034;<\/span><span class=\"token punctuation\">:<\/span> args<span class=\"token punctuation\">.<\/span>video_height<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;width&#034;<\/span><span class=\"token punctuation\">:<\/span> args<span class=\"token punctuation\">.<\/span>video_width<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    simulator <span class=\"token operator\">&#061;<\/span> BaseSimulator<span class=\"token punctuation\">(<\/span><br \/>\n        config<span class=\"token operator\">&#061;<\/span>wbc_config<span class=\"token punctuation\">,<\/span><br \/>\n        env_name<span class=\"token operator\">&#061;<\/span>sim_cfg<span class=\"token punctuation\">.<\/span>env_name<span class=\"token punctuation\">,<\/span><br \/>\n        onscreen<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        offscreen<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        camera_configs<span class=\"token operator\">&#061;<\/span>camera_configs<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>camera_configs<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;recording&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;params&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> build_tracking_camera<span class=\"token punctuation\">(<\/span><br \/>\n        simulator<span class=\"token operator\">&#061;<\/span>simulator<span class=\"token punctuation\">,<\/span><br \/>\n        distance<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>camera_distance<span class=\"token punctuation\">,<\/span><br \/>\n        azimuth<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>camera_azimuth<span class=\"token punctuation\">,<\/span><br \/>\n        elevation<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>camera_elevation<span class=\"token punctuation\">,<\/span><br \/>\n        lookat<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>camera_lookat<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token builtin\">hasattr<\/span><span class=\"token punctuation\">(<\/span>simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;elastic_band&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>elastic_band <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> simulator<span class=\"token punctuation\">,<\/span> scene_temp_path<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">run_simulation_phase<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    simulator<span class=\"token punctuation\">:<\/span> BaseSimulator<span class=\"token punctuation\">,<\/span><br \/>\n    stop_event<span class=\"token punctuation\">:<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">,<\/span><br \/>\n    record_event<span class=\"token punctuation\">:<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">,<\/span><br \/>\n    recorder<span class=\"token punctuation\">:<\/span> StateRecorder<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token keyword\">not<\/span> stop_event<span class=\"token punctuation\">.<\/span>is_set<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        step_start <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>monotonic<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>sim_step<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> record_event<span class=\"token punctuation\">.<\/span>is_set<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            recorder<span class=\"token punctuation\">.<\/span>capture<span class=\"token punctuation\">(<\/span>simulator<span class=\"token punctuation\">)<\/span><\/p>\n<p>        elapsed <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>monotonic<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> step_start<br \/>\n        sleep_time <span class=\"token operator\">&#061;<\/span> simulator<span class=\"token punctuation\">.<\/span>sim_dt <span class=\"token operator\">&#8211;<\/span> elapsed<br \/>\n        <span class=\"token keyword\">if<\/span> sleep_time <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>sleep_time<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">run_headless_simulation<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    args<span class=\"token punctuation\">:<\/span> argparse<span class=\"token punctuation\">.<\/span>Namespace<span class=\"token punctuation\">,<\/span><br \/>\n    state_path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span><br \/>\n    stop_event<span class=\"token punctuation\">:<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">,<\/span><br \/>\n    record_event<span class=\"token punctuation\">:<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">,<\/span><br \/>\n    ready_event<span class=\"token punctuation\">:<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">,<\/span><br \/>\n    status<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">object<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    simulator<span class=\"token punctuation\">:<\/span> BaseSimulator <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    scene_temp_path<span class=\"token punctuation\">:<\/span> Path <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    recorder <span class=\"token operator\">&#061;<\/span> StateRecorder<span class=\"token punctuation\">(<\/span>state_path<span class=\"token operator\">&#061;<\/span>state_path<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        simulator<span class=\"token punctuation\">,<\/span> scene_temp_path <span class=\"token operator\">&#061;<\/span> create_simulator<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">,<\/span> enable_elastic_band<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        status<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;simulator&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> simulator<br \/>\n        ready_event<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        run_simulation_phase<span class=\"token punctuation\">(<\/span><br \/>\n            simulator<span class=\"token operator\">&#061;<\/span>simulator<span class=\"token punctuation\">,<\/span><br \/>\n            stop_event<span class=\"token operator\">&#061;<\/span>stop_event<span class=\"token punctuation\">,<\/span><br \/>\n            record_event<span class=\"token operator\">&#061;<\/span>record_event<span class=\"token punctuation\">,<\/span><br \/>\n            recorder<span class=\"token operator\">&#061;<\/span>recorder<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> recorder<span class=\"token punctuation\">.<\/span>has_data<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            recorder<span class=\"token punctuation\">.<\/span>save<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> exc<span class=\"token punctuation\">:<\/span>  <span class=\"token comment\"># noqa: BLE001<\/span><br \/>\n        status<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> exc<br \/>\n        ready_event<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        status<span class=\"token punctuation\">.<\/span>pop<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;simulator&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> simulator <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            simulator<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> scene_temp_path <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token keyword\">and<\/span> scene_temp_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            scene_temp_path<span class=\"token punctuation\">.<\/span>unlink<span class=\"token punctuation\">(<\/span>missing_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">shell_quote<\/span><span class=\"token punctuation\">(<\/span>path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> shlex<span class=\"token punctuation\">.<\/span>quote<span class=\"token punctuation\">(<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>path<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">launch_deploy<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    dataset_root<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span><br \/>\n    args<span class=\"token punctuation\">:<\/span> argparse<span class=\"token punctuation\">.<\/span>Namespace<span class=\"token punctuation\">,<\/span><br \/>\n    log_path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span>subprocess<span class=\"token punctuation\">.<\/span>Popen<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">bytes<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> DeployMonitor<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    master_fd<span class=\"token punctuation\">,<\/span> slave_fd <span class=\"token operator\">&#061;<\/span> pty<span class=\"token punctuation\">.<\/span>openpty<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    cmd_parts <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token string\">&#034;source scripts\/setup_env.sh &gt;\/dev\/null 2&gt;&amp;1&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;&amp;&amp;&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        shell_quote<span class=\"token punctuation\">(<\/span>DEPLOY_BIN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;lo&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        shell_quote<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>decoder<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        shell_quote<span class=\"token punctuation\">(<\/span>dataset_root<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;obs-config&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        shell_quote<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>obs_config<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;encoder-file&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        shell_quote<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>encoder<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;input-type&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;keyboard&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;output-type&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;all&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;&#8211;disable-crc-check&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> args<span class=\"token punctuation\">.<\/span>planner <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        cmd_parts<span class=\"token punctuation\">.<\/span>extend<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;&#8211;planner-file&#034;<\/span><span class=\"token punctuation\">,<\/span> shell_quote<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>planner<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    cmd <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034; &#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>cmd_parts<span class=\"token punctuation\">)<\/span><\/p>\n<p>    process <span class=\"token operator\">&#061;<\/span> subprocess<span class=\"token punctuation\">.<\/span>Popen<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;bash&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-lc&#034;<\/span><span class=\"token punctuation\">,<\/span> cmd<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        cwd<span class=\"token operator\">&#061;<\/span>DEPLOY_ROOT<span class=\"token punctuation\">,<\/span><br \/>\n        stdin<span class=\"token operator\">&#061;<\/span>slave_fd<span class=\"token punctuation\">,<\/span><br \/>\n        stdout<span class=\"token operator\">&#061;<\/span>slave_fd<span class=\"token punctuation\">,<\/span><br \/>\n        stderr<span class=\"token operator\">&#061;<\/span>slave_fd<span class=\"token punctuation\">,<\/span><br \/>\n        close_fds<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    os<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span>slave_fd<span class=\"token punctuation\">)<\/span><\/p>\n<p>    monitor <span class=\"token operator\">&#061;<\/span> DeployMonitor<span class=\"token punctuation\">(<\/span>master_fd<span class=\"token operator\">&#061;<\/span>master_fd<span class=\"token punctuation\">,<\/span> log_path<span class=\"token operator\">&#061;<\/span>log_path<span class=\"token punctuation\">)<\/span><br \/>\n    monitor<span class=\"token punctuation\">.<\/span>start<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> process<span class=\"token punctuation\">,<\/span> master_fd<span class=\"token punctuation\">,<\/span> monitor<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">send_key<\/span><span class=\"token punctuation\">(<\/span>master_fd<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> key<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> delay_seconds<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    os<span class=\"token punctuation\">.<\/span>write<span class=\"token punctuation\">(<\/span>master_fd<span class=\"token punctuation\">,<\/span> key<span class=\"token punctuation\">.<\/span>encode<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>delay_seconds<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">release_elastic_band<\/span><span class=\"token punctuation\">(<\/span>sim_status<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">object<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    simulator <span class=\"token operator\">&#061;<\/span> sim_status<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;simulator&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> simulator <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><\/p>\n<p>    elastic_band <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">getattr<\/span><span class=\"token punctuation\">(<\/span>simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;elastic_band&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> elastic_band <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token keyword\">and<\/span> elastic_band<span class=\"token punctuation\">.<\/span>enable<span class=\"token punctuation\">:<\/span><br \/>\n        elastic_band<span class=\"token punctuation\">.<\/span>enable <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[INFO] Released elastic band automatically before playback.&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">automate_deploy<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    process<span class=\"token punctuation\">:<\/span> subprocess<span class=\"token punctuation\">.<\/span>Popen<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">bytes<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    master_fd<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    monitor<span class=\"token punctuation\">:<\/span> DeployMonitor<span class=\"token punctuation\">,<\/span><br \/>\n    motion_index<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    control_ready_seconds<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    play_delay_seconds<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    drop_settle_seconds<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    post_complete_seconds<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    timeout_seconds<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    sim_status<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">object<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    record_event<span class=\"token punctuation\">:<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    start_time <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> monitor<span class=\"token punctuation\">.<\/span>loaded_motions<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">30.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> TimeoutError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Timed out waiting for deploy to load the reference motions.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> monitor<span class=\"token punctuation\">.<\/span>init_done<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">60.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> TimeoutError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Timed out waiting for deploy init to finish.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>control_ready_seconds<span class=\"token punctuation\">)<\/span><\/p>\n<p>    send_key<span class=\"token punctuation\">(<\/span>master_fd<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;]&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>play_delay_seconds<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> _ <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span>motion_index<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        send_key<span class=\"token punctuation\">(<\/span>master_fd<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;N&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    release_elastic_band<span class=\"token punctuation\">(<\/span>sim_status<span class=\"token punctuation\">)<\/span><br \/>\n    time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>drop_settle_seconds<span class=\"token punctuation\">)<\/span><br \/>\n    record_event<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    send_key<span class=\"token punctuation\">(<\/span>master_fd<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;T&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">while<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;error&#034;<\/span> <span class=\"token keyword\">in<\/span> sim_status<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Simulator thread failed: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>sim_status<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;error&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> process<span class=\"token punctuation\">.<\/span>poll<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> process<span class=\"token punctuation\">.<\/span>returncode <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><br \/>\n                    <span class=\"token string\">&#034;Deploy process exited early.\\\\nLast output:\\\\n&#034;<\/span><br \/>\n                    <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>monitor<span class=\"token punctuation\">.<\/span>last_lines<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">40<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> monitor<span class=\"token punctuation\">.<\/span>motion_completed<span class=\"token punctuation\">.<\/span>is_set<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>post_complete_seconds<span class=\"token punctuation\">)<\/span><br \/>\n            send_key<span class=\"token punctuation\">(<\/span>master_fd<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;O&#034;<\/span><span class=\"token punctuation\">,<\/span> delay_seconds<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0.1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> start_time <span class=\"token operator\">&gt;<\/span> timeout_seconds<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> TimeoutError<span class=\"token punctuation\">(<\/span><br \/>\n                <span class=\"token string\">&#034;Timed out waiting for the reference motion to complete.\\\\nLast output:\\\\n&#034;<\/span><br \/>\n                <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>monitor<span class=\"token punctuation\">.<\/span>last_lines<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">40<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">)<\/span><\/p>\n<p>        time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span><span class=\"token number\">0.1<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">wait_for_process_exit<\/span><span class=\"token punctuation\">(<\/span>process<span class=\"token punctuation\">:<\/span> subprocess<span class=\"token punctuation\">.<\/span>Popen<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">bytes<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> timeout<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">20.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        process<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span>timeout<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> subprocess<span class=\"token punctuation\">.<\/span>TimeoutExpired<span class=\"token punctuation\">:<\/span><br \/>\n        process<span class=\"token punctuation\">.<\/span>terminate<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            process<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">5.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> subprocess<span class=\"token punctuation\">.<\/span>TimeoutExpired<span class=\"token punctuation\">:<\/span><br \/>\n            process<span class=\"token punctuation\">.<\/span>kill<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            process<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">5.0<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">choose_render_indices<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">:<\/span> np<span class=\"token punctuation\">.<\/span>ndarray<span class=\"token punctuation\">,<\/span> video_fps<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> np<span class=\"token punctuation\">.<\/span>ndarray<span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> times<span class=\"token punctuation\">.<\/span>size <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;No recorded simulation timestamps were found.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> times<span class=\"token punctuation\">.<\/span>size <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">1<\/span> <span class=\"token keyword\">or<\/span> times<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> np<span class=\"token punctuation\">.<\/span>array<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>int64<span class=\"token punctuation\">)<\/span><\/p>\n<p>    target_times <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>arange<span class=\"token punctuation\">(<\/span><span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> times<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1e-9<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>video_fps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    right <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>searchsorted<span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">,<\/span> target_times<span class=\"token punctuation\">,<\/span> side<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;left&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    right <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>clip<span class=\"token punctuation\">(<\/span>right<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> times<span class=\"token punctuation\">.<\/span>size <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    left <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>clip<span class=\"token punctuation\">(<\/span>right <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> times<span class=\"token punctuation\">.<\/span>size <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    use_left <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">abs<\/span><span class=\"token punctuation\">(<\/span>target_times <span class=\"token operator\">&#8211;<\/span> times<span class=\"token punctuation\">[<\/span>left<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&#061;<\/span> np<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">abs<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">[<\/span>right<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#8211;<\/span> target_times<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> np<span class=\"token punctuation\">.<\/span>where<span class=\"token punctuation\">(<\/span>use_left<span class=\"token punctuation\">,<\/span> left<span class=\"token punctuation\">,<\/span> right<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">open_ffmpeg_encoder<\/span><span class=\"token punctuation\">(<\/span>video_path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span> width<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> height<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> fps<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> subprocess<span class=\"token punctuation\">.<\/span>Popen<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">bytes<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    ffmpeg_bin <span class=\"token operator\">&#061;<\/span> ensure_ffmpeg_available<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    cmd <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        ffmpeg_bin<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-y&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-f&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;rawvideo&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-pix_fmt&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;rgb24&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-s:v&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>width<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">x<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>height<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-r&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>fps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-i&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-an&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-c:v&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;libx264&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-profile:v&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;high&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-pix_fmt&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;yuv420p&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;-movflags&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;&#043;faststart&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>video_path<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> subprocess<span class=\"token punctuation\">.<\/span>Popen<span class=\"token punctuation\">(<\/span><br \/>\n        cmd<span class=\"token punctuation\">,<\/span><br \/>\n        stdin<span class=\"token operator\">&#061;<\/span>subprocess<span class=\"token punctuation\">.<\/span>PIPE<span class=\"token punctuation\">,<\/span><br \/>\n        stdout<span class=\"token operator\">&#061;<\/span>subprocess<span class=\"token punctuation\">.<\/span>DEVNULL<span class=\"token punctuation\">,<\/span><br \/>\n        stderr<span class=\"token operator\">&#061;<\/span>subprocess<span class=\"token punctuation\">.<\/span>PIPE<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">finalize_ffmpeg_encoder<\/span><span class=\"token punctuation\">(<\/span>process<span class=\"token punctuation\">:<\/span> subprocess<span class=\"token punctuation\">.<\/span>Popen<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">bytes<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    stderr_data <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">b&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> process<span class=\"token punctuation\">.<\/span>stdin <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token keyword\">and<\/span> <span class=\"token keyword\">not<\/span> process<span class=\"token punctuation\">.<\/span>stdin<span class=\"token punctuation\">.<\/span>closed<span class=\"token punctuation\">:<\/span><br \/>\n        process<span class=\"token punctuation\">.<\/span>stdin<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> process<span class=\"token punctuation\">.<\/span>stderr <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        stderr_data <span class=\"token operator\">&#061;<\/span> process<span class=\"token punctuation\">.<\/span>stderr<span class=\"token punctuation\">.<\/span>read<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    returncode <span class=\"token operator\">&#061;<\/span> process<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> returncode <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token string\">&#034;ffmpeg failed while encoding the final MP4.\\\\n&#034;<\/span><br \/>\n            <span class=\"token operator\">&#043;<\/span> stderr_data<span class=\"token punctuation\">.<\/span>decode<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">,<\/span> errors<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;replace&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">render_recorded_video<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">:<\/span> argparse<span class=\"token punctuation\">.<\/span>Namespace<span class=\"token punctuation\">,<\/span> state_path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">,<\/span> video_path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> state_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Recorded state dump was not created: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>state_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    data <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>load<span class=\"token punctuation\">(<\/span>state_path<span class=\"token punctuation\">)<\/span><br \/>\n    times <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;times&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><br \/>\n    qpos <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>asarray<span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;qpos&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> dtype<span class=\"token operator\">&#061;<\/span>np<span class=\"token punctuation\">.<\/span>float64<span class=\"token punctuation\">)<\/span><br \/>\n    frame_indices <span class=\"token operator\">&#061;<\/span> choose_render_indices<span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">,<\/span> args<span class=\"token punctuation\">.<\/span>video_fps<span class=\"token punctuation\">)<\/span><\/p>\n<p>    simulator<span class=\"token punctuation\">:<\/span> BaseSimulator <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    scene_temp_path<span class=\"token punctuation\">:<\/span> Path <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    encoder<span class=\"token punctuation\">:<\/span> subprocess<span class=\"token punctuation\">.<\/span>Popen<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">bytes<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        simulator<span class=\"token punctuation\">,<\/span> scene_temp_path <span class=\"token operator\">&#061;<\/span> create_simulator<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">,<\/span> enable_elastic_band<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        renderer <span class=\"token operator\">&#061;<\/span> simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>renderers<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;recording&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        camera <span class=\"token operator\">&#061;<\/span> simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>camera_configs<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;recording&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;params&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        encoder <span class=\"token operator\">&#061;<\/span> open_ffmpeg_encoder<span class=\"token punctuation\">(<\/span><br \/>\n            video_path<span class=\"token operator\">&#061;<\/span>video_path<span class=\"token punctuation\">,<\/span><br \/>\n            width<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>video_width<span class=\"token punctuation\">,<\/span><br \/>\n            height<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>video_height<span class=\"token punctuation\">,<\/span><br \/>\n            fps<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>video_fps<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> encoder<span class=\"token punctuation\">.<\/span>stdin <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Failed to open ffmpeg stdin for video encoding.&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>mj_data<span class=\"token punctuation\">.<\/span>qvel<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> frame_index <span class=\"token keyword\">in<\/span> frame_indices<span class=\"token punctuation\">:<\/span><br \/>\n            simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>mj_data<span class=\"token punctuation\">.<\/span>qpos<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> qpos<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>frame_index<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n            mujoco<span class=\"token punctuation\">.<\/span>mj_forward<span class=\"token punctuation\">(<\/span>simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>mj_model<span class=\"token punctuation\">,<\/span> simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>mj_data<span class=\"token punctuation\">)<\/span><br \/>\n            renderer<span class=\"token punctuation\">.<\/span>update_scene<span class=\"token punctuation\">(<\/span>simulator<span class=\"token punctuation\">.<\/span>sim_env<span class=\"token punctuation\">.<\/span>mj_data<span class=\"token punctuation\">,<\/span> camera<span class=\"token operator\">&#061;<\/span>camera<span class=\"token punctuation\">)<\/span><br \/>\n            frame_rgb <span class=\"token operator\">&#061;<\/span> renderer<span class=\"token punctuation\">.<\/span>render<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            encoder<span class=\"token punctuation\">.<\/span>stdin<span class=\"token punctuation\">.<\/span>write<span class=\"token punctuation\">(<\/span>frame_rgb<span class=\"token punctuation\">.<\/span>tobytes<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        finalize_ffmpeg_encoder<span class=\"token punctuation\">(<\/span>encoder<span class=\"token punctuation\">)<\/span><br \/>\n        encoder <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> encoder <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            encoder<span class=\"token punctuation\">.<\/span>kill<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            encoder<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> simulator <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            simulator<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> scene_temp_path <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token keyword\">and<\/span> scene_temp_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            scene_temp_path<span class=\"token punctuation\">.<\/span>unlink<span class=\"token punctuation\">(<\/span>missing_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    args <span class=\"token operator\">&#061;<\/span> parse_args<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ensure_paths<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">)<\/span><br \/>\n    ensure_ffmpeg_available<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ensure_deploy_binary<span class=\"token punctuation\">(<\/span>skip_build<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>skip_build<span class=\"token punctuation\">)<\/span><\/p>\n<p>    args<span class=\"token punctuation\">.<\/span>output_dir<span class=\"token punctuation\">.<\/span>mkdir<span class=\"token punctuation\">(<\/span>parents<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> exist_ok<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    video_path <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>output_dir <span class=\"token operator\">\/<\/span> args<span class=\"token punctuation\">.<\/span>video_name<br \/>\n    log_path <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>output_dir <span class=\"token operator\">\/<\/span> DEFAULT_LOG_NAME<br \/>\n    state_path <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>output_dir <span class=\"token operator\">\/<\/span> DEFAULT_STATE_DUMP_NAME<\/p>\n<p>    dataset_root<span class=\"token punctuation\">,<\/span> dataset_motion_index<span class=\"token punctuation\">,<\/span> temp_dir <span class=\"token operator\">&#061;<\/span> prepare_motion_dataset<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>motion_path<span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> temp_dir <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        motion_index <span class=\"token operator\">&#061;<\/span> args<span class=\"token punctuation\">.<\/span>motion_index<br \/>\n    <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        motion_index <span class=\"token operator\">&#061;<\/span> dataset_motion_index<\/p>\n<p>    stop_event <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    record_event <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    sim_ready_event <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Event<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    sim_status<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">object<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    sim_thread <span class=\"token operator\">&#061;<\/span> threading<span class=\"token punctuation\">.<\/span>Thread<span class=\"token punctuation\">(<\/span><br \/>\n        target<span class=\"token operator\">&#061;<\/span>run_headless_simulation<span class=\"token punctuation\">,<\/span><br \/>\n        args<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">,<\/span> state_path<span class=\"token punctuation\">,<\/span> stop_event<span class=\"token punctuation\">,<\/span> record_event<span class=\"token punctuation\">,<\/span> sim_ready_event<span class=\"token punctuation\">,<\/span> sim_status<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        daemon<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p>    process<span class=\"token punctuation\">:<\/span> subprocess<span class=\"token punctuation\">.<\/span>Popen<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">bytes<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    master_fd<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    monitor<span class=\"token punctuation\">:<\/span> DeployMonitor <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p>    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        sim_thread<span class=\"token punctuation\">.<\/span>start<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> sim_ready_event<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">30.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> TimeoutError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Timed out waiting for the headless simulator to start.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;error&#034;<\/span> <span class=\"token keyword\">in<\/span> sim_status<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Simulator thread failed during startup: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>sim_status<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;error&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>warmup_seconds<span class=\"token punctuation\">)<\/span><\/p>\n<p>        process<span class=\"token punctuation\">,<\/span> master_fd<span class=\"token punctuation\">,<\/span> monitor <span class=\"token operator\">&#061;<\/span> launch_deploy<span class=\"token punctuation\">(<\/span>dataset_root<span class=\"token operator\">&#061;<\/span>dataset_root<span class=\"token punctuation\">,<\/span> args<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">,<\/span> log_path<span class=\"token operator\">&#061;<\/span>log_path<span class=\"token punctuation\">)<\/span><br \/>\n        automate_deploy<span class=\"token punctuation\">(<\/span><br \/>\n            process<span class=\"token operator\">&#061;<\/span>process<span class=\"token punctuation\">,<\/span><br \/>\n            master_fd<span class=\"token operator\">&#061;<\/span>master_fd<span class=\"token punctuation\">,<\/span><br \/>\n            monitor<span class=\"token operator\">&#061;<\/span>monitor<span class=\"token punctuation\">,<\/span><br \/>\n            motion_index<span class=\"token operator\">&#061;<\/span>motion_index<span class=\"token punctuation\">,<\/span><br \/>\n            control_ready_seconds<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>control_ready_seconds<span class=\"token punctuation\">,<\/span><br \/>\n            play_delay_seconds<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>play_delay_seconds<span class=\"token punctuation\">,<\/span><br \/>\n            drop_settle_seconds<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>drop_settle_seconds<span class=\"token punctuation\">,<\/span><br \/>\n            post_complete_seconds<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>post_complete_seconds<span class=\"token punctuation\">,<\/span><br \/>\n            timeout_seconds<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">.<\/span>timeout_seconds<span class=\"token punctuation\">,<\/span><br \/>\n            sim_status<span class=\"token operator\">&#061;<\/span>sim_status<span class=\"token punctuation\">,<\/span><br \/>\n            record_event<span class=\"token operator\">&#061;<\/span>record_event<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n        wait_for_process_exit<span class=\"token punctuation\">(<\/span>process<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        stop_event<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        sim_thread<span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">10.0<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> monitor <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            monitor<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> master_fd <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                os<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span>master_fd<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">except<\/span> OSError<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">pass<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> process <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token keyword\">and<\/span> process<span class=\"token punctuation\">.<\/span>poll<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            wait_for_process_exit<span class=\"token punctuation\">(<\/span>process<span class=\"token punctuation\">,<\/span> timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">5.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> temp_dir <span class=\"token keyword\">is<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            temp_dir<span class=\"token punctuation\">.<\/span>cleanup<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;error&#034;<\/span> <span class=\"token keyword\">in<\/span> sim_status<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Simulator thread failed: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>sim_status<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;error&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> state_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Expected recorded state dump was not created: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>state_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    render_recorded_video<span class=\"token punctuation\">(<\/span>args<span class=\"token operator\">&#061;<\/span>args<span class=\"token punctuation\">,<\/span> state_path<span class=\"token operator\">&#061;<\/span>state_path<span class=\"token punctuation\">,<\/span> video_path<span class=\"token operator\">&#061;<\/span>video_path<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> video_path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> FileNotFoundError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Expected output video was not created: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>video_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\\\\nRecorded states saved to: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>state_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Video saved to: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>video_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Deploy log saved to: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>log_path<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">raise<\/span> SystemExit<span class=\"token punctuation\">(<\/span>main<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u6700\u540e\u5728.\/outputs\/headless_test\u76ee\u5f55\u4e0b\u770b\u5230\u751f\u6210\u7684npz\u6587\u4ef6\u548c\u89c6\u9891\u5c31\u8bf4\u660e\u8dd1\u901a\u4e86\u3002<\/p>\n<hr \/>\n<h4>\u5982\u679c\u60f3\u8d70\u53ef\u89c6\u5316\u4ea4\u4e92&#xff0c;\u53ef\u4ee5\u53c2\u8003\u5b98\u65b9\u6559\u7a0b&#xff1a;<\/h4>\n<h5>\u8fd0\u884csim2sim<\/h5>\n<p>\u7ec8\u7aef 1 \u2014 MuJoCo \u6a21\u62df\u5668&#xff08;\u4e3b\u673a&#xff0c;\u6765\u81ea\u4ed3\u5e93\u6839\u76ee\u5f55&#xff09;&#xff1a;<\/p>\n<p><span class=\"token builtin class-name\">source<\/span> .venv_sim\/bin\/activate<br \/>\npython gear_sonic\/scripts\/run_sim_loop.py <span class=\"token comment\"># \u5982\u679c\u662f\u670d\u52a1\u5668&#xff0c;\u8fd9\u91cc\u4f1a\u76f4\u63a5\u62a5\u9519&#xff0c;\u56e0\u4e3a\u5c1d\u8bd5\u6253\u5f00\u53ef\u89c6\u5316\u7a97\u53e3<\/span><\/p>\n<p>\u7ec8\u7aef 2 \u2014 \u90e8\u7f72&#xff08;\u4e3b\u673a\u6216 Docker&#xff0c;\u6765\u81eagear_sonic_deploy\/&#xff09;&#xff1a;<\/p>\n<p><span class=\"token function\">bash<\/span> deploy.sh sim<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5b98\u7f51\u6559\u7a0b<br \/>\nGR00T-WholeBodyControl \u8bba\u6587\u6807\u9898: SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control \u4f5c\u8005\u673a\u6784: \u82f1\u4f1f\u8fbe (Nvidia) \u8bba\u6587\u5730\u5740: https:\/\/arxiv.org\/abs\/2511.07820 \u9879\u76ee\u4e3b\u9875: https:\/\/nvlabs.github.io\/SONIC\/ Install<br \/>\n0. \u5148\u5b89\u88c5TensorRT<br \/>\n\u8fdb\u5165NVIDIA <\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[81,384],"topic":[],"class_list":["post-85187","post","type-post","status-publish","format-standard","hentry","category-server","tag-python","tag-384"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u3010locomotion\u3011SONIC\u5168\u8eab\u8fd0\u52a8\u8ddf\u8e2a\u4eff\u771f\u90e8\u7f72\u4fdd\u59c6\u7ea7\u6307\u5357\uff1a\u9002\u914d\u670d\u52a1\u5668\u7b49\u65e0\u53ef\u89c6\u5316\u754c\u9762\u60c5\u51b5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/85187.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010locomotion\u3011SONIC\u5168\u8eab\u8fd0\u52a8\u8ddf\u8e2a\u4eff\u771f\u90e8\u7f72\u4fdd\u59c6\u7ea7\u6307\u5357\uff1a\u9002\u914d\u670d\u52a1\u5668\u7b49\u65e0\u53ef\u89c6\u5316\u754c\u9762\u60c5\u51b5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u5b98\u7f51\u6559\u7a0b GR00T-WholeBodyControl \u8bba\u6587\u6807\u9898: SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control \u4f5c\u8005\u673a\u6784: \u82f1\u4f1f\u8fbe (Nvidia) \u8bba\u6587\u5730\u5740: https:\/\/arxiv.org\/abs\/2511.07820 \u9879\u76ee\u4e3b\u9875: https:\/\/nvlabs.github.io\/SONIC\/ Install 0. \u5148\u5b89\u88c5TensorRT \u8fdb\u5165NVIDIA\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/85187.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-26T21:00:43+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"32 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/85187.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/85187.html\",\"name\":\"\u3010locomotion\u3011SONIC\u5168\u8eab\u8fd0\u52a8\u8ddf\u8e2a\u4eff\u771f\u90e8\u7f72\u4fdd\u59c6\u7ea7\u6307\u5357\uff1a\u9002\u914d\u670d\u52a1\u5668\u7b49\u65e0\u53ef\u89c6\u5316\u754c\u9762\u60c5\u51b5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-07-26T21:00:43+00:00\",\"dateModified\":\"2026-07-26T21:00:43+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/85187.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/85187.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/85187.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010locomotion\u3011SONIC\u5168\u8eab\u8fd0\u52a8\u8ddf\u8e2a\u4eff\u771f\u90e8\u7f72\u4fdd\u59c6\u7ea7\u6307\u5357\uff1a\u9002\u914d\u670d\u52a1\u5668\u7b49\u65e0\u53ef\u89c6\u5316\u754c\u9762\u60c5\u51b5\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u3010locomotion\u3011SONIC\u5168\u8eab\u8fd0\u52a8\u8ddf\u8e2a\u4eff\u771f\u90e8\u7f72\u4fdd\u59c6\u7ea7\u6307\u5357\uff1a\u9002\u914d\u670d\u52a1\u5668\u7b49\u65e0\u53ef\u89c6\u5316\u754c\u9762\u60c5\u51b5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/85187.html","og_locale":"zh_CN","og_type":"article","og_title":"\u3010locomotion\u3011SONIC\u5168\u8eab\u8fd0\u52a8\u8ddf\u8e2a\u4eff\u771f\u90e8\u7f72\u4fdd\u59c6\u7ea7\u6307\u5357\uff1a\u9002\u914d\u670d\u52a1\u5668\u7b49\u65e0\u53ef\u89c6\u5316\u754c\u9762\u60c5\u51b5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u5b98\u7f51\u6559\u7a0b GR00T-WholeBodyControl \u8bba\u6587\u6807\u9898: SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control \u4f5c\u8005\u673a\u6784: \u82f1\u4f1f\u8fbe (Nvidia) \u8bba\u6587\u5730\u5740: https:\/\/arxiv.org\/abs\/2511.07820 \u9879\u76ee\u4e3b\u9875: https:\/\/nvlabs.github.io\/SONIC\/ Install 0. \u5148\u5b89\u88c5TensorRT \u8fdb\u5165NVIDIA","og_url":"https:\/\/www.wsisp.com\/helps\/85187.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-07-26T21:00:43+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"32 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/85187.html","url":"https:\/\/www.wsisp.com\/helps\/85187.html","name":"\u3010locomotion\u3011SONIC\u5168\u8eab\u8fd0\u52a8\u8ddf\u8e2a\u4eff\u771f\u90e8\u7f72\u4fdd\u59c6\u7ea7\u6307\u5357\uff1a\u9002\u914d\u670d\u52a1\u5668\u7b49\u65e0\u53ef\u89c6\u5316\u754c\u9762\u60c5\u51b5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-07-26T21:00:43+00:00","dateModified":"2026-07-26T21:00:43+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/85187.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/85187.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/85187.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u3010locomotion\u3011SONIC\u5168\u8eab\u8fd0\u52a8\u8ddf\u8e2a\u4eff\u771f\u90e8\u7f72\u4fdd\u59c6\u7ea7\u6307\u5357\uff1a\u9002\u914d\u670d\u52a1\u5668\u7b49\u65e0\u53ef\u89c6\u5316\u754c\u9762\u60c5\u51b5"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/85187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=85187"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/85187\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=85187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=85187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=85187"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=85187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}