mirror of
https://github.com/PhotonVision/photonvision
synced 2026-06-23 01:21:40 +00:00
[PhotonClient] Vite and Typescript complete refactor (#884)
This commit is contained in:
29
photon-client/src/types/PhotonTrackingTypes.ts
Normal file
29
photon-client/src/types/PhotonTrackingTypes.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
export interface Pose {
|
||||
x: number,
|
||||
y: number,
|
||||
z: number,
|
||||
angle_z: number,
|
||||
qw: number,
|
||||
qx: number,
|
||||
qy: number,
|
||||
qz: number
|
||||
}
|
||||
|
||||
export interface PhotonTarget {
|
||||
yaw: number,
|
||||
pitch: number,
|
||||
skew: number,
|
||||
area: number,
|
||||
// -1 if not set
|
||||
ambiguity: number,
|
||||
// -1 if not set
|
||||
fiducialId: number,
|
||||
// undefined if 3d isn't enabled
|
||||
pose?: Pose
|
||||
}
|
||||
|
||||
export interface PipelineResult {
|
||||
fps: number,
|
||||
latency: number,
|
||||
targets: PhotonTarget[]
|
||||
}
|
||||
244
photon-client/src/types/PipelineTypes.ts
Normal file
244
photon-client/src/types/PipelineTypes.ts
Normal file
@@ -0,0 +1,244 @@
|
||||
import type { WebsocketNumberPair } from "@/types/WebsocketDataTypes";
|
||||
|
||||
export enum PipelineType {
|
||||
DriverMode=1,
|
||||
Reflective=2,
|
||||
ColoredShape=3,
|
||||
AprilTag=4,
|
||||
Aruco=5
|
||||
}
|
||||
|
||||
export enum AprilTagFamily {
|
||||
Family36h11=0,
|
||||
Family25h9=1,
|
||||
Family16h5=2
|
||||
}
|
||||
|
||||
export enum RobotOffsetPointMode {
|
||||
None=0,
|
||||
Single=1,
|
||||
Dual=2
|
||||
}
|
||||
|
||||
export enum TargetModel {
|
||||
InfiniteRechargeHighGoalOuter=0,
|
||||
InfiniteRechargeHighGoalInner=1,
|
||||
DeepSpaceDualTarget=2,
|
||||
CircularPowerCell7in=3,
|
||||
RapidReactCircularCargoBall=4,
|
||||
StrongholdHighGoal=5,
|
||||
Apriltag_200mm=6,
|
||||
Aruco6in_16h5=7,
|
||||
Apriltag6in_16h5=8
|
||||
}
|
||||
|
||||
export interface PipelineSettings {
|
||||
offsetRobotOffsetMode: RobotOffsetPointMode
|
||||
streamingFrameDivisor: number
|
||||
offsetDualPointBArea: number
|
||||
contourGroupingMode: number
|
||||
hsvValue: WebsocketNumberPair | [number, number]
|
||||
cameraGain: number
|
||||
cameraBlueGain: number
|
||||
cameraRedGain: number
|
||||
cornerDetectionSideCount: number
|
||||
contourRatio: WebsocketNumberPair | [number, number]
|
||||
contourTargetOffsetPointEdge: number
|
||||
pipelineNickname: string
|
||||
inputImageRotationMode: number
|
||||
contourArea: WebsocketNumberPair | [number, number]
|
||||
solvePNPEnabled: boolean
|
||||
contourFullness: WebsocketNumberPair | [number, number]
|
||||
pipelineIndex: number
|
||||
inputShouldShow: boolean
|
||||
cameraAutoExposure: boolean
|
||||
contourSpecklePercentage: number
|
||||
contourTargetOrientation: number
|
||||
targetModel: TargetModel
|
||||
cornerDetectionUseConvexHulls: boolean
|
||||
outputShouldShow: boolean
|
||||
outputShouldDraw: boolean
|
||||
offsetDualPointA: {x: number, y: number}
|
||||
offsetDualPointB: {x: number, y: number}
|
||||
hsvHue: WebsocketNumberPair | [number, number]
|
||||
ledMode: boolean
|
||||
hueInverted: boolean
|
||||
outputShowMultipleTargets: boolean
|
||||
contourSortMode: number
|
||||
cameraExposure: number
|
||||
offsetSinglePoint: {x: number, y: number}
|
||||
cameraBrightness: number
|
||||
offsetDualPointAArea: number
|
||||
cornerDetectionExactSideCount: boolean
|
||||
cameraVideoModeIndex: number
|
||||
cornerDetectionStrategy: number
|
||||
cornerDetectionAccuracyPercentage: number
|
||||
hsvSaturation: WebsocketNumberPair | [number, number]
|
||||
pipelineType: PipelineType
|
||||
contourIntersection: number
|
||||
}
|
||||
export type ConfigurablePipelineSettings = Partial<Omit<PipelineSettings, "offsetDualPointAArea" | "cornerDetectionSideCount" | "pipelineNickname" | "pipelineIndex" | "pipelineType" | "cornerDetectionUseConvexHulls" | "offsetDualPointA" | "offsetDualPointB" | "ledMode" | "offsetSinglePoint" | "offsetDualPointBArea" | "cornerDetectionExactSideCount" | "cornerDetectionStrategy">>
|
||||
export const DefaultPipelineSettings: PipelineSettings = {
|
||||
offsetRobotOffsetMode: RobotOffsetPointMode.None,
|
||||
streamingFrameDivisor: 0,
|
||||
offsetDualPointBArea: 0,
|
||||
contourGroupingMode: 0,
|
||||
hsvValue: { first: 50, second: 255 },
|
||||
cameraBlueGain: 20,
|
||||
cameraRedGain: 11,
|
||||
cornerDetectionSideCount: 4,
|
||||
contourRatio: { first: 0, second: 20 },
|
||||
contourTargetOffsetPointEdge: 0,
|
||||
pipelineNickname: "Placeholder Pipeline",
|
||||
inputImageRotationMode: 0,
|
||||
contourArea: { first: 0, second: 100 },
|
||||
solvePNPEnabled: false,
|
||||
contourFullness: { first: 0, second: 100 },
|
||||
pipelineIndex: 0,
|
||||
inputShouldShow: false,
|
||||
cameraAutoExposure: false,
|
||||
contourSpecklePercentage: 5,
|
||||
contourTargetOrientation: 1,
|
||||
cornerDetectionUseConvexHulls: true,
|
||||
outputShouldShow: true,
|
||||
outputShouldDraw: true,
|
||||
offsetDualPointA: { x: 0, y: 0 },
|
||||
offsetDualPointB: { x: 0, y: 0 },
|
||||
hsvHue: { first: 50, second: 180 },
|
||||
hueInverted: false,
|
||||
contourSortMode: 0,
|
||||
offsetSinglePoint: { x: 0, y: 0 },
|
||||
cameraBrightness: 50,
|
||||
offsetDualPointAArea: 0,
|
||||
cornerDetectionExactSideCount: false,
|
||||
cameraVideoModeIndex: 0,
|
||||
cornerDetectionStrategy: 0,
|
||||
cornerDetectionAccuracyPercentage: 10,
|
||||
hsvSaturation: { first: 50, second: 255 },
|
||||
contourIntersection: 1,
|
||||
|
||||
// These settings will be overridden by different pipeline types
|
||||
cameraGain: -1,
|
||||
targetModel: -1,
|
||||
ledMode: false,
|
||||
outputShowMultipleTargets: false,
|
||||
cameraExposure: -1,
|
||||
pipelineType: -1
|
||||
};
|
||||
|
||||
export interface ReflectivePipelineSettings extends PipelineSettings {
|
||||
pipelineType: PipelineType.Reflective
|
||||
contourFilterRangeY: number
|
||||
contourFilterRangeX: number
|
||||
}
|
||||
export type ConfigurableReflectivePipelineSettings = Partial<Omit<ReflectivePipelineSettings, "pipelineType">> & ConfigurablePipelineSettings
|
||||
export const DefaultReflectivePipelineSettings: ReflectivePipelineSettings = {
|
||||
...DefaultPipelineSettings,
|
||||
cameraGain: 20,
|
||||
targetModel: TargetModel.InfiniteRechargeHighGoalOuter,
|
||||
ledMode: true,
|
||||
outputShowMultipleTargets: false,
|
||||
cameraExposure: 6,
|
||||
pipelineType: PipelineType.Reflective,
|
||||
|
||||
contourFilterRangeY: 2,
|
||||
contourFilterRangeX: 2
|
||||
};
|
||||
|
||||
export interface ColoredShapePipelineSettings extends PipelineSettings {
|
||||
pipelineType: PipelineType.ColoredShape
|
||||
erode: boolean
|
||||
cameraCalibration: null
|
||||
dilate: boolean
|
||||
circleAccuracy: number
|
||||
contourRadius: WebsocketNumberPair | [number, number]
|
||||
circleDetectThreshold: number
|
||||
accuracyPercentage: number
|
||||
contourShape: number
|
||||
contourPerimeter: WebsocketNumberPair | [number, number]
|
||||
minDist: number
|
||||
maxCannyThresh: number
|
||||
}
|
||||
export type ConfigurableColoredShapePipelineSettings = Partial<Omit<ColoredShapePipelineSettings, "pipelineType" | "erode" | "cameraCalibration" | "dilate" | "minDist" >> & ConfigurablePipelineSettings
|
||||
export const DefaultColoredShapePipelineSettings: ColoredShapePipelineSettings = {
|
||||
...DefaultPipelineSettings,
|
||||
cameraGain: 75,
|
||||
targetModel: TargetModel.InfiniteRechargeHighGoalOuter,
|
||||
ledMode: true,
|
||||
outputShowMultipleTargets: false,
|
||||
cameraExposure: 20,
|
||||
pipelineType: PipelineType.ColoredShape,
|
||||
|
||||
erode: false,
|
||||
cameraCalibration: null,
|
||||
dilate: false,
|
||||
circleAccuracy: 20,
|
||||
contourRadius: { first: 0, second: 100 },
|
||||
circleDetectThreshold: 5,
|
||||
accuracyPercentage: 10,
|
||||
contourShape: 2,
|
||||
contourPerimeter: { first: 0, second: 1.7976931348623157e+308 },
|
||||
minDist: 20,
|
||||
maxCannyThresh: 90
|
||||
};
|
||||
|
||||
export interface AprilTagPipelineSettings extends PipelineSettings {
|
||||
pipelineType: PipelineType.AprilTag
|
||||
hammingDist: number
|
||||
numIterations: number
|
||||
decimate: number
|
||||
blur: number
|
||||
decisionMargin: number
|
||||
refineEdges: boolean
|
||||
debug: boolean
|
||||
threads: number
|
||||
tagFamily: AprilTagFamily
|
||||
}
|
||||
export type ConfigurableAprilTagPipelineSettings = Partial<Omit<AprilTagPipelineSettings, "pipelineType" | "hammingDist" | "debug">> & ConfigurablePipelineSettings
|
||||
export const DefaultAprilTagPipelineSettings: AprilTagPipelineSettings = {
|
||||
...DefaultPipelineSettings,
|
||||
cameraGain: 75,
|
||||
targetModel: TargetModel.Apriltag6in_16h5,
|
||||
ledMode: false,
|
||||
outputShowMultipleTargets: true,
|
||||
cameraExposure: 20,
|
||||
pipelineType: PipelineType.AprilTag,
|
||||
|
||||
hammingDist: 0,
|
||||
numIterations: 40,
|
||||
decimate: 1,
|
||||
blur: 0,
|
||||
decisionMargin: 35,
|
||||
refineEdges: true,
|
||||
debug: false,
|
||||
threads: 4,
|
||||
tagFamily: AprilTagFamily.Family16h5
|
||||
};
|
||||
|
||||
export interface ArucoPipelineSettings extends PipelineSettings {
|
||||
pipelineType: PipelineType.Aruco
|
||||
decimate: number
|
||||
threads: number
|
||||
numIterations: number
|
||||
cornerAccuracy: number
|
||||
useAruco3: boolean
|
||||
}
|
||||
export type ConfigurableArucoPipelineSettings = Partial<Omit<ArucoPipelineSettings, "pipelineType">> & ConfigurablePipelineSettings
|
||||
export const DefaultArucoPipelineSettings: ArucoPipelineSettings = {
|
||||
...DefaultPipelineSettings,
|
||||
outputShowMultipleTargets: true,
|
||||
targetModel: TargetModel.Aruco6in_16h5,
|
||||
cameraExposure: -1,
|
||||
cameraAutoExposure: true,
|
||||
ledMode: false,
|
||||
pipelineType: PipelineType.Aruco,
|
||||
|
||||
decimate: 1,
|
||||
threads: 2,
|
||||
numIterations: 100,
|
||||
cornerAccuracy: 25,
|
||||
useAruco3: true
|
||||
};
|
||||
|
||||
export type ActivePipelineSettings = ReflectivePipelineSettings | ColoredShapePipelineSettings | AprilTagPipelineSettings | ArucoPipelineSettings
|
||||
export type ActiveConfigurablePipelineSettings = ConfigurableReflectivePipelineSettings | ConfigurableColoredShapePipelineSettings | ConfigurableAprilTagPipelineSettings | ConfigurableArucoPipelineSettings
|
||||
152
photon-client/src/types/SettingTypes.ts
Normal file
152
photon-client/src/types/SettingTypes.ts
Normal file
@@ -0,0 +1,152 @@
|
||||
import { type ActivePipelineSettings, DefaultAprilTagPipelineSettings } from "@/types/PipelineTypes";
|
||||
|
||||
export interface GeneralSettings {
|
||||
version?: string
|
||||
gpuAcceleration?: string
|
||||
hardwareModel?: string
|
||||
hardwarePlatform?: string
|
||||
}
|
||||
|
||||
export interface MetricData {
|
||||
cpuTemp?: string,
|
||||
cpuUtil?: string,
|
||||
cpuMem?: string,
|
||||
gpuMem?: string,
|
||||
ramUtil?: string
|
||||
gpuMemUtil?: string,
|
||||
cpuThr?: string,
|
||||
cpuUptime?: string,
|
||||
diskUtilPct?: string,
|
||||
}
|
||||
|
||||
export enum NetworkConnectionType {
|
||||
DHCP = 0,
|
||||
Static = 1
|
||||
}
|
||||
|
||||
export interface NetworkSettings {
|
||||
ntServerAddress: string
|
||||
connectionType: NetworkConnectionType,
|
||||
staticIp: string,
|
||||
hostname: string,
|
||||
runNTServer: boolean
|
||||
shouldMange: boolean,
|
||||
networkManagerIface?: string,
|
||||
physicalInterface?: string,
|
||||
setStaticCommand?: string,
|
||||
setDHCPcommand?: string
|
||||
}
|
||||
|
||||
export interface LightingSettings {
|
||||
supported: boolean,
|
||||
brightness: number
|
||||
}
|
||||
|
||||
export enum LogLevel {
|
||||
ERROR=0,
|
||||
WARN=1,
|
||||
INFO=2,
|
||||
DEBUG=3,
|
||||
TRACE=4
|
||||
}
|
||||
|
||||
export interface LogMessage {
|
||||
level: LogLevel,
|
||||
message: string
|
||||
}
|
||||
|
||||
export interface Resolution {
|
||||
width: number,
|
||||
height: number
|
||||
}
|
||||
|
||||
export interface VideoFormat {
|
||||
resolution: Resolution
|
||||
fps: number,
|
||||
pixelFormat: string,
|
||||
index?: number,
|
||||
diagonalFOV?: number,
|
||||
horizontalFOV?: number,
|
||||
verticalFOV?: number,
|
||||
standardDeviation?: number,
|
||||
mean?: number
|
||||
}
|
||||
|
||||
export interface CameraCalibrationResult {
|
||||
resolution: Resolution
|
||||
distCoeffs: number[],
|
||||
standardDeviation: number,
|
||||
perViewErrors: number[],
|
||||
intrinsics: number[],
|
||||
}
|
||||
|
||||
export interface ConfigurableCameraSettings {
|
||||
fov: number
|
||||
}
|
||||
|
||||
export interface CameraSettings {
|
||||
nickname: string
|
||||
|
||||
fov: {
|
||||
value: number,
|
||||
managedByVendor: boolean
|
||||
}
|
||||
stream: {
|
||||
inputPort: number,
|
||||
outputPort: number
|
||||
}
|
||||
|
||||
validVideoFormats: VideoFormat[]
|
||||
completeCalibrations: CameraCalibrationResult[]
|
||||
|
||||
lastPipelineIndex?: number,
|
||||
currentPipelineIndex: number,
|
||||
pipelineNicknames: string[],
|
||||
pipelineSettings: ActivePipelineSettings
|
||||
}
|
||||
|
||||
export const PlaceholderCameraSettings: CameraSettings = {
|
||||
nickname: "Placeholder Camera",
|
||||
fov: {
|
||||
value: 70,
|
||||
managedByVendor: true
|
||||
},
|
||||
stream: {
|
||||
inputPort: 0,
|
||||
outputPort: 0
|
||||
},
|
||||
validVideoFormats: [
|
||||
{
|
||||
resolution: { width: 1920, height: 1080 },
|
||||
fps: 60,
|
||||
pixelFormat: "RGB"
|
||||
},
|
||||
{
|
||||
resolution: { width: 1280, height: 720 },
|
||||
fps: 60,
|
||||
pixelFormat: "RGB"
|
||||
},
|
||||
{
|
||||
resolution: { width: 640, height: 480 },
|
||||
fps: 30,
|
||||
pixelFormat: "RGB"
|
||||
}
|
||||
],
|
||||
completeCalibrations: [],
|
||||
pipelineNicknames: ["Placeholder Pipeline"],
|
||||
lastPipelineIndex: 0,
|
||||
currentPipelineIndex: 0,
|
||||
pipelineSettings: DefaultAprilTagPipelineSettings
|
||||
};
|
||||
|
||||
export enum CalibrationBoardTypes {
|
||||
Chessboard=0,
|
||||
DotBoard=1
|
||||
}
|
||||
|
||||
export enum RobotOffsetType {
|
||||
Clear=0,
|
||||
Single=1,
|
||||
DualFirst=2,
|
||||
DualSecond=3
|
||||
}
|
||||
118
photon-client/src/types/WebsocketDataTypes.ts
Normal file
118
photon-client/src/types/WebsocketDataTypes.ts
Normal file
@@ -0,0 +1,118 @@
|
||||
import type { GeneralSettings, LightingSettings, MetricData, NetworkSettings } from "@/types/SettingTypes";
|
||||
import type { ActivePipelineSettings } from "@/types/PipelineTypes";
|
||||
import type { LogLevel } from "@/types/SettingTypes";
|
||||
|
||||
export interface WebsocketLogMessage {
|
||||
logMessage: {
|
||||
logLevel: LogLevel,
|
||||
logMessage: string
|
||||
}
|
||||
}
|
||||
export interface WebsocketSettingsUpdate {
|
||||
general: Required<GeneralSettings>,
|
||||
lighting: Required<LightingSettings>,
|
||||
networkSettings: NetworkSettings
|
||||
}
|
||||
|
||||
export interface WebsocketNumberPair {
|
||||
first: number,
|
||||
second: number
|
||||
}
|
||||
|
||||
export interface WebsocketCompleteCalib {
|
||||
distCoeffs: number[],
|
||||
height: number,
|
||||
width: number,
|
||||
standardDeviation: number,
|
||||
perViewErrors: number[],
|
||||
intrinsics: number[]
|
||||
}
|
||||
|
||||
export type WebsocketVideoFormat = Record<number, {
|
||||
fps: number,
|
||||
height: number,
|
||||
width: number,
|
||||
pixelFormat: string,
|
||||
index?: number,
|
||||
diagonalFOV?: number,
|
||||
horizontalFOV?: number,
|
||||
verticalFOV?: number,
|
||||
standardDeviation?: number,
|
||||
mean?: number
|
||||
}>
|
||||
|
||||
export interface WebsocketCameraSettingsUpdate {
|
||||
calibrations: WebsocketCompleteCalib[],
|
||||
currentPipelineIndex: number,
|
||||
currentPipelineSettings: ActivePipelineSettings,
|
||||
fov: number,
|
||||
inputStreamPort: number,
|
||||
isFovConfigurable: boolean,
|
||||
nickname: string,
|
||||
outputStreamPort: number,
|
||||
pipelineNicknames: string[],
|
||||
videoFormatList: WebsocketVideoFormat
|
||||
}
|
||||
export interface WebsocketNTUpdate {
|
||||
connected: boolean,
|
||||
address?: string,
|
||||
clients?: number
|
||||
}
|
||||
export type WebsocketPipelineResultUpdate = Record<number, {
|
||||
fps: number,
|
||||
latency: number,
|
||||
targets: {
|
||||
yaw: number,
|
||||
pitch: number,
|
||||
skew: number,
|
||||
area: number,
|
||||
ambiguity: number,
|
||||
fiducialId: number,
|
||||
pose: {
|
||||
"angle_z": number,
|
||||
"qw": number,
|
||||
"qx": number,
|
||||
"x": number,
|
||||
"qy": number,
|
||||
"y": number,
|
||||
"qz": number,
|
||||
"z": number
|
||||
},
|
||||
}[]
|
||||
}>
|
||||
|
||||
export interface WebsocketCalibrationData {
|
||||
"patternWidth": number,
|
||||
"boardType": number,
|
||||
"hasEnough": boolean,
|
||||
"count": number,
|
||||
"minCount": number,
|
||||
"videoModeIndex": number,
|
||||
"patternHeight": number,
|
||||
"squareSizeIn": number
|
||||
}
|
||||
|
||||
export interface IncomingWebsocketData {
|
||||
log?: WebsocketLogMessage,
|
||||
settings?: WebsocketSettingsUpdate,
|
||||
cameraSettings?: WebsocketCameraSettingsUpdate[],
|
||||
ntConnectionInfo?: WebsocketNTUpdate,
|
||||
metrics?: Required<MetricData>,
|
||||
updatePipelineResult?: WebsocketPipelineResultUpdate,
|
||||
networkInfo?: {
|
||||
possibleRios: string[],
|
||||
deviceips: string[]
|
||||
}
|
||||
mutatePipelineSettings?: Partial<ActivePipelineSettings>,
|
||||
cameraIndex?: number // Sent when mutating pipeline settings to check against currently active
|
||||
calibrationData?: WebsocketCalibrationData,
|
||||
}
|
||||
|
||||
export enum WebsocketPipelineType {
|
||||
Calib3d=-2,
|
||||
DriverMode=-1,
|
||||
Reflective=0,
|
||||
ColoredShape=1,
|
||||
AprilTag=2,
|
||||
Aruco=3
|
||||
}
|
||||
Reference in New Issue
Block a user