@operato/scene-urdf 10.0.0-beta.2 → 10.0.0-beta.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -25
- package/TODO.md +58 -0
- package/dist/editors/index.d.ts +7 -0
- package/dist/editors/index.js +12 -1
- package/dist/editors/index.js.map +1 -1
- package/dist/editors/property-editor-urdf-joints.d.ts +54 -0
- package/dist/editors/property-editor-urdf-joints.js +246 -0
- package/dist/editors/property-editor-urdf-joints.js.map +1 -0
- package/dist/editors/property-editor-urdf-preset.d.ts +8 -0
- package/dist/editors/property-editor-urdf-preset.js +114 -0
- package/dist/editors/property-editor-urdf-preset.js.map +1 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/joint-controller.d.ts +35 -0
- package/dist/joint-controller.js +34 -0
- package/dist/joint-controller.js.map +1 -0
- package/dist/real-object-urdf.d.ts +106 -0
- package/dist/real-object-urdf.js +527 -0
- package/dist/real-object-urdf.js.map +1 -0
- package/dist/smoothing-controller.d.ts +15 -0
- package/dist/smoothing-controller.js +88 -0
- package/dist/smoothing-controller.js.map +1 -0
- package/dist/templates/index.d.ts +3 -0
- package/dist/templates/index.js +2 -3
- package/dist/templates/index.js.map +1 -1
- package/dist/templates/{urdf-controller.d.ts → urdf.d.ts} +3 -0
- package/dist/templates/urdf.js +19 -0
- package/dist/templates/urdf.js.map +1 -0
- package/dist/urdf-object.d.ts +502 -0
- package/dist/urdf-object.js +153 -0
- package/dist/urdf-object.js.map +1 -0
- package/dist/urdf-presets.d.ts +22 -0
- package/dist/urdf-presets.js +176 -0
- package/dist/urdf-presets.js.map +1 -0
- package/icons/urdf.png +0 -0
- package/package.json +5 -4
- package/translations/en.json +10 -16
- package/translations/ja.json +10 -16
- package/translations/ko.json +10 -16
- package/translations/ms.json +10 -16
- package/translations/zh.json +10 -16
- package/dist/elements/drag-n-drop.d.ts +0 -2
- package/dist/elements/drag-n-drop.js +0 -126
- package/dist/elements/drag-n-drop.js.map +0 -1
- package/dist/elements/urdf-controller-element.d.ts +0 -12
- package/dist/elements/urdf-controller-element.js +0 -283
- package/dist/elements/urdf-controller-element.js.map +0 -1
- package/dist/elements/urdf-drag-controls.d.ts +0 -32
- package/dist/elements/urdf-drag-controls.js +0 -197
- package/dist/elements/urdf-drag-controls.js.map +0 -1
- package/dist/elements/urdf-manipulator-element.d.ts +0 -15
- package/dist/elements/urdf-manipulator-element.js +0 -112
- package/dist/elements/urdf-manipulator-element.js.map +0 -1
- package/dist/elements/urdf-viewer-element.d.ts +0 -53
- package/dist/elements/urdf-viewer-element.js +0 -414
- package/dist/elements/urdf-viewer-element.js.map +0 -1
- package/dist/templates/urdf-controller.js +0 -16
- package/dist/templates/urdf-controller.js.map +0 -1
- package/dist/templates/urdf-viewer.d.ts +0 -14
- package/dist/templates/urdf-viewer.js +0 -16
- package/dist/templates/urdf-viewer.js.map +0 -1
- package/dist/urdf-controller.d.ts +0 -15
- package/dist/urdf-controller.js +0 -70
- package/dist/urdf-controller.js.map +0 -1
- package/dist/urdf-viewer.d.ts +0 -16
- package/dist/urdf-viewer.js +0 -202
- package/dist/urdf-viewer.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,mDAAmD;AACnD,OAAO,kBAAkB,CAAA;AACzB,0CAA0C;AAC1C,OAAO,2BAA2B,CAAA;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,gDAAgD;AAChD,2EAA2E;AAC3E,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,uBAAuB,CAAA;AAM9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n *\n * URDF 플러그인 — things-scene의 RealObjectExternalModel 베이스를 상속받아\n * URDF(Unified Robot Description Format) 로봇을 네이티브 3D 씬 오브젝트로\n * 렌더링한다. @sceneComponent('urdf')로 등록되어 things-factory 보드에서\n * 일반 컴포넌트처럼 사용 가능.\n *\n * 기본 loader는 STL/DAE/GLB를 지원하며, GLB는 things-scene의 RealObjectGLTF\n * 캐시와 공유한다. xacro 전처리는 현재 미지원(ros-industrial 로봇 등은 사전\n * 변환된 URDF 필요).\n */\n\n// @sceneComponent decorator side-effect를 위해 import\nimport './urdf-object.js'\n// 기본 'smooth' controller 등록 (side-effect)\nimport './smoothing-controller.js'\n\nexport { RealObjectURDF } from './real-object-urdf.js'\nexport type { URDFJointState, URDFJointMeta } from './real-object-urdf.js'\nexport { URDFObject } from './urdf-object.js'\n\n// 외부 모듈이 자체 JointController를 등록할 때 사용하는 공개 API.\n// 예: @operato/scene-urdf-rapier가 `registerJointController('rapier', ...)`.\nexport {\n registerJointController,\n createJointController,\n listJointControllers\n} from './joint-controller.js'\nexport type {\n JointController,\n JointControllerContext,\n JointControllerFactory\n} from './joint-controller.js'\nexport { SmoothingController } from './smoothing-controller.js'\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { URDFRobot, URDFJoint } from 'urdf-loader';
|
|
2
|
+
import type { URDFJointMeta } from './real-object-urdf.js';
|
|
3
|
+
export interface JointControllerContext {
|
|
4
|
+
robot: URDFRobot;
|
|
5
|
+
/** non-fixed + fixed 포함 모든 조인트 */
|
|
6
|
+
joints: Map<string, URDFJoint>;
|
|
7
|
+
/** non-fixed 조인트의 메타 (type, axis, limit) — fixed는 제외됨 */
|
|
8
|
+
jointMeta: Map<string, URDFJointMeta>;
|
|
9
|
+
}
|
|
10
|
+
export interface JointController {
|
|
11
|
+
/** 로봇 로드 직후 1회 호출. 내부 상태(current/target/velocity 등) 초기화. */
|
|
12
|
+
setup(ctx: JointControllerContext): void;
|
|
13
|
+
/**
|
|
14
|
+
* state.joints 변경 시 호출. controller가 `targets` 맵을 내부 저장하고
|
|
15
|
+
* tick에서 실제 적용을 결정한다. 각 value는 joint의 internal unit
|
|
16
|
+
* (revolute=rad, prismatic=m).
|
|
17
|
+
*/
|
|
18
|
+
setTargets(targets: Record<string, number>): void;
|
|
19
|
+
/**
|
|
20
|
+
* 매 프레임 호출 (requestAnimationFrame). dt는 초 단위.
|
|
21
|
+
* 관절에 값을 적용(joint.setJointValue)하고, 값이 실제로 변경됐다면 true를
|
|
22
|
+
* 반환 (상위가 invalidate를 결정).
|
|
23
|
+
*/
|
|
24
|
+
tick(dt: number): boolean;
|
|
25
|
+
/** 로봇 해제 시 호출. 내부 자원/캐시 정리. */
|
|
26
|
+
dispose(): void;
|
|
27
|
+
}
|
|
28
|
+
export type JointControllerFactory = () => JointController;
|
|
29
|
+
/**
|
|
30
|
+
* 외부 패키지가 자신의 controller 구현을 등록한다.
|
|
31
|
+
* 예: `registerJointController('rapier', () => new RapierJointController())`.
|
|
32
|
+
*/
|
|
33
|
+
export declare function registerJointController(name: string, factory: JointControllerFactory): void;
|
|
34
|
+
export declare function createJointController(name: string): JointController | undefined;
|
|
35
|
+
export declare function listJointControllers(): string[];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* URDF 조인트 제어기 추상화.
|
|
5
|
+
*
|
|
6
|
+
* 배경:
|
|
7
|
+
* state.joints는 조인트의 "목표값"을 표현하고, 실제 URDFJoint에 적용되는 값은
|
|
8
|
+
* 어떤 정책을 따를지에 따라 달라질 수 있다.
|
|
9
|
+
* - Direct: 목표값을 즉시 적용 (현재 기본 동작)
|
|
10
|
+
* - Smooth: 스프링-댐퍼로 부드럽게 수렴
|
|
11
|
+
* - Rapier 등 물리: rigid body 시뮬레이션의 결과를 관절에 반영
|
|
12
|
+
*
|
|
13
|
+
* 이들은 모두 "목표값 → 실제 적용값" 매핑이라는 공통 추상으로 묶을 수 있다.
|
|
14
|
+
*
|
|
15
|
+
* 확장:
|
|
16
|
+
* 외부 패키지가 `registerJointController('rapier', ...)` 형태로 구현을 등록해
|
|
17
|
+
* urdf 컴포넌트의 state.physics 값을 통해 선택 가능. 예를 들어 미래의
|
|
18
|
+
* `@operato/scene-urdf-rapier` 패키지가 Rapier 기반 controller를 register.
|
|
19
|
+
*/
|
|
20
|
+
const registry = new Map();
|
|
21
|
+
/**
|
|
22
|
+
* 외부 패키지가 자신의 controller 구현을 등록한다.
|
|
23
|
+
* 예: `registerJointController('rapier', () => new RapierJointController())`.
|
|
24
|
+
*/
|
|
25
|
+
export function registerJointController(name, factory) {
|
|
26
|
+
registry.set(name, factory);
|
|
27
|
+
}
|
|
28
|
+
export function createJointController(name) {
|
|
29
|
+
return registry.get(name)?.();
|
|
30
|
+
}
|
|
31
|
+
export function listJointControllers() {
|
|
32
|
+
return [...registry.keys()];
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=joint-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"joint-controller.js","sourceRoot":"","sources":["../src/joint-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAqCH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAA;AAE1D;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,OAA+B;IACnF,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;AAC7B,CAAC","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n *\n * URDF 조인트 제어기 추상화.\n *\n * 배경:\n * state.joints는 조인트의 \"목표값\"을 표현하고, 실제 URDFJoint에 적용되는 값은\n * 어떤 정책을 따를지에 따라 달라질 수 있다.\n * - Direct: 목표값을 즉시 적용 (현재 기본 동작)\n * - Smooth: 스프링-댐퍼로 부드럽게 수렴\n * - Rapier 등 물리: rigid body 시뮬레이션의 결과를 관절에 반영\n *\n * 이들은 모두 \"목표값 → 실제 적용값\" 매핑이라는 공통 추상으로 묶을 수 있다.\n *\n * 확장:\n * 외부 패키지가 `registerJointController('rapier', ...)` 형태로 구현을 등록해\n * urdf 컴포넌트의 state.physics 값을 통해 선택 가능. 예를 들어 미래의\n * `@operato/scene-urdf-rapier` 패키지가 Rapier 기반 controller를 register.\n */\n\nimport type { URDFRobot, URDFJoint } from 'urdf-loader'\nimport type { URDFJointMeta } from './real-object-urdf.js'\n\nexport interface JointControllerContext {\n robot: URDFRobot\n /** non-fixed + fixed 포함 모든 조인트 */\n joints: Map<string, URDFJoint>\n /** non-fixed 조인트의 메타 (type, axis, limit) — fixed는 제외됨 */\n jointMeta: Map<string, URDFJointMeta>\n}\n\nexport interface JointController {\n /** 로봇 로드 직후 1회 호출. 내부 상태(current/target/velocity 등) 초기화. */\n setup(ctx: JointControllerContext): void\n\n /**\n * state.joints 변경 시 호출. controller가 `targets` 맵을 내부 저장하고\n * tick에서 실제 적용을 결정한다. 각 value는 joint의 internal unit\n * (revolute=rad, prismatic=m).\n */\n setTargets(targets: Record<string, number>): void\n\n /**\n * 매 프레임 호출 (requestAnimationFrame). dt는 초 단위.\n * 관절에 값을 적용(joint.setJointValue)하고, 값이 실제로 변경됐다면 true를\n * 반환 (상위가 invalidate를 결정).\n */\n tick(dt: number): boolean\n\n /** 로봇 해제 시 호출. 내부 자원/캐시 정리. */\n dispose(): void\n}\n\nexport type JointControllerFactory = () => JointController\n\nconst registry = new Map<string, JointControllerFactory>()\n\n/**\n * 외부 패키지가 자신의 controller 구현을 등록한다.\n * 예: `registerJointController('rapier', () => new RapierJointController())`.\n */\nexport function registerJointController(name: string, factory: JointControllerFactory): void {\n registry.set(name, factory)\n}\n\nexport function createJointController(name: string): JointController | undefined {\n return registry.get(name)?.()\n}\n\nexport function listJointControllers(): string[] {\n return [...registry.keys()]\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import type { URDFRobot } from 'urdf-loader';
|
|
3
|
+
import type { Properties } from '@hatiolab/things-scene';
|
|
4
|
+
import { RealObjectExternalModel } from '@hatiolab/things-scene';
|
|
5
|
+
export interface URDFJointState {
|
|
6
|
+
/** revolute/continuous: 라디안. prismatic: 거리(URDF 단위). */
|
|
7
|
+
value?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface URDFJointMeta {
|
|
10
|
+
name: string;
|
|
11
|
+
type: 'fixed' | 'continuous' | 'revolute' | 'planar' | 'prismatic' | 'floating';
|
|
12
|
+
axis: {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
z: number;
|
|
16
|
+
};
|
|
17
|
+
limit: {
|
|
18
|
+
lower: number;
|
|
19
|
+
upper: number;
|
|
20
|
+
effort: number;
|
|
21
|
+
velocity: number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export declare class RealObjectURDF extends RealObjectExternalModel<URDFRobot> {
|
|
25
|
+
protected get _formatLabel(): string;
|
|
26
|
+
protected get _placeholderColor(): number;
|
|
27
|
+
private static _urdfCache;
|
|
28
|
+
private static _topViewCache;
|
|
29
|
+
/**
|
|
30
|
+
* URDF를 로드한다 (동일 URL 캐시).
|
|
31
|
+
* mesh 로더는 STL/DAE(내장) + OBJ(MTL 연동) + GLB(확장)를 지원한다.
|
|
32
|
+
*
|
|
33
|
+
* URDFLoader.loadAsync는 URDF XML 파싱 직후 resolve하지만 mesh(STL/DAE/GLB)는
|
|
34
|
+
* 비동기로 뒤늦게 attach된다. robot.clone() 시점에 mesh가 아직 없으면 클론된
|
|
35
|
+
* 트리엔 visual이 비게 되고 원본에만 mesh가 붙는다. 전용 LoadingManager의
|
|
36
|
+
* onLoad를 사용해 URDF + 모든 mesh가 완료된 후 resolve한다.
|
|
37
|
+
*
|
|
38
|
+
* `packages` 옵션을 통해 ROS `package://<pkg>/<rel>` prefix 해석을 설정할 수
|
|
39
|
+
* 있다 (예: `{ a1_description: 'https://.../robots/a1_description' }`).
|
|
40
|
+
*/
|
|
41
|
+
static loadURDF(url: string, packages?: Record<string, string>): Promise<URDFRobot>;
|
|
42
|
+
/** 모든 캐시 비움 (보드 전환 시 호출) */
|
|
43
|
+
static flushCache(): void;
|
|
44
|
+
static getTopViewCache(source: string): HTMLCanvasElement | undefined;
|
|
45
|
+
static setTopViewCache(source: string, canvas: HTMLCanvasElement): void;
|
|
46
|
+
private _robot?;
|
|
47
|
+
private _jointIndex;
|
|
48
|
+
private _jointMeta;
|
|
49
|
+
private _jointOriginals;
|
|
50
|
+
private _animRaf?;
|
|
51
|
+
private _animStartTime;
|
|
52
|
+
private _controller?;
|
|
53
|
+
private _ctrlRaf?;
|
|
54
|
+
private _ctrlLastTime;
|
|
55
|
+
get robot(): URDFRobot | undefined;
|
|
56
|
+
/** 로드된 조인트 메타 리스트 (property panel 등이 참조) */
|
|
57
|
+
get jointMeta(): URDFJointMeta[];
|
|
58
|
+
get jointNames(): string[];
|
|
59
|
+
protected _loadExternal(url: string): Promise<URDFRobot>;
|
|
60
|
+
protected _onLoaded(robot: URDFRobot): void;
|
|
61
|
+
private _resolveUnitScale;
|
|
62
|
+
/**
|
|
63
|
+
* 조인트 트리를 순회하며 인덱스와 메타를 구축한다.
|
|
64
|
+
* fixed 조인트는 조작 대상이 아니므로 메타에서 제외하되 인덱스에는 남긴다.
|
|
65
|
+
*/
|
|
66
|
+
private _buildJointIndex;
|
|
67
|
+
/**
|
|
68
|
+
* state.joints 변경을 적절한 경로로 디스패치한다.
|
|
69
|
+
* - controller가 활성이면 setTargets (controller가 스무딩/물리 적용)
|
|
70
|
+
* - 없으면 즉시 적용 (direct 모드, 기본)
|
|
71
|
+
*/
|
|
72
|
+
private _dispatchJointStates;
|
|
73
|
+
/**
|
|
74
|
+
* Controller를 인스턴스화하고 setup + tick 루프 시작.
|
|
75
|
+
* 이미 활성 중이면 먼저 해제.
|
|
76
|
+
*/
|
|
77
|
+
private _setupController;
|
|
78
|
+
private _disposeController;
|
|
79
|
+
/**
|
|
80
|
+
* state.joints 맵을 순회하며 각 조인트 값을 적용한다 (direct 모드).
|
|
81
|
+
* 값은 숫자 또는 { value: number } 형식 모두 허용 (유연성).
|
|
82
|
+
*
|
|
83
|
+
* joint transform 변경 후 component.invalidate()로 재렌더를 요청한다.
|
|
84
|
+
* 표준 경로: invalidate → Layer.throttle_render → rAF __draw__ → trigger('redraw')
|
|
85
|
+
* → ThreeCapability.animate → renderThreeD.
|
|
86
|
+
*/
|
|
87
|
+
private _applyJointStates;
|
|
88
|
+
/**
|
|
89
|
+
* 자동 sine 애니메이션 시작.
|
|
90
|
+
* 각 non-fixed 조인트를 limit 범위 내에서 sine 스윙. 조인트 순서에 따라
|
|
91
|
+
* frequency와 phase를 약간씩 다르게 해 동기화를 피하고 유기적 움직임을 만든다.
|
|
92
|
+
*
|
|
93
|
+
* state.joints를 건드리지 않고 joint.setJointValue만 직접 호출 — state 변경
|
|
94
|
+
* cascade를 피해 성능을 유지하고, 슬라이더가 있는 경우에도 state와 시각이
|
|
95
|
+
* 분리되어 표시됨 (활성 시 state는 의미 없음).
|
|
96
|
+
*/
|
|
97
|
+
private _startAutoAnimate;
|
|
98
|
+
private _stopAutoAnimate;
|
|
99
|
+
/**
|
|
100
|
+
* 모든 조인트를 원본 값으로 복원한다.
|
|
101
|
+
*/
|
|
102
|
+
private _resetAllJoints;
|
|
103
|
+
clear(): THREE.Object3D<THREE.Object3DEventMap>;
|
|
104
|
+
updateDimension(): void;
|
|
105
|
+
onchange(after: Properties, before: Properties): void;
|
|
106
|
+
}
|