{"id":51265923,"url":"https://github.com/machbase/neo-pkg-robot-demo","last_synced_at":"2026-06-29T15:01:50.460Z","repository":{"id":361126852,"uuid":"1253166117","full_name":"machbase/neo-pkg-robot-demo","owner":"machbase","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-29T08:42:01.000Z","size":7606,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T10:21:02.817Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/machbase.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-29T07:54:10.000Z","updated_at":"2026-05-29T08:42:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/machbase/neo-pkg-robot-demo","commit_stats":null,"previous_names":["machbase/neo-pkg-robot-demo"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/machbase/neo-pkg-robot-demo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machbase%2Fneo-pkg-robot-demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machbase%2Fneo-pkg-robot-demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machbase%2Fneo-pkg-robot-demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machbase%2Fneo-pkg-robot-demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/machbase","download_url":"https://codeload.github.com/machbase/neo-pkg-robot-demo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machbase%2Fneo-pkg-robot-demo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34931592,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-29T15:01:47.474Z","updated_at":"2026-06-29T15:01:50.453Z","avatar_url":"https://github.com/machbase.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Machbase Neo 로봇 Physical AI 데모\n\nMachbase Neo에서 DROID/LeRobot 로봇 조작 데이터를 저장하고 재생하는 3D 데모입니다.\n\n이 데모는 로봇의 frame-level time-series 데이터를 하나의 JSON TAG 테이블에 저장하고, 브라우저에서 로봇 팔 움직임, timeline, metric chart, event marker를 함께 보여줍니다.\n\n## 실행 환경\n\n이 프로젝트는 일반 Node.js가 아니라 **Machbase Neo JSH runtime**을 대상으로 합니다.\n\n예시 경로:\n\n```sh\n~/work/neo/current/machbase-neo\n```\n\nDB 접속 기본값:\n\n```text\nhost: 127.0.0.1\nport: 5656\nuser: sys\npassword: manager\n```\n\n## 데이터 출처\n\n사용 데이터는 DROID 데이터셋의 LeRobot 변환본인 `lerobot/droid_100`입니다.\n\n참고:\n\n- DROID 공식 데이터셋: https://droid-dataset.github.io/\n- Hugging Face LeRobot droid_100: https://huggingface.co/datasets/lerobot/droid_100\n\n로컬 데이터 구조:\n\n```text\ndata/raw/droid_lerobot/\n├── data/chunk-000/file-000.parquet\n├── meta/info.json\n├── meta/tasks.parquet\n├── meta/episodes/chunk-000/file-000.parquet\n├── conversion-summary.json\n└── episodes/episode_*/trajectory.ndjson\n```\n\n`data/chunk-000/file-000.parquet`가 frame-level 원본에 가까운 LeRobot parquet 데이터입니다.\n\n`episodes/episode_*/trajectory.ndjson`는 JSH ingest가 쉽게 읽을 수 있도록 만든 데모용 변환본입니다. 현재 ingest script는 이 NDJSON 파일들을 읽습니다.\n\n## 데이터 명세\n\n원본 LeRobot 명세 기준:\n\n- episodes: 100개\n- frames: 32,212개\n- fps: 15\n- 주요 필드:\n  - `observation.state`: 7축 motor state\n  - `action`: 7축 action vector\n  - `timestamp`\n  - `episode_index`\n  - `frame_index`\n  - `task_index`\n  - `next.reward`\n  - `next.done`\n\n현재 로딩은 원본 fps에 맞추기 위해 `--sample-ms 67`을 사용합니다. 정확한 15fps 간격은 66.666...ms이지만 ingest 옵션은 정수 ms를 사용합니다.\n\n## 테이블 구조\n\n이 데모는 기존처럼 frame/signal/event를 여러 테이블로 나누지 않고, 하나의 TAG 테이블만 사용합니다.\n\n```text\nPHY_ROBOT_TIMELINE\n```\n\n특징:\n\n- `value JSON SUMMARIZED`\n- `kind=\"state\"` row: 로봇 상태 frame\n- `kind=\"event\"` row: timeline event marker\n- JSON path rollup 사용\n- JSON path index 사용\n\n생성되는 주요 rollup path:\n\n```text\n$.derived.ee_speed\n$.derived.ee_acceleration\n$.derived.motion_energy\n$.derived.anomaly_score\n$.derived.path_length\n$.robot.gripper\n$.derived.cycle_phase\n```\n\n생성되는 주요 JSON path index:\n\n```text\n$.kind\n$.event.type\n$.event.severity\n$.frame.id\n```\n\n## 데이터 로딩\n\n전체 100개 episode를 로딩하는 명령입니다.\n\n```sh\ncd ~/work/neo/current/public/neo-pkg-robot-demo\n\n~/work/neo/current/machbase-neo jsh scripts/schema.js\n\n~/work/neo/current/machbase-neo jsh scripts/ingest.js \\\n  --data-root /work/data/raw/droid_lerobot \\\n  --dataset droid \\\n  --sequence droid-real-json-full \\\n  --min-duration-sec 999999 \\\n  --sample-ms 67 \\\n  --base-time 2026-01-01T00:00:00Z\n```\n\n이미 데이터가 들어 있는 상태에서 깨끗하게 다시 넣으려면 `PHY_ROBOT_TIMELINE`과 관련 rollup을 먼저 삭제한 뒤 위 명령을 다시 실행합니다.\n\n## 서버 실행\n\n```sh\ncd ~/work/neo/current/public/neo-pkg-robot-demo\n\n~/work/neo/current/machbase-neo jsh app/server.js \\\n  --host 127.0.0.1 \\\n  --port 56803\n```\n\n접속 URL:\n\n```text\nhttp://127.0.0.1:56803/\n```\n\n## 화면 구성\n\n브라우저 화면은 다음 정보를 보여줍니다.\n\n- 3D 로봇 팔 replay\n- timeline slider\n- play / skip controls\n- 현재 frame 정보\n- task / episode / gripper / end-effector speed\n- Frame Query latency\n- Window Query latency\n- JSON path rollup chart\n- event marker\n\n`Frame Query`는 현재 timeline 위치의 frame 1개를 조회하는 시간입니다.\n\n`Window Query`는 현재 시점 주변의 frame window를 조회하는 시간입니다.\n\n## 주요 SQL\n\n현재 frame 조회:\n\n```sql\nSELECT time, value, dataset, sequence, episode_id\nFROM PHY_ROBOT_TIMELINE\nWHERE dataset = ?\n  AND sequence = ?\n  AND value-\u003e'$.kind' = 'state'\n  AND time BETWEEN ? AND ?\nORDER BY time DESC\nLIMIT 1;\n```\n\n화면에서는 뒤쪽으로 갈수록 느려지지 않도록 frame query의 `BETWEEN` 범위를 현재 시점 직전 약 60초로 제한합니다.\n\n주변 window 조회:\n\n```sql\nSELECT time, value, dataset, sequence, episode_id\nFROM PHY_ROBOT_TIMELINE\nWHERE dataset = ?\n  AND sequence = ?\n  AND value-\u003e'$.kind' = 'state'\n  AND time BETWEEN ? AND ?\nORDER BY time\nLIMIT \u003climit\u003e;\n```\n\nJSON path rollup chart:\n\n```sql\nSELECT\n  rollup('sec', \u003cinterval_sec\u003e, time) AS sample_time,\n  SUM(value-\u003e'\u003cjson_path\u003e') AS sum_value,\n  COUNT(value-\u003e'\u003cjson_path\u003e') AS count_value\nFROM PHY_ROBOT_TIMELINE\nWHERE dataset = ?\n  AND sequence = ?\n  AND time BETWEEN ? AND ?\nGROUP BY sample_time\nORDER BY sample_time\nLIMIT \u003climit\u003e;\n```\n\nevent 조회:\n\n```sql\nSELECT time, value\nFROM PHY_ROBOT_TIMELINE\nWHERE dataset = ?\n  AND sequence = ?\n  AND value-\u003e'$.kind' = 'event'\n  AND time BETWEEN ? AND ?\nORDER BY time\nLIMIT \u003climit\u003e;\n```\n\n## 주의 사항\n\n현재 3D 로봇 팔은 실제 DROID 동영상과 완전히 일치하는 calibrated robot FK 모델이 아닙니다.\n\n원본 데이터의 7축 motor state와 데모용 `cartesian_position`을 이용한 시각화용 렌더링입니다. 이 데모의 핵심 목적은 실제 로봇 데이터를 Machbase Neo에 저장하고, JSON TAG table과 JSON path rollup으로 빠르게 조회/분석하는 흐름을 보여주는 것입니다.\n\n## 파일 구성\n\n```text\nlib/schema.js      테이블, rollup, index 생성\nscripts/schema.js  schema 생성 실행 스크립트\nscripts/ingest.js  DROID NDJSON 로딩 및 파생 metric/event 생성\nlib/api.js         manifest/frame/window/signals/events API 구현\napp/server.js      JSH HTTP 서버\npublic/app.js      Three.js 기반 브라우저 UI\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmachbase%2Fneo-pkg-robot-demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmachbase%2Fneo-pkg-robot-demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmachbase%2Fneo-pkg-robot-demo/lists"}