@viamrobotics/test-widgets 0.6.1 → 0.8.0
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 +1 -1
- package/dist/api-docs-href.d.ts +8 -0
- package/dist/api-docs-href.js +17 -0
- package/dist/client-map.d.ts +30 -30
- package/dist/client-map.js +32 -29
- package/dist/components/angle-unit-toggle.svelte +1 -4
- package/dist/components/api-section.svelte +21 -23
- package/dist/components/api-section.svelte.d.ts +2 -0
- package/dist/components/index.d.ts +21 -0
- package/dist/components/index.js +21 -0
- package/dist/components/is-moving.svelte +4 -5
- package/dist/components/is-moving.svelte.d.ts +1 -0
- package/dist/components/mutation-section.svelte +20 -23
- package/dist/components/mutation-section.svelte.d.ts +2 -0
- package/dist/components/section-title.svelte +63 -0
- package/dist/components/section-title.svelte.d.ts +14 -0
- package/dist/components/widgets/arm/arm.svelte +25 -29
- package/dist/components/widgets/arm/get-joint-positions-widget.svelte +36 -0
- package/dist/components/widgets/arm/get-joint-positions-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/arm/is-moving-widget.svelte +20 -0
- package/dist/components/widgets/arm/is-moving-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/arm/joint-position-editor.svelte +89 -0
- package/dist/components/widgets/arm/joint-position-editor.svelte.d.ts +11 -0
- package/dist/components/widgets/arm/joint-position-quick-move.svelte +85 -0
- package/dist/components/widgets/arm/joint-position-quick-move.svelte.d.ts +9 -0
- package/dist/components/widgets/arm/joint-position-slider.svelte +36 -0
- package/dist/components/widgets/arm/joint-position-slider.svelte.d.ts +9 -0
- package/dist/components/widgets/arm/move-to-joint-positions-widget.svelte +9 -5
- package/dist/components/widgets/arm/move-to-joint-positions.svelte +73 -127
- package/dist/components/widgets/arm/move-to-joint-positions.svelte.d.ts +1 -0
- package/dist/components/widgets/arm/move-to-position.svelte +31 -3
- package/dist/components/widgets/audio-input/audio-input.svelte +2 -0
- package/dist/components/widgets/audio-input/get-properties-widget.svelte +43 -0
- package/dist/components/widgets/audio-input/get-properties-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/audio-output/audio-output.svelte +2 -0
- package/dist/components/widgets/audio-output/get-properties-widget.svelte +43 -0
- package/dist/components/widgets/audio-output/get-properties-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/base/base.svelte +9 -1
- package/dist/components/widgets/base/is-moving-widget.svelte +20 -0
- package/dist/components/widgets/base/is-moving-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/base/quick-move.svelte +12 -5
- package/dist/components/widgets/camera/camera.svelte +156 -142
- package/dist/components/widgets/camera/live-or-polling-video.svelte +9 -1
- package/dist/components/widgets/discovery/discovery.svelte +1 -0
- package/dist/components/widgets/encoder/encoder-position-type.d.ts +8 -0
- package/dist/components/widgets/encoder/encoder-position-type.js +20 -0
- package/dist/components/widgets/encoder/encoder.svelte +5 -20
- package/dist/components/widgets/encoder/get-position-widget.svelte +54 -0
- package/dist/components/widgets/encoder/get-position-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/gantry/gantry.svelte +28 -5
- package/dist/components/widgets/gantry/get-position-widget.svelte +43 -0
- package/dist/components/widgets/gantry/get-position-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/gantry/is-moving-widget.svelte +20 -0
- package/dist/components/widgets/gantry/is-moving-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/generic/generic.svelte +8 -1
- package/dist/components/widgets/gripper/gripper.svelte +11 -5
- package/dist/components/widgets/gripper/is-holding-something.svelte +2 -4
- package/dist/components/widgets/gripper/is-moving-widget.svelte +20 -0
- package/dist/components/widgets/gripper/is-moving-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/input-controller/input-controller.svelte +2 -1
- package/dist/components/widgets/motor/is-moving-widget.svelte +20 -0
- package/dist/components/widgets/motor/is-moving-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/motor/motor.svelte +13 -9
- package/dist/components/widgets/movement-sensor/get-accuracy-widget.svelte +38 -0
- package/dist/components/widgets/movement-sensor/get-accuracy-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/movement-sensor/get-compass-heading-widget.svelte +38 -0
- package/dist/components/widgets/movement-sensor/get-compass-heading-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/movement-sensor/get-orientation-widget.svelte +38 -0
- package/dist/components/widgets/movement-sensor/get-orientation-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/movement-sensor/get-position-widget.svelte +38 -0
- package/dist/components/widgets/movement-sensor/get-position-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/movement-sensor/movement-sensor.svelte +53 -26
- package/dist/components/widgets/power-sensor/get-current-widget.svelte +38 -0
- package/dist/components/widgets/power-sensor/get-current-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/power-sensor/get-power-widget.svelte +38 -0
- package/dist/components/widgets/power-sensor/get-power-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/power-sensor/get-voltage-widget.svelte +38 -0
- package/dist/components/widgets/power-sensor/get-voltage-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/power-sensor/power-sensor.svelte +4 -0
- package/dist/components/widgets/sensor/sensor.svelte +1 -0
- package/dist/components/widgets/servo/is-moving-widget.svelte +20 -0
- package/dist/components/widgets/servo/is-moving-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/servo/servo.svelte +10 -2
- package/dist/components/widgets/slam/get-position-widget.svelte +38 -0
- package/dist/components/widgets/slam/get-position-widget.svelte.d.ts +7 -0
- package/dist/components/widgets/slam/move-on-map.svelte +4 -1
- package/dist/components/widgets/slam/slam.svelte +4 -1
- package/dist/components/widgets/vision-service/context.svelte.d.ts +1 -0
- package/dist/components/widgets/vision-service/context.svelte.js +7 -0
- package/dist/components/widgets/vision-service/detection-row.svelte +38 -0
- package/dist/components/widgets/vision-service/detection-row.svelte.d.ts +8 -0
- package/dist/components/widgets/vision-service/detection.svelte +7 -4
- package/dist/components/widgets/vision-service/legend.svelte +14 -11
- package/dist/components/widgets/vision-service/vision-service.svelte +9 -10
- package/dist/index.d.ts +5 -1
- package/dist/index.js +6 -1
- package/dist/pip/context.svelte.d.ts +2 -0
- package/dist/pip/context.svelte.js +48 -20
- package/dist/resource-triplet.d.ts +37 -0
- package/dist/resource-triplet.js +37 -0
- package/dist/resource-widget.js +187 -0
- package/dist/resource.d.ts +0 -9
- package/dist/resource.js +0 -72
- package/package.json +7 -4
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
import ApiSection from '../../api-section.svelte'
|
|
12
12
|
import ConnectionStatus from '../../connection-status.svelte'
|
|
13
13
|
import IsMoving from '../../is-moving.svelte'
|
|
14
|
-
import Queries from '../../queries.svelte'
|
|
15
14
|
import Query from '../../query.svelte'
|
|
16
15
|
import StopButton from '../../stop-button.svelte'
|
|
17
16
|
|
|
@@ -19,7 +18,6 @@
|
|
|
19
18
|
import { getJointPositionLimits, type KinematicsJSON } from './joint-position-limits'
|
|
20
19
|
import MoveToJointPositions from './move-to-joint-positions.svelte'
|
|
21
20
|
import MoveToPosition from './move-to-position.svelte'
|
|
22
|
-
import QuickMove from './quick-move.svelte'
|
|
23
21
|
|
|
24
22
|
interface Props {
|
|
25
23
|
partID: string
|
|
@@ -38,9 +36,9 @@
|
|
|
38
36
|
const jointPositionsQuery = createResourceQuery(client, 'getJointPositions', options)
|
|
39
37
|
const endPositionQuery = createResourceQuery(client, 'getEndPosition', options)
|
|
40
38
|
const kinematicsQuery = createResourceQuery(client, 'getKinematics', options)
|
|
39
|
+
const isMovingQuery = createResourceQuery(client, 'isMoving', options)
|
|
41
40
|
|
|
42
41
|
const moveToJointPosMutation = createResourceMutation(client, 'moveToJointPositions')
|
|
43
|
-
const quickMoveToJointPosMutation = createResourceMutation(client, 'moveToJointPositions')
|
|
44
42
|
const stopMutation = createResourceMutation(client, 'stop')
|
|
45
43
|
const moveToPosMutation = createResourceMutation(client, 'moveToPosition')
|
|
46
44
|
|
|
@@ -48,13 +46,13 @@
|
|
|
48
46
|
moveToJointPosMutation.mutate([jointPositionsList], {})
|
|
49
47
|
}
|
|
50
48
|
|
|
51
|
-
const quickMoveToJointPositions = (jointPositionsList: number[]) => {
|
|
52
|
-
quickMoveToJointPosMutation.mutate([jointPositionsList], {})
|
|
53
|
-
}
|
|
54
|
-
|
|
55
49
|
const moveToPosition = (position: Pose) => {
|
|
56
50
|
moveToPosMutation.mutate([position], {})
|
|
57
51
|
}
|
|
52
|
+
|
|
53
|
+
const jointLimitsDegrees = $derived(
|
|
54
|
+
kinematicsQuery.data ? getJointPositionLimits(kinematicsQuery.data as KinematicsJSON) : []
|
|
55
|
+
)
|
|
58
56
|
</script>
|
|
59
57
|
|
|
60
58
|
<ConnectionStatus {partID}>
|
|
@@ -62,10 +60,11 @@
|
|
|
62
60
|
<div class="flex flex-col gap-4 lg:flex-row lg:gap-0 lg:divide-x">
|
|
63
61
|
<!-- Main control sections -->
|
|
64
62
|
<div
|
|
65
|
-
class="flex flex-col gap-4 lg:grid lg:grow lg:grid-cols-2 lg:gap-0 lg:divide-x xl:grid-cols-
|
|
63
|
+
class="flex flex-col gap-4 lg:grid lg:grow lg:grid-cols-2 lg:gap-0 lg:divide-x xl:grid-cols-3"
|
|
66
64
|
>
|
|
67
65
|
<ApiSection
|
|
68
66
|
title="GetJointPositions"
|
|
67
|
+
api="rdk:component:arm"
|
|
69
68
|
bottomText="Updates automatically"
|
|
70
69
|
>
|
|
71
70
|
<Query query={jointPositionsQuery}>
|
|
@@ -74,19 +73,26 @@
|
|
|
74
73
|
{/if}
|
|
75
74
|
</Query>
|
|
76
75
|
</ApiSection>
|
|
77
|
-
<ApiSection
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
<ApiSection
|
|
77
|
+
title="MoveToJointPositions"
|
|
78
|
+
api="rdk:component:arm"
|
|
79
|
+
>
|
|
80
|
+
<Query query={jointPositionsQuery}>
|
|
81
|
+
{#if jointPositionsQuery.data}
|
|
80
82
|
<MoveToJointPositions
|
|
81
83
|
positions={jointPositionsQuery.data.values}
|
|
82
84
|
{moveToJointPositions}
|
|
83
85
|
lastError={moveToJointPosMutation.error}
|
|
84
|
-
jointLimitsDegrees
|
|
86
|
+
{jointLimitsDegrees}
|
|
87
|
+
isMoving={isMovingQuery.data ?? false}
|
|
85
88
|
/>
|
|
86
89
|
{/if}
|
|
87
|
-
</
|
|
90
|
+
</Query>
|
|
88
91
|
</ApiSection>
|
|
89
|
-
<ApiSection
|
|
92
|
+
<ApiSection
|
|
93
|
+
title="MoveToPosition"
|
|
94
|
+
api="rdk:component:arm"
|
|
95
|
+
>
|
|
90
96
|
<Query query={endPositionQuery}>
|
|
91
97
|
{#if endPositionQuery.data}
|
|
92
98
|
<MoveToPosition
|
|
@@ -97,27 +103,16 @@
|
|
|
97
103
|
{/if}
|
|
98
104
|
</Query>
|
|
99
105
|
</ApiSection>
|
|
100
|
-
<ApiSection
|
|
101
|
-
title="Quick move"
|
|
102
|
-
bottomText="Press a button to execute"
|
|
103
|
-
>
|
|
104
|
-
<Query query={jointPositionsQuery}>
|
|
105
|
-
{#if jointPositionsQuery.data}
|
|
106
|
-
<QuickMove
|
|
107
|
-
positions={jointPositionsQuery.data.values}
|
|
108
|
-
moveToJointPositions={quickMoveToJointPositions}
|
|
109
|
-
lastError={quickMoveToJointPosMutation.error}
|
|
110
|
-
/>
|
|
111
|
-
{/if}
|
|
112
|
-
</Query>
|
|
113
|
-
</ApiSection>
|
|
114
106
|
</div>
|
|
115
107
|
|
|
116
108
|
<!-- Control actions sidebar -->
|
|
117
109
|
<div
|
|
118
110
|
class="flex flex-row gap-4 lg:ml-auto lg:w-full lg:max-w-40 lg:flex-col lg:gap-0 lg:divide-y"
|
|
119
111
|
>
|
|
120
|
-
<ApiSection
|
|
112
|
+
<ApiSection
|
|
113
|
+
title="Stop"
|
|
114
|
+
api="rdk:component:arm"
|
|
115
|
+
>
|
|
121
116
|
<StopButton
|
|
122
117
|
error={stopMutation.error}
|
|
123
118
|
onStop={() => {
|
|
@@ -127,6 +122,7 @@
|
|
|
127
122
|
</ApiSection>
|
|
128
123
|
<IsMoving
|
|
129
124
|
client={ArmClient}
|
|
125
|
+
api="rdk:component:arm"
|
|
130
126
|
{partID}
|
|
131
127
|
{resourceName}
|
|
132
128
|
/>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { ArmClient } from '@viamrobotics/sdk'
|
|
3
|
+
import { createResourceClient, createResourceQuery } from '@viamrobotics/svelte-sdk'
|
|
4
|
+
|
|
5
|
+
import ApiSection from '../../api-section.svelte'
|
|
6
|
+
import Query from '../../query.svelte'
|
|
7
|
+
|
|
8
|
+
import GetJointPositions from './get-joint-positions.svelte'
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
partID: string
|
|
12
|
+
resourceName: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const { partID, resourceName }: Props = $props()
|
|
16
|
+
|
|
17
|
+
const client = createResourceClient(
|
|
18
|
+
ArmClient,
|
|
19
|
+
() => partID,
|
|
20
|
+
() => resourceName
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
const query = createResourceQuery(client, 'getJointPositions', { refetchInterval: 500 })
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<ApiSection
|
|
27
|
+
title="GetJointPositions"
|
|
28
|
+
bottomText="Updates automatically"
|
|
29
|
+
class="grow"
|
|
30
|
+
>
|
|
31
|
+
<Query {query}>
|
|
32
|
+
{#if query.data}
|
|
33
|
+
<GetJointPositions positions={query.data.values} />
|
|
34
|
+
{/if}
|
|
35
|
+
</Query>
|
|
36
|
+
</ApiSection>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { ArmClient } from '@viamrobotics/sdk'
|
|
3
|
+
|
|
4
|
+
import IsMoving from '../../is-moving.svelte'
|
|
5
|
+
import { ResourceTriplets } from '../../../resource-triplet'
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
partID: string
|
|
9
|
+
resourceName: string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const { partID, resourceName }: Props = $props()
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<IsMoving
|
|
16
|
+
client={ArmClient}
|
|
17
|
+
api={ResourceTriplets.Arm}
|
|
18
|
+
{partID}
|
|
19
|
+
{resourceName}
|
|
20
|
+
/>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Button, Icon, Tooltip } from '@viamrobotics/prime-core'
|
|
3
|
+
|
|
4
|
+
import Table from '../../table.svelte'
|
|
5
|
+
|
|
6
|
+
import { type JointLimit } from './joint-position-limits'
|
|
7
|
+
import JointPositionSlider from './joint-position-slider.svelte'
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
desiredPositions: number[]
|
|
11
|
+
positions: number[]
|
|
12
|
+
jointLimitsDegrees: JointLimit[]
|
|
13
|
+
useRadians: boolean
|
|
14
|
+
moveToJointPositions: (jointPositions: number[]) => void
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let {
|
|
18
|
+
desiredPositions = $bindable(),
|
|
19
|
+
positions,
|
|
20
|
+
jointLimitsDegrees,
|
|
21
|
+
useRadians,
|
|
22
|
+
moveToJointPositions,
|
|
23
|
+
}: Props = $props()
|
|
24
|
+
|
|
25
|
+
const getSliderMin = (index: number): number => jointLimitsDegrees[index]?.minDegrees ?? -180
|
|
26
|
+
const getSliderMax = (index: number): number => jointLimitsDegrees[index]?.maxDegrees ?? 180
|
|
27
|
+
|
|
28
|
+
const execute = () => {
|
|
29
|
+
moveToJointPositions([...desiredPositions])
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const resetToZero = () => {
|
|
33
|
+
desiredPositions = positions.map(() => 0)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const resetToCurrent = () => {
|
|
37
|
+
desiredPositions = [...positions]
|
|
38
|
+
}
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<Table>
|
|
42
|
+
<thead>
|
|
43
|
+
<tr>
|
|
44
|
+
<th>Joint</th>
|
|
45
|
+
<th>Position ({useRadians ? 'radians' : 'degrees'})</th>
|
|
46
|
+
</tr>
|
|
47
|
+
</thead>
|
|
48
|
+
<tbody>
|
|
49
|
+
{#each [...desiredPositions.keys()] as index (index)}
|
|
50
|
+
<tr>
|
|
51
|
+
<th scope="row">{index}</th>
|
|
52
|
+
<th>
|
|
53
|
+
<JointPositionSlider
|
|
54
|
+
bind:value={desiredPositions[index]}
|
|
55
|
+
minDegrees={getSliderMin(index)}
|
|
56
|
+
maxDegrees={getSliderMax(index)}
|
|
57
|
+
{useRadians}
|
|
58
|
+
/>
|
|
59
|
+
</th>
|
|
60
|
+
</tr>
|
|
61
|
+
{/each}
|
|
62
|
+
</tbody>
|
|
63
|
+
</Table>
|
|
64
|
+
|
|
65
|
+
<div class="mb-2 flex flex-col gap-2">
|
|
66
|
+
<span class="flex flex-row gap-2">
|
|
67
|
+
<h4 class="text-xs font-semibold">Quick set</h4>
|
|
68
|
+
<Tooltip>
|
|
69
|
+
<Icon
|
|
70
|
+
name="information-outline"
|
|
71
|
+
cx="text-gray-6"
|
|
72
|
+
/>
|
|
73
|
+
<span slot="description">Will update the slider values but will not execute</span>
|
|
74
|
+
</Tooltip>
|
|
75
|
+
</span>
|
|
76
|
+
<div class="flex flex-col gap-2 sm:flex-row">
|
|
77
|
+
<Button onclick={resetToZero}>Zero</Button>
|
|
78
|
+
<Button onclick={resetToCurrent}>Current position</Button>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<Button
|
|
83
|
+
class="mt-auto w-fit"
|
|
84
|
+
icon="play-circle-outline"
|
|
85
|
+
variant="dark"
|
|
86
|
+
onclick={execute}
|
|
87
|
+
>
|
|
88
|
+
Execute
|
|
89
|
+
</Button>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type JointLimit } from './joint-position-limits';
|
|
2
|
+
interface Props {
|
|
3
|
+
desiredPositions: number[];
|
|
4
|
+
positions: number[];
|
|
5
|
+
jointLimitsDegrees: JointLimit[];
|
|
6
|
+
useRadians: boolean;
|
|
7
|
+
moveToJointPositions: (jointPositions: number[]) => void;
|
|
8
|
+
}
|
|
9
|
+
declare const JointPositionEditor: import("svelte").Component<Props, {}, "desiredPositions">;
|
|
10
|
+
type JointPositionEditor = ReturnType<typeof JointPositionEditor>;
|
|
11
|
+
export default JointPositionEditor;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Button, Icon, Tooltip } from '@viamrobotics/prime-core'
|
|
3
|
+
|
|
4
|
+
import Table from '../../table.svelte'
|
|
5
|
+
import { degreesToRadians, formatNumeric } from '../../../format'
|
|
6
|
+
|
|
7
|
+
const INCREMENT_DEGREES = 5
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
positions: number[]
|
|
11
|
+
moveToJointPositions: (jointPositions: number[]) => void
|
|
12
|
+
useRadians: boolean
|
|
13
|
+
isMoving: boolean
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const { positions, moveToJointPositions, useRadians, isMoving }: Props = $props()
|
|
17
|
+
|
|
18
|
+
const toDisplayAngle = (degrees: number) => (useRadians ? degreesToRadians(degrees) : degrees)
|
|
19
|
+
|
|
20
|
+
const currentDisplayPositions = $derived(positions.map((degrees) => toDisplayAngle(degrees)))
|
|
21
|
+
|
|
22
|
+
const quickMove = (index: number, increment: number) => {
|
|
23
|
+
if (isMoving) {
|
|
24
|
+
return
|
|
25
|
+
}
|
|
26
|
+
const clonedPositions = positions.map((position, positionIndex) =>
|
|
27
|
+
positionIndex === index ? position + increment : position
|
|
28
|
+
)
|
|
29
|
+
moveToJointPositions(clonedPositions)
|
|
30
|
+
}
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<Tooltip>
|
|
34
|
+
<span class="flex items-center gap-1 text-xs text-amber-600">
|
|
35
|
+
<Icon
|
|
36
|
+
name="alert"
|
|
37
|
+
size="sm"
|
|
38
|
+
cx="text-amber-600"
|
|
39
|
+
/>
|
|
40
|
+
Quick move executes immediately
|
|
41
|
+
</span>
|
|
42
|
+
<span slot="description">
|
|
43
|
+
Each ±5° button sends a move command as soon as it is pressed. Buttons are disabled while the
|
|
44
|
+
arm is moving.
|
|
45
|
+
</span>
|
|
46
|
+
</Tooltip>
|
|
47
|
+
|
|
48
|
+
<Table>
|
|
49
|
+
<thead>
|
|
50
|
+
<tr>
|
|
51
|
+
<th>Joint</th>
|
|
52
|
+
<th>Move (degrees)</th>
|
|
53
|
+
</tr>
|
|
54
|
+
</thead>
|
|
55
|
+
<tbody>
|
|
56
|
+
{#each positions as position, index (index)}
|
|
57
|
+
{@const currentValue = currentDisplayPositions[index] ?? position}
|
|
58
|
+
{@const unit = useRadians ? ' rad' : '°'}
|
|
59
|
+
<tr>
|
|
60
|
+
<th scope="row">{index}</th>
|
|
61
|
+
<th>
|
|
62
|
+
<div class="flex h-full max-h-6.5 w-full items-center justify-center gap-1.5">
|
|
63
|
+
<Button
|
|
64
|
+
aria-label="Decrease joint {index} by 5 degrees"
|
|
65
|
+
disabled={isMoving}
|
|
66
|
+
onclick={() => quickMove(index, -INCREMENT_DEGREES)}
|
|
67
|
+
>
|
|
68
|
+
−5°
|
|
69
|
+
</Button>
|
|
70
|
+
<span class="min-w-16 grow text-center text-xs text-gray-700 tabular-nums">
|
|
71
|
+
{formatNumeric(currentValue)}{unit}
|
|
72
|
+
</span>
|
|
73
|
+
<Button
|
|
74
|
+
aria-label="Increase joint {index} by 5 degrees"
|
|
75
|
+
disabled={isMoving}
|
|
76
|
+
onclick={() => quickMove(index, INCREMENT_DEGREES)}
|
|
77
|
+
>
|
|
78
|
+
+5°
|
|
79
|
+
</Button>
|
|
80
|
+
</div>
|
|
81
|
+
</th>
|
|
82
|
+
</tr>
|
|
83
|
+
{/each}
|
|
84
|
+
</tbody>
|
|
85
|
+
</Table>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
positions: number[];
|
|
3
|
+
moveToJointPositions: (jointPositions: number[]) => void;
|
|
4
|
+
useRadians: boolean;
|
|
5
|
+
isMoving: boolean;
|
|
6
|
+
}
|
|
7
|
+
declare const JointPositionQuickMove: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type JointPositionQuickMove = ReturnType<typeof JointPositionQuickMove>;
|
|
9
|
+
export default JointPositionQuickMove;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Slider, ThemeUtils } from 'svelte-tweakpane-ui'
|
|
3
|
+
|
|
4
|
+
import { degreesToRadians, formatNumeric, radiansToDegrees } from '../../../format'
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
value: number
|
|
8
|
+
minDegrees: number
|
|
9
|
+
maxDegrees: number
|
|
10
|
+
useRadians: boolean
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let { value = $bindable(), minDegrees, maxDegrees, useRadians }: Props = $props()
|
|
14
|
+
|
|
15
|
+
const min = $derived(useRadians ? degreesToRadians(minDegrees) : minDegrees)
|
|
16
|
+
const max = $derived(useRadians ? degreesToRadians(maxDegrees) : maxDegrees)
|
|
17
|
+
const step = $derived(useRadians ? 0.01 : 0.1)
|
|
18
|
+
|
|
19
|
+
const sliderFormat = (v: number) => formatNumeric(v, useRadians ? 3 : 1)
|
|
20
|
+
const toDisplay = (degrees: number) => (useRadians ? degreesToRadians(degrees) : degrees)
|
|
21
|
+
const toDegrees = (display: number) => (useRadians ? radiansToDegrees(display) : display)
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<div class="joint-slider min-w-0">
|
|
25
|
+
<Slider
|
|
26
|
+
value={toDisplay(value)}
|
|
27
|
+
on:change={(event) => {
|
|
28
|
+
value = toDegrees(event.detail.value)
|
|
29
|
+
}}
|
|
30
|
+
{min}
|
|
31
|
+
{max}
|
|
32
|
+
{step}
|
|
33
|
+
format={sliderFormat}
|
|
34
|
+
theme={ThemeUtils.presets.light}
|
|
35
|
+
/>
|
|
36
|
+
</div>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
value: number;
|
|
3
|
+
minDegrees: number;
|
|
4
|
+
maxDegrees: number;
|
|
5
|
+
useRadians: boolean;
|
|
6
|
+
}
|
|
7
|
+
declare const JointPositionSlider: import("svelte").Component<Props, {}, "value">;
|
|
8
|
+
type JointPositionSlider = ReturnType<typeof JointPositionSlider>;
|
|
9
|
+
export default JointPositionSlider;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
createResourceQuery,
|
|
7
7
|
} from '@viamrobotics/svelte-sdk'
|
|
8
8
|
|
|
9
|
-
import
|
|
9
|
+
import Query from '../../query.svelte'
|
|
10
10
|
|
|
11
11
|
import { getJointPositionLimits, type KinematicsJSON } from './joint-position-limits'
|
|
12
12
|
import MoveToJointPositions from './move-to-joint-positions.svelte'
|
|
@@ -36,15 +36,19 @@
|
|
|
36
36
|
const moveToJointPositions = (jointPositionsList: number[]) => {
|
|
37
37
|
moveToJointPosMutation.mutate([jointPositionsList], {})
|
|
38
38
|
}
|
|
39
|
+
|
|
40
|
+
const jointLimitsDegrees = $derived(
|
|
41
|
+
kinematicsQuery.data ? getJointPositionLimits(kinematicsQuery.data as KinematicsJSON) : []
|
|
42
|
+
)
|
|
39
43
|
</script>
|
|
40
44
|
|
|
41
|
-
<
|
|
42
|
-
{#if jointPositionsQuery.data
|
|
45
|
+
<Query query={jointPositionsQuery}>
|
|
46
|
+
{#if jointPositionsQuery.data}
|
|
43
47
|
<MoveToJointPositions
|
|
44
48
|
positions={jointPositionsQuery.data.values}
|
|
45
49
|
{moveToJointPositions}
|
|
46
50
|
lastError={moveToJointPosMutation.error}
|
|
47
|
-
jointLimitsDegrees
|
|
51
|
+
{jointLimitsDegrees}
|
|
48
52
|
/>
|
|
49
53
|
{/if}
|
|
50
|
-
</
|
|
54
|
+
</Query>
|