lookout-config 1.18.5__py3-none-any.whl → 1.20.0__py3-none-any.whl

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.
@@ -7,6 +7,377 @@ from typing import List, Optional
7
7
  from pydantic import BaseModel, Field
8
8
 
9
9
 
10
+ class BowStbd(BaseModel):
11
+ contains: Optional[List[str]] = Field(None, description="")
12
+ path: Optional[str] = Field(None, description="")
13
+ type: Optional[str] = Field(None, description="")
14
+
15
+
16
+ class Analyzers(BaseModel):
17
+ bow_stbd: Optional[BowStbd] = None
18
+
19
+
20
+ class Cameras(BaseModel):
21
+ analyzers: Optional[Analyzers] = None
22
+ path: Optional[str] = Field(None, description="")
23
+ type: Optional[str] = Field(None, description="")
24
+
25
+
26
+ class ObjectAlerts(BaseModel):
27
+ find_and_remove_prefix: Optional[List[str]] = Field(None, description="")
28
+ path: Optional[str] = Field(None, description="")
29
+ type: Optional[str] = Field(None, description="")
30
+
31
+
32
+ class ObjectTracker(BaseModel):
33
+ find_and_remove_prefix: Optional[List[str]] = Field(None, description="")
34
+ path: Optional[str] = Field(None, description="")
35
+ type: Optional[str] = Field(None, description="")
36
+
37
+
38
+ class RoiDetector(BaseModel):
39
+ find_and_remove_prefix: Optional[List[str]] = Field(None, description="")
40
+ path: Optional[str] = Field(None, description="")
41
+ type: Optional[str] = Field(None, description="")
42
+
43
+
44
+ class RoiTracker(BaseModel):
45
+ find_and_remove_prefix: Optional[List[str]] = Field(None, description="")
46
+ path: Optional[str] = Field(None, description="")
47
+ type: Optional[str] = Field(None, description="")
48
+
49
+
50
+ class VesselComputer1(BaseModel):
51
+ path: Optional[str] = Field(None, description="")
52
+ startswith: Optional[List[str]] = Field(None, description="")
53
+ timeout: Optional[float] = Field(None, description="")
54
+ type: Optional[str] = Field(None, description="")
55
+
56
+
57
+ class Analyzers1(BaseModel):
58
+ vessel_computer: Optional[VesselComputer1] = None
59
+
60
+
61
+ class VesselComputer(BaseModel):
62
+ analyzers: Optional[Analyzers1] = None
63
+ path: Optional[str] = Field(None, description="")
64
+ type: Optional[str] = Field(None, description="")
65
+
66
+
67
+ class DiagnosticAggregatorParameters(BaseModel):
68
+ cameras: Optional[Cameras] = None
69
+ object_alerts: Optional[ObjectAlerts] = None
70
+ object_tracker: Optional[ObjectTracker] = None
71
+ path: Optional[str] = Field(None, description="")
72
+ publish_values: Optional[bool] = Field(None, description="")
73
+ roi_detector: Optional[RoiDetector] = None
74
+ roi_tracker: Optional[RoiTracker] = None
75
+ vessel_computer: Optional[VesselComputer] = None
76
+
77
+
78
+ class DiagnosticUpdater(BaseModel):
79
+ period: Optional[float] = Field(None, description="")
80
+ use_fqn: Optional[bool] = Field(None, description="")
81
+
82
+
83
+ class RoiTrackerParameters(BaseModel):
84
+ detection_threshold: Optional[float] = Field(
85
+ None, description="Detections above this threshold will be tracked"
86
+ )
87
+ iou_threshold: Optional[float] = Field(
88
+ None,
89
+ description="IoU threshold for association of dets with propagated track boxes",
90
+ )
91
+ max_age: Optional[int] = Field(
92
+ None,
93
+ description="The maximum number of consecutive misses before the track state is deleted",
94
+ )
95
+ min_hits: Optional[int] = Field(None, description="Min number of detections to create track")
96
+ classification_history_window: Optional[int] = Field(
97
+ None,
98
+ description="Numbers of frames to keep classification history (used for class/probability temporal smoothing)",
99
+ )
100
+ reset_on_old_time: Optional[bool] = Field(
101
+ None, description="Reset the tracker if an old timestamp is received"
102
+ )
103
+ roi_topics: Optional[List[str]] = Field(
104
+ None, description="List of topics to subscribe to for ROIs"
105
+ )
106
+ roi_track_topics: Optional[List[str]] = Field(
107
+ None, description="List of topics to publish tracked ROIs"
108
+ )
109
+ diagnostic_updater: Optional[DiagnosticUpdater] = None
110
+
111
+
112
+ class DataRecorderParameters(BaseModel):
113
+ bag_directory: Optional[str] = Field(None, description="")
114
+ diagnostic_updater: Optional[DiagnosticUpdater] = None
115
+ storage_id: Optional[str] = Field(None, description="")
116
+ storage_preset_profile: Optional[str] = Field(None, description="")
117
+ topic_exclude_regexs: Optional[List[str]] = Field(None, description="")
118
+ topic_include_regexs: Optional[List[str]] = Field(None, description="")
119
+ trigger_topic_active: Optional[bool] = Field(None, description="")
120
+
121
+
122
+ class CoreUsageAverageERROR(BaseModel):
123
+ max: Optional[float] = Field(None, description="")
124
+ min: Optional[float] = Field(None, description="")
125
+
126
+
127
+ class CoreUsageAverageWARN(BaseModel):
128
+ max: Optional[float] = Field(None, description="")
129
+ min: Optional[float] = Field(None, description="")
130
+
131
+
132
+ class CPU(BaseModel):
133
+ Core_Usage_Average_ERROR: Optional[CoreUsageAverageERROR] = Field(
134
+ None, alias="Core Usage Average ERROR"
135
+ )
136
+ Core_Usage_Average_WARN: Optional[CoreUsageAverageWARN] = Field(
137
+ None, alias="Core Usage Average WARN"
138
+ )
139
+
140
+
141
+ class FieldUsedPercentERROR(BaseModel):
142
+ max: Optional[float] = Field(None, description="")
143
+ min: Optional[float] = Field(None, description="")
144
+
145
+
146
+ class FieldUsedPercentWARN(BaseModel):
147
+ max: Optional[float] = Field(None, description="")
148
+ min: Optional[float] = Field(None, description="")
149
+
150
+
151
+ class Disk(BaseModel):
152
+ field__Used_Percent_ERROR: Optional[FieldUsedPercentERROR] = Field(
153
+ None, alias="/ Used Percent ERROR"
154
+ )
155
+ field__Used_Percent_WARN: Optional[FieldUsedPercentWARN] = Field(
156
+ None, alias="/ Used Percent WARN"
157
+ )
158
+
159
+
160
+ class UsagePercentERROR(BaseModel):
161
+ max: Optional[float] = Field(None, description="")
162
+ min: Optional[float] = Field(None, description="")
163
+
164
+
165
+ class UsagePercentWARN(BaseModel):
166
+ max: Optional[float] = Field(None, description="")
167
+ min: Optional[float] = Field(None, description="")
168
+
169
+
170
+ class RAM(BaseModel):
171
+ Usage_Percent_ERROR: Optional[UsagePercentERROR] = Field(None, alias="Usage Percent ERROR")
172
+ Usage_Percent_WARN: Optional[UsagePercentWARN] = Field(None, alias="Usage Percent WARN")
173
+
174
+
175
+ class DiagnosticUpdater2(BaseModel):
176
+ CPU: Optional[CPU] = None
177
+ Disk: Optional[Disk] = None
178
+ RAM: Optional[RAM] = None
179
+ period: Optional[float] = Field(None, description="")
180
+ use_fqn: Optional[bool] = Field(None, description="")
181
+
182
+
183
+ class SystemResourceMonitorParameters(BaseModel):
184
+ calculation_rate: Optional[float] = Field(None, description="")
185
+ diagnostic_updater: Optional[DiagnosticUpdater2] = None
186
+ diagnostics: Optional[bool] = Field(None, description="")
187
+ diagnostics_log: Optional[bool] = Field(None, description="")
188
+ disk_directories: Optional[List[str]] = Field(None, description="")
189
+ publish: Optional[bool] = Field(None, description="")
190
+ publish_individual_cores: Optional[bool] = Field(None, description="")
191
+ publish_rate: Optional[float] = Field(None, description="")
192
+
193
+
194
+ class GeolocationParameters(BaseModel):
195
+ publish_horizon_rate: Optional[float] = Field(None, description="")
196
+ use_geopose: Optional[bool] = Field(None, description="")
197
+ max_time_diff: Optional[float] = Field(None, description="")
198
+ frame_id_base_link: Optional[str] = Field(None, description="")
199
+ horizon_padding: Optional[int] = Field(None, description="")
200
+ use_geopose_altitude: Optional[bool] = Field(None, description="")
201
+ camera_info_topics: Optional[List[str]] = Field(
202
+ None, description="List of camera info topics to use for geolocation"
203
+ )
204
+ horizon_marker_topics: Optional[List[str]] = Field(
205
+ None, description="List of horizon marker topics to use for geolocation"
206
+ )
207
+
208
+
209
+ class NodeConfigurationModel(BaseModel):
210
+ node_name_regex: str = Field(..., title="Node Name Regex")
211
+ parameter_name_regexes: List[str] = Field(..., title="Parameter Name Regexes")
212
+ dedicated_file_path: Optional[str] = Field("", title="Dedicated File Path")
213
+
214
+
215
+ class ParameterPersistenceParameters(BaseModel):
216
+ params_path: Optional[str] = Field(
217
+ None, description="Path to the file where the parameters are stored"
218
+ )
219
+ file_header: Optional[str] = Field(
220
+ None, description="A message to add to the top of the params file"
221
+ )
222
+ path_within_file: Optional[str] = Field(
223
+ None, description="Path within the file to store the parameters"
224
+ )
225
+ persistent_parameters: Optional[List[NodeConfigurationModel]] = Field(
226
+ None, description="Regex describing which parameters should persist"
227
+ )
228
+ ignore_namespace: Optional[str] = Field(
229
+ None,
230
+ description="Which (if any) part of the node namespace to ignore. Treated as regex.",
231
+ )
232
+
233
+
234
+ class DiagnosticUpdater3(BaseModel):
235
+ period: Optional[float] = Field(None, description="")
236
+ use_fqn: Optional[bool] = Field(None, description="")
237
+
238
+
239
+ class DetectorOnnxParameters(BaseModel):
240
+ enabled: Optional[bool] = Field(None, description="Should the detector be enabled")
241
+ use_nms: Optional[bool] = Field(None, description="Use NMS to suppress overlapping boxes")
242
+ rate: Optional[float] = Field(None, description="Rate of detection (per second)")
243
+ image_buffer_size: Optional[int] = Field(
244
+ None, description="Number of images to store in buffer for batch inference"
245
+ )
246
+ onnx_batch_size: Optional[int] = Field(
247
+ None, description="Only for .onnx models. Batch size for inference"
248
+ )
249
+ threshold: Optional[float] = Field(
250
+ None, description="Only publish rois above this objectness threshold"
251
+ )
252
+ nms_iou_threshold: Optional[float] = Field(
253
+ None,
254
+ description="Keeps the highest-scoring ROI where overlaps (IoU >= threshold) occur. Threshold=1 allows all overlaps; 0 suppresses any overlap. Used when use_nms=True",
255
+ )
256
+ model_path: Optional[str] = Field(None, description="Path to the onnx or trt engine model")
257
+ best_effort: Optional[bool] = Field(
258
+ None, description="REQUIRES RESTART. Enable BEST_EFFORT reliability for frame subscriber"
259
+ )
260
+ ignore_regions: Optional[str] = Field(
261
+ None, description="REQUIRES RESTART. Region of image for detector to ignore"
262
+ )
263
+ camera_frame_topics: Optional[List[str]] = Field(
264
+ None, description="REQUIRES RESTART. Topics to subscribe to for camera frames"
265
+ )
266
+ roi_topics: Optional[List[str]] = Field(
267
+ None, description="REQUIRES RESTART. Topics to publish ROIs to"
268
+ )
269
+ class_names: Optional[List[str]] = Field(
270
+ None,
271
+ description="REQUIRES RESTART. Only needed if using TensorRT. Class names to be listed in the order they were trained on",
272
+ )
273
+ diagnostic_updater: Optional[DiagnosticUpdater3] = None
274
+
275
+
276
+ class VesselOffsetsParameters(BaseModel):
277
+ frame_prefix: Optional[str] = Field(None, description="")
278
+ ignore_timestamp: Optional[bool] = Field(None, description="")
279
+ publish_frequency: Optional[float] = Field(None, description="")
280
+ robot_description: Optional[str] = Field(None, description="")
281
+
282
+
283
+ class Ais(BaseModel):
284
+ heading_format: Optional[str] = Field(
285
+ None, description="Heading format for AIS messages. 'radians' or 'degrees'"
286
+ )
287
+
288
+
289
+ class ObjectTrackerParameters(BaseModel):
290
+ ownship_name: Optional[str] = Field(None, description="")
291
+ ownship_mmsi: Optional[str] = Field(None, description="The MMSI of the ego vessel to ignore")
292
+ sources_fused: Optional[List[str]] = Field(None, description="")
293
+ sources_enabled: Optional[List[str]] = Field(None, description="")
294
+ required_times_seen_arpa: Optional[int] = Field(None, description="")
295
+ sources_back_projected: Optional[List[str]] = Field(
296
+ None, description="Project various sensor sources e.g. ais, arpa into the image"
297
+ )
298
+ use_geopose: Optional[bool] = Field(None, description="")
299
+ use_geopose_altitude: Optional[bool] = Field(None, description="")
300
+ max_time_diff: Optional[float] = Field(None, description="")
301
+ frame_id_base_link: Optional[str] = Field(None, description="")
302
+ horizon_padding: Optional[int] = Field(None, description="")
303
+ bearing_angle_tolerance: Optional[float] = Field(
304
+ None,
305
+ description="The maximum difference in bearing (degrees) between the object and the track for the object to be associated with the track.",
306
+ )
307
+ range_angle_tolerance: Optional[float] = Field(
308
+ None,
309
+ description="The maximum difference in range (m) between the object and the track for the object to be associated with the track.",
310
+ )
311
+ range_sensor_height: Optional[float] = Field(
312
+ None, description="The height of the range sensor (m)"
313
+ )
314
+ max_age_til_stale_rois: Optional[float] = Field(None, description="Age til stale (seconds)")
315
+ max_age_til_stale_arpa: Optional[float] = Field(None, description="Age til stale (seconds)")
316
+ max_age_til_stale_ais: Optional[float] = Field(None, description="Age til stale (seconds)")
317
+ max_age_til_stale_objects: Optional[float] = Field(None, description="Age til stale (seconds)")
318
+ roi_pf_sensitivity: Optional[float] = Field(None, description="Particle filter sensitivity")
319
+ roi_pf_dist_percentile: Optional[int] = Field(
320
+ None,
321
+ description="Particle filter distance percentile (to mean) for confident particles",
322
+ )
323
+ roi_pf_min_measurements: Optional[int] = Field(
324
+ None, description="Particle filter min number of measurements"
325
+ )
326
+ roi_pf_polygon_max_history: Optional[int] = Field(
327
+ None, description="Particle filter polygon max history"
328
+ )
329
+ roi_pf_polygon_max_update_hz: Optional[int] = Field(
330
+ None, description="Particle filter polygon max update hz"
331
+ )
332
+ roi_pf_measurement_pixel_error: Optional[float] = Field(
333
+ None, description="Particle filter pixel error (noise) for measurement update"
334
+ )
335
+ roi_pf_max_hist_mean_seconds: Optional[float] = Field(
336
+ None,
337
+ description="Particle filter maximum temporal filtering window for cloud means",
338
+ )
339
+ roi_pf_cloud_exp_decay_rate: Optional[float] = Field(
340
+ None,
341
+ description="Particle filter decay rate for particle cloud when no measurements",
342
+ )
343
+ publish_rate: Optional[float] = Field(None, description="Publish rate (Hz)")
344
+ publish_particles: Optional[bool] = Field(
345
+ None, description="Publish particles to a pointcloud topic"
346
+ )
347
+ camera_info_topics: Optional[List[str]] = Field(
348
+ None, description="List of camera info topics to use for geolocation"
349
+ )
350
+ roi_track_topics: Optional[List[str]] = Field(None, description="List of roi_track topics")
351
+ ais: Optional[Ais] = None
352
+ exclusion_zone_radius: Optional[float] = Field(
353
+ None,
354
+ description="Objects that are within this zone when first detected are ignored.",
355
+ )
356
+ diagnostic_updater: Optional[DiagnosticUpdater3] = None
357
+
358
+
359
+ class ObjectHistoryParameters(BaseModel):
360
+ filter: Optional[str] = Field(None, description="")
361
+ alerts: Optional[List[str]] = Field(None, description="")
362
+ object_stale_timeout: Optional[float] = Field(
363
+ None, description="How long to wait before removing object from history"
364
+ )
365
+ notifications_use_sim_time: Optional[bool] = Field(
366
+ None, description="Whether to use the sim time for alerts"
367
+ )
368
+ diagnostic_updater: Optional[DiagnosticUpdater3] = None
369
+
370
+
371
+ class LookoutGreenstreamBringupParameters(BaseModel):
372
+ launch_package: Optional[str] = Field(None, description="")
373
+ launch_executable: Optional[str] = Field(None, description="")
374
+
375
+
376
+ class LookoutConfigManagerParameters(BaseModel):
377
+ launch_package: Optional[str] = Field(None, description="")
378
+ launch_executable: Optional[str] = Field(None, description="")
379
+
380
+
10
381
  class WebBridgeParameters(BaseModel):
11
382
  address: Optional[str] = Field(
12
383
  None, description="The host address to bind the WebSocket server to"
@@ -15,6 +386,14 @@ class WebBridgeParameters(BaseModel):
15
386
  None,
16
387
  description="List of regular expressions (ECMAScript) of whitelisted parameter names.",
17
388
  )
389
+ best_effort_qos_send_buffer_limit: Optional[int] = Field(
390
+ None,
391
+ description="Connection send buffer limit in bytes for 'best_effort' messages",
392
+ )
393
+ best_effort_qos_topic_whitelist: Optional[List[str]] = Field(
394
+ None,
395
+ description="List of regular expressions (ECMAScript) for topics that should be forced to use 'best_effort' QoS. Unmatched topics will use 'reliable' QoS if ALL publishers are 'reliable', 'best_effort' if any publishers are 'best_effort'.",
396
+ )
18
397
  capabilities: Optional[List[str]] = Field(None, description="Server capabilities")
19
398
  certfile: Optional[str] = Field(None, description="Path to the certificate to use for TLS")
20
399
  client_topic_whitelist: Optional[List[str]] = Field(
@@ -59,11 +438,225 @@ class WebBridgeParameters(BaseModel):
59
438
  )
60
439
 
61
440
 
62
- class LookoutGreenstreamBringupParameters(BaseModel):
63
- launch_package: Optional[str] = Field(None, description="")
64
- launch_executable: Optional[str] = Field(None, description="")
441
+ class Camera(BaseModel):
442
+ name: Optional[str] = Field(None, description="The name of the camera")
443
+ order: Optional[int] = Field(None, description="The order of the camera")
444
+ type: Optional[str] = Field(None, description="The camera type")
445
+
446
+
447
+ class Crop(BaseModel):
448
+ top: Optional[int] = Field(
449
+ None, description="Number of pixels to crop from the top of the video stream"
450
+ )
451
+ left: Optional[int] = Field(
452
+ None, description="Number of pixels to crop from the left of the video stream"
453
+ )
454
+ bottom: Optional[int] = Field(
455
+ None, description="Number of pixels to crop from the bottom of the video stream"
456
+ )
457
+ right: Optional[int] = Field(
458
+ None, description="Number of pixels to crop from the right of the video stream"
459
+ )
460
+
461
+
462
+ class Rtsp(BaseModel):
463
+ username: Optional[str] = Field(None, description="RTSP Camera username")
464
+ password: Optional[str] = Field(None, description="RTSP Camera password")
465
+ ip_address: Optional[str] = Field(None, description="RTSP Camera IP address")
466
+ port: Optional[int] = Field(None, description="RTSP Camera port")
467
+ stream: Optional[str] = Field(None, description="RTSP Camera stream")
468
+
469
+
470
+ class Test(BaseModel):
471
+ pattern: Optional[str] = Field(None, description="Test pattern for videotestsrc")
472
+
473
+
474
+ class Pipeline(BaseModel):
475
+ name: Optional[str] = Field(
476
+ None, description="Node name of main stream for this pipeline to stream from"
477
+ )
478
+
479
+
480
+ class V4l2(BaseModel):
481
+ device: Optional[str] = Field(None, description="V4L2 device path")
482
+
483
+
484
+ class Genicam(BaseModel):
485
+ camera_name: Optional[str] = Field(None, description="GenICam camera name")
486
+ auto_exposure: Optional[bool] = Field(None, description="Enable camera auto exposure")
487
+ auto_gain: Optional[bool] = Field(None, description="Enable camera auto gain")
488
+
489
+
490
+ class RosDds(BaseModel):
491
+ topic: Optional[str] = Field(None, description="Incoming topic for camera stream")
492
+
493
+
494
+ class Custom(BaseModel):
495
+ pipeline: Optional[str] = Field(None, description="Custom camera pipeline")
496
+
497
+
498
+ class Webrtc(BaseModel):
499
+ peer_id: Optional[str] = Field(None, description="Peer ID for WebRTC source")
500
+
501
+
502
+ class SignallingServer(BaseModel):
503
+ host: Optional[str] = Field(None, description="Signalling server host IP")
504
+ port: Optional[int] = Field(None, description="Signalling server port")
505
+
506
+
507
+ class Ue(BaseModel):
508
+ signalling_server: Optional[SignallingServer] = None
509
+ streamer_id: Optional[str] = Field(None, description="Camera ID for the UE Streamer")
510
+
511
+
512
+ class Source(BaseModel):
513
+ type: Optional[str] = Field(None, description="The type of stream source")
514
+ framerate: Optional[int] = Field(
515
+ None, description="Framerate for video stream to scale to (FPS)"
516
+ )
517
+ pixel_height: Optional[int] = Field(
518
+ None, description="Pixel height of scaled video resolution"
519
+ )
520
+ pixel_width: Optional[int] = Field(None, description="Pixel width of scaled video resolution")
521
+ format: Optional[str] = Field(None, description="Format of video stream")
522
+ crop: Optional[Crop] = None
523
+ rtsp: Optional[Rtsp] = None
524
+ test: Optional[Test] = None
525
+ pipeline: Optional[Pipeline] = None
526
+ v4l2: Optional[V4l2] = None
527
+ genicam: Optional[Genicam] = None
528
+ ros_dds: Optional[RosDds] = None
529
+ custom: Optional[Custom] = None
530
+ webrtc: Optional[Webrtc] = None
531
+ ue: Optional[Ue] = None
532
+
533
+
534
+ class Undistort(BaseModel):
535
+ enabled: Optional[bool] = Field(None, description="Enable image undistortion")
536
+ k_intrinsic: Optional[List[float]] = Field(None, description="Camera intrinsic matrix")
537
+ distortion_parameters: Optional[List[float]] = Field(
538
+ None, description="Camera distortion parameters"
539
+ )
540
+
541
+
542
+ class SignallingServer1(BaseModel):
543
+ protocol: Optional[str] = Field(None, description="Signalling server protocol. 'ws' or 'wss'")
544
+ host: Optional[str] = Field(None, description="Signalling server host IP")
545
+ port: Optional[int] = Field(None, description="Signalling server port")
546
+
547
+
548
+ class VeryLow(BaseModel):
549
+ min_bitrate: Optional[int] = Field(None, description="Very Low Quality min bitrate (bits/s)")
550
+ max_bitrate: Optional[int] = Field(None, description="Very Low Quality max bitrate (bits/s)")
551
+
552
+
553
+ class Low(BaseModel):
554
+ min_bitrate: Optional[int] = Field(None, description="Low Quality min bitrate (bits/s)")
555
+ max_bitrate: Optional[int] = Field(None, description="Low Quality max bitrate (bits/s)")
556
+
557
+
558
+ class Medium(BaseModel):
559
+ min_bitrate: Optional[int] = Field(None, description="Medium Quality min bitrate (bits/s)")
560
+ max_bitrate: Optional[int] = Field(None, description="Medium Quality max bitrate (bits/s)")
561
+
562
+
563
+ class High(BaseModel):
564
+ min_bitrate: Optional[int] = Field(None, description="High Quality min bitrate (bits/s)")
565
+ max_bitrate: Optional[int] = Field(None, description="High Quality max bitrate (bits/s)")
566
+
567
+
568
+ class VeryHigh(BaseModel):
569
+ min_bitrate: Optional[int] = Field(None, description="Very High Quality min bitrate (bits/s)")
570
+ max_bitrate: Optional[int] = Field(None, description="Very High Quality max bitrate (bits/s)")
571
+
572
+
573
+ class Quality(BaseModel):
574
+ level: Optional[str] = Field(None, description="Quality level for WebRTC publishing")
575
+ very_low: Optional[VeryLow] = None
576
+ low: Optional[Low] = None
577
+ medium: Optional[Medium] = None
578
+ high: Optional[High] = None
579
+ very_high: Optional[VeryHigh] = None
580
+
581
+
582
+ class Webrtc1(BaseModel):
583
+ enabled: Optional[bool] = Field(None, description="Enable WebRTC publishing")
584
+ signalling_server: Optional[SignallingServer1] = None
585
+ congestion_control: Optional[str] = Field(None, description="WebRTC congestion control mode")
586
+ quality: Optional[Quality] = None
587
+
588
+
589
+ class Topic(BaseModel):
590
+ enabled: Optional[bool] = Field(None, description="Enable image topic publishing")
591
+ name: Optional[str] = Field(None, description="Name of image topic")
592
+ throttle_time: Optional[float] = Field(
593
+ None,
594
+ description="Time kept between rendered buffers for the ROS topic in seconds",
595
+ )
596
+ frame_id: Optional[str] = Field(None, description="Camera frame ID of image stream")
597
+
598
+
599
+ class Publish(BaseModel):
600
+ webrtc: Optional[Webrtc1] = None
601
+ topic: Optional[Topic] = None
602
+
603
+
604
+ class PipelineBowStbdColorParameters(BaseModel):
605
+ namespace_vessel_application: Optional[str] = Field(
606
+ None,
607
+ description="The namespace of the vessel and application, separated by '/'",
608
+ )
609
+ recreate_pipeline_on_eos: Optional[bool] = Field(
610
+ None, description="Enable pipeline recreation on EOS"
611
+ )
612
+ latency_tracer: Optional[bool] = Field(None, description="Enable latency tracer")
613
+ debug_plugins: Optional[List[str]] = Field(
614
+ None, description="List of plugins to enable debug logging for"
615
+ )
616
+ camera: Optional[Camera] = None
617
+ source: Optional[Source] = None
618
+ undistort: Optional[Undistort] = None
619
+ publish: Optional[Publish] = None
620
+ diagnostic_updater: Optional[DiagnosticUpdater3] = None
621
+
622
+
623
+ class GstRosimagesinkBowStbdColorParameters(BaseModel):
624
+ pass
625
+
626
+
627
+ class InfoBowStbdColorParameters(BaseModel):
628
+ frame_id: Optional[str] = Field(None, description="Frame id / Camera id")
629
+ model: Optional[str] = Field(None, description="Camera model")
630
+ type: Optional[str] = Field(None, description="Camera type")
631
+ pixel_width: Optional[int] = Field(None, description="Pixel width (pixels)")
632
+ pixel_height: Optional[int] = Field(None, description="Pixel height (pixels)")
633
+ distortion_model: Optional[str] = Field(None, description="Distortion model type")
634
+ distortion_params: Optional[List[float]] = Field(None, description="Distortion parameters")
635
+ k_intrinsic: Optional[List[float]] = Field(None, description="Intrinsic matrix")
636
+ distortion_kmat_alpha: Optional[float] = Field(
637
+ None,
638
+ description="Free scaling parameter for undistorted image between 0 (all pixels are valid), and 1 (all source pixels are retained i.e. max distortion FOV)",
639
+ )
640
+ publish_camera_info: Optional[bool] = Field(
641
+ None,
642
+ description="If false, will subscribe to an existing camera info topic instead for camera_info_distorted",
643
+ )
65
644
 
66
645
 
67
646
  class LaunchParameters(BaseModel):
68
- web_bridge: Optional[WebBridgeParameters] = None
647
+ diagnostic_aggregator: Optional[DiagnosticAggregatorParameters] = None
648
+ roi_tracker: Optional[RoiTrackerParameters] = None
649
+ data_recorder: Optional[DataRecorderParameters] = None
650
+ system_resource_monitor: Optional[SystemResourceMonitorParameters] = None
651
+ geolocation: Optional[GeolocationParameters] = None
652
+ parameter_persistence: Optional[ParameterPersistenceParameters] = None
653
+ detector_onnx: Optional[DetectorOnnxParameters] = None
654
+ vessel_offsets: Optional[VesselOffsetsParameters] = None
655
+ object_tracker: Optional[ObjectTrackerParameters] = None
656
+ object_history: Optional[ObjectHistoryParameters] = None
69
657
  lookout_greenstream_bringup: Optional[LookoutGreenstreamBringupParameters] = None
658
+ lookout_config_manager: Optional[LookoutConfigManagerParameters] = None
659
+ web_bridge: Optional[WebBridgeParameters] = None
660
+ pipeline_bow_stbd_color: Optional[PipelineBowStbdColorParameters] = None
661
+ gst_rosimagesink_bow_stbd_color: Optional[GstRosimagesinkBowStbdColorParameters] = None
662
+ info_bow_stbd_color: Optional[InfoBowStbdColorParameters] = None
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$defs": {
3
- "CameraExtended": {
3
+ "Camera": {
4
4
  "properties": {
5
5
  "name": {
6
6
  "title": "Name",
@@ -44,7 +44,94 @@
44
44
  "name",
45
45
  "order"
46
46
  ],
47
- "title": "CameraExtended",
47
+ "title": "Camera",
48
+ "type": "object"
49
+ },
50
+ "DiscoveryFastDDS": {
51
+ "properties": {
52
+ "type": {
53
+ "const": "fastdds",
54
+ "default": "fastdds",
55
+ "enum": [
56
+ "fastdds"
57
+ ],
58
+ "title": "Type",
59
+ "type": "string"
60
+ },
61
+ "with_discovery_server": {
62
+ "default": true,
63
+ "description": "Run the discovery server. It will bind to 0.0.0.0:11811",
64
+ "title": "With Discovery Server",
65
+ "type": "boolean"
66
+ },
67
+ "discovery_server_ip": {
68
+ "default": "0.0.0.0",
69
+ "description": "IP/host/interface of the discovery server. Assumes port of 11811",
70
+ "title": "Discovery Server Ip",
71
+ "type": "string"
72
+ },
73
+ "own_ip": {
74
+ "default": "0.0.0.0",
75
+ "description": "IP/host/interface address of the primary network interface. This is where DDS traffic will route to.",
76
+ "title": "Own Ip",
77
+ "type": "string"
78
+ }
79
+ },
80
+ "title": "DiscoveryFastDDS",
81
+ "type": "object"
82
+ },
83
+ "DiscoverySimple": {
84
+ "properties": {
85
+ "type": {
86
+ "const": "simple",
87
+ "default": "simple",
88
+ "enum": [
89
+ "simple"
90
+ ],
91
+ "title": "Type",
92
+ "type": "string"
93
+ },
94
+ "ros_domain_id": {
95
+ "default": 0,
96
+ "description": "ROS domain ID",
97
+ "title": "Ros Domain Id",
98
+ "type": "integer"
99
+ },
100
+ "own_ip": {
101
+ "default": "0.0.0.0",
102
+ "description": "IP/host/interface address of the primary network interface. This is where DDS traffic will route to.",
103
+ "title": "Own Ip",
104
+ "type": "string"
105
+ }
106
+ },
107
+ "title": "DiscoverySimple",
108
+ "type": "object"
109
+ },
110
+ "DiscoveryZenoh": {
111
+ "properties": {
112
+ "type": {
113
+ "const": "zenoh",
114
+ "default": "zenoh",
115
+ "enum": [
116
+ "zenoh"
117
+ ],
118
+ "title": "Type",
119
+ "type": "string"
120
+ },
121
+ "with_discovery_server": {
122
+ "default": true,
123
+ "description": "Run the zenoh router",
124
+ "title": "With Discovery Server",
125
+ "type": "boolean"
126
+ },
127
+ "discovery_server_ip": {
128
+ "default": "0.0.0.0",
129
+ "description": "IP/host/interface of the discovery server.",
130
+ "title": "Discovery Server Ip",
131
+ "type": "string"
132
+ }
133
+ },
134
+ "title": "DiscoveryZenoh",
48
135
  "type": "object"
49
136
  },
50
137
  "GeolocationMode": {
@@ -250,40 +337,6 @@
250
337
  "title": "PTZOffsets",
251
338
  "type": "object"
252
339
  },
253
- "Point": {
254
- "properties": {
255
- "x": {
256
- "title": "X",
257
- "type": "integer"
258
- },
259
- "y": {
260
- "title": "Y",
261
- "type": "integer"
262
- }
263
- },
264
- "required": [
265
- "x",
266
- "y"
267
- ],
268
- "title": "Point",
269
- "type": "object"
270
- },
271
- "Polygon": {
272
- "properties": {
273
- "points": {
274
- "items": {
275
- "$ref": "#/$defs/Point"
276
- },
277
- "title": "Points",
278
- "type": "array"
279
- }
280
- },
281
- "required": [
282
- "points"
283
- ],
284
- "title": "Polygon",
285
- "type": "object"
286
- },
287
340
  "PositioningSystem": {
288
341
  "enum": [
289
342
  "none",
@@ -320,12 +373,6 @@
320
373
  }
321
374
  },
322
375
  "properties": {
323
- "ros_domain_id": {
324
- "default": 0,
325
- "description": "ROS domain ID for the vessel. This only applies if 'simple_discovery' is true.",
326
- "title": "Ros Domain Id",
327
- "type": "integer"
328
- },
329
376
  "namespace_vessel": {
330
377
  "default": "vessel_1",
331
378
  "title": "Namespace Vessel",
@@ -337,34 +384,22 @@
337
384
  "type": "boolean"
338
385
  },
339
386
  "mode": {
340
- "allOf": [
341
- {
342
- "$ref": "#/$defs/Mode"
343
- }
344
- ],
387
+ "$ref": "#/$defs/Mode",
345
388
  "default": "hardware"
346
389
  },
347
390
  "log_level": {
348
- "allOf": [
349
- {
350
- "$ref": "#/$defs/LogLevel"
351
- }
352
- ],
391
+ "$ref": "#/$defs/LogLevel",
353
392
  "default": "info"
354
393
  },
355
394
  "cameras": {
356
395
  "items": {
357
- "$ref": "#/$defs/CameraExtended"
396
+ "$ref": "#/$defs/Camera"
358
397
  },
359
398
  "title": "Cameras",
360
399
  "type": "array"
361
400
  },
362
401
  "network": {
363
- "allOf": [
364
- {
365
- "$ref": "#/$defs/Network"
366
- }
367
- ],
402
+ "$ref": "#/$defs/Network",
368
403
  "default": "host"
369
404
  },
370
405
  "gpu": {
@@ -373,27 +408,15 @@
373
408
  "type": "boolean"
374
409
  },
375
410
  "geolocation_mode": {
376
- "allOf": [
377
- {
378
- "$ref": "#/$defs/GeolocationMode"
379
- }
380
- ],
411
+ "$ref": "#/$defs/GeolocationMode",
381
412
  "default": "none"
382
413
  },
383
414
  "positioning_system": {
384
- "allOf": [
385
- {
386
- "$ref": "#/$defs/PositioningSystem"
387
- }
388
- ],
415
+ "$ref": "#/$defs/PositioningSystem",
389
416
  "default": "none"
390
417
  },
391
418
  "offsets": {
392
- "allOf": [
393
- {
394
- "$ref": "#/$defs/VesselOffsets"
395
- }
396
- ],
419
+ "$ref": "#/$defs/VesselOffsets",
397
420
  "default": {
398
421
  "name": "mars.stl",
399
422
  "baselink_to_ins": {
@@ -427,34 +450,37 @@
427
450
  "title": "Log Directory",
428
451
  "type": "string"
429
452
  },
453
+ "model_directory": {
454
+ "default": "~/greenroom/lookout/models",
455
+ "title": "Model Directory",
456
+ "type": "string"
457
+ },
430
458
  "recording_directory": {
431
459
  "default": "~/greenroom/lookout/recordings",
432
460
  "title": "Recording Directory",
433
461
  "type": "string"
434
462
  },
435
- "with_discovery_server": {
436
- "default": true,
437
- "description": "Run the discovery server. It will bind to 0.0.0.0:11811",
438
- "title": "With Discovery Server",
439
- "type": "boolean"
440
- },
441
- "simple_discovery": {
442
- "default": false,
443
- "description": "Use simple discovery. This should NOT be used in production due to performance issues.",
444
- "title": "Simple Discovery",
445
- "type": "boolean"
446
- },
447
- "discovery_server_ip": {
448
- "default": "0.0.0.0",
449
- "description": "IP/host/interface of the discovery server. Assumes port of 11811",
450
- "title": "Discovery Server Ip",
451
- "type": "string"
452
- },
453
- "own_ip": {
454
- "default": "0.0.0.0",
455
- "description": "IP/host/interface address of the primary network interface. This is where DDS traffic will route to.",
456
- "title": "Own Ip",
457
- "type": "string"
463
+ "discovery": {
464
+ "discriminator": {
465
+ "mapping": {
466
+ "fastdds": "#/$defs/DiscoveryFastDDS",
467
+ "simple": "#/$defs/DiscoverySimple",
468
+ "zenoh": "#/$defs/DiscoveryZenoh"
469
+ },
470
+ "propertyName": "type"
471
+ },
472
+ "oneOf": [
473
+ {
474
+ "$ref": "#/$defs/DiscoveryZenoh"
475
+ },
476
+ {
477
+ "$ref": "#/$defs/DiscoveryFastDDS"
478
+ },
479
+ {
480
+ "$ref": "#/$defs/DiscoverySimple"
481
+ }
482
+ ],
483
+ "title": "Discovery"
458
484
  }
459
485
  },
460
486
  "title": "LookoutConfig",
lookout_config/types.py CHANGED
@@ -2,9 +2,9 @@
2
2
  # * lookout_interfaces/msg/Config.msg
3
3
  # * lookout_config_manager/mappers.py
4
4
 
5
- from typing import Optional, Any
5
+ from typing import Any, Literal, Union
6
6
  from enum import Enum
7
- from pydantic import BaseModel, field_validator, ConfigDict
7
+ from pydantic import BaseModel, ConfigDict
8
8
  from pydantic.fields import Field
9
9
 
10
10
  from greenstream_config.types import Camera, Offsets
@@ -79,6 +79,45 @@ class VesselOffsets(BaseModel):
79
79
  baselink_to_waterline: Offsets
80
80
 
81
81
 
82
+ class DiscoverySimple(BaseModel):
83
+ type: Literal["simple"] = "simple"
84
+ ros_domain_id: int = Field(
85
+ default=0,
86
+ description="ROS domain ID",
87
+ )
88
+ own_ip: str = Field(
89
+ default="0.0.0.0",
90
+ description="IP/host/interface address of the primary network interface. This is where DDS traffic will route to.",
91
+ )
92
+
93
+
94
+ class DiscoveryFastDDS(BaseModel):
95
+ type: Literal["fastdds"] = "fastdds"
96
+ with_discovery_server: bool = Field(
97
+ default=True, description="Run the discovery server. It will bind to 0.0.0.0:11811"
98
+ )
99
+ discovery_server_ip: str = Field(
100
+ default="0.0.0.0",
101
+ description="IP/host/interface of the discovery server. Assumes port of 11811",
102
+ )
103
+ own_ip: str = Field(
104
+ default="0.0.0.0",
105
+ description="IP/host/interface address of the primary network interface. This is where DDS traffic will route to.",
106
+ )
107
+
108
+
109
+ class DiscoveryZenoh(BaseModel):
110
+ type: Literal["zenoh"] = "zenoh"
111
+ with_discovery_server: bool = Field(default=True, description="Run the zenoh router")
112
+ discovery_server_ip: str = Field(
113
+ default="0.0.0.0",
114
+ description="IP/host/interface of the discovery server.",
115
+ )
116
+
117
+
118
+ Discovery = Union[DiscoveryZenoh, DiscoveryFastDDS, DiscoverySimple]
119
+
120
+
82
121
  class LookoutConfig(BaseModel):
83
122
  # So enum values are written and read to the yml correctly
84
123
  model_config = ConfigDict(
@@ -91,10 +130,6 @@ class LookoutConfig(BaseModel):
91
130
  PositioningSystem: lambda v: v.value,
92
131
  },
93
132
  )
94
- ros_domain_id: int = Field(
95
- default=0,
96
- description="ROS domain ID for the vessel. This only applies if 'simple_discovery' is true.",
97
- )
98
133
  namespace_vessel: str = "vessel_1"
99
134
  gama_vessel: bool = False
100
135
  mode: Mode = Mode.HARDWARE
@@ -114,19 +149,9 @@ class LookoutConfig(BaseModel):
114
149
  components: Any = Field(default_factory=dict)
115
150
  prod: bool = True
116
151
  log_directory: str = "~/greenroom/lookout/logs"
152
+ model_directory: str = "~/greenroom/lookout/models"
117
153
  recording_directory: str = "~/greenroom/lookout/recordings"
118
- with_discovery_server: bool = Field(
119
- default=True, description="Run the discovery server. It will bind to 0.0.0.0:11811"
120
- )
121
- simple_discovery: bool = Field(
122
- default=False,
123
- description="Use simple discovery. This should NOT be used in production due to performance issues.",
124
- )
125
- discovery_server_ip: str = Field(
126
- default="0.0.0.0",
127
- description="IP/host/interface of the discovery server. Assumes port of 11811",
128
- )
129
- own_ip: str = Field(
130
- default="0.0.0.0",
131
- description="IP/host/interface address of the primary network interface. This is where DDS traffic will route to.",
154
+ discovery: Discovery = Field(
155
+ default_factory=DiscoverySimple,
156
+ discriminator="type",
132
157
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: lookout_config
3
- Version: 1.18.5
3
+ Version: 1.20.0
4
4
  Summary: A library for reading / writing Lookout config files
5
5
  Home-page: https://github.com/Greenroom-Robotics/lookout
6
6
  Author: Greenroom Robotics
@@ -19,7 +19,7 @@ Requires-Dist: setuptools
19
19
  Requires-Dist: dacite
20
20
  Requires-Dist: PyYAML
21
21
  Requires-Dist: dc-schema
22
- Requires-Dist: greenstream-config==3.17.2
22
+ Requires-Dist: greenstream-config==3.18.2
23
23
  Requires-Dist: gr-urchin
24
24
 
25
25
  # Lookout Config
@@ -0,0 +1,13 @@
1
+ lookout_config/__init__.py,sha256=NKLSlCn7mb8HRbkOB6i6EBpvROLGRlZRcnHc5nm1zTk,1722
2
+ lookout_config/generate_schemas.py,sha256=yFNvrZ6gie1tnTM_1TO8_wBa0lFHJAABSI3ZAZqw_Wg,457
3
+ lookout_config/generate_urdf.py,sha256=O5n0hNsRJwTgQnWdPZIg_LgpxlDQOzWv5IccjT7yDS4,2719
4
+ lookout_config/helpers.py,sha256=3GkGRPDzQ67I5srwcWoI8PI1dgrWvTsUwA8-yRUttLM,603
5
+ lookout_config/launch_parameters.py,sha256=6QiUA_nAIN_k4kSOnrKx9xsRjOhXZPoQJOqMAIgERtU,27847
6
+ lookout_config/types.py,sha256=XV6kf0FpX5Onl1OYPSDZmeSKMiBfMxed5uZTsa1OpzI,4322
7
+ lookout_config/schemas/lookout.schema.json,sha256=YitPtERzDcgr-suhPXX0Tj2dK98Vsuz5_aNTHf4HNec,10634
8
+ lookout_config/test/lookout_config_test.py,sha256=TdOzIEWnyrckhmK7OtShtoWwSAP8QDCiKalNhvScd2U,73
9
+ lookout_config-1.20.0.dist-info/METADATA,sha256=WrQXFyRfx5MrWU-xknTpx1nMdMTgbdaYnJmRmHPBGxc,1442
10
+ lookout_config-1.20.0.dist-info/WHEEL,sha256=beeZ86-EfXScwlR_HKu4SllMC9wUEj_8Z_4FJ3egI2w,91
11
+ lookout_config-1.20.0.dist-info/top_level.txt,sha256=IiZRgJhNrNL87uLMQm9lQRrMCqJnTOl7aYlA7zRSYyg,15
12
+ lookout_config-1.20.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
13
+ lookout_config-1.20.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.1)
2
+ Generator: setuptools (76.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,13 +0,0 @@
1
- lookout_config/__init__.py,sha256=NKLSlCn7mb8HRbkOB6i6EBpvROLGRlZRcnHc5nm1zTk,1722
2
- lookout_config/generate_schemas.py,sha256=yFNvrZ6gie1tnTM_1TO8_wBa0lFHJAABSI3ZAZqw_Wg,457
3
- lookout_config/generate_urdf.py,sha256=O5n0hNsRJwTgQnWdPZIg_LgpxlDQOzWv5IccjT7yDS4,2719
4
- lookout_config/helpers.py,sha256=3GkGRPDzQ67I5srwcWoI8PI1dgrWvTsUwA8-yRUttLM,603
5
- lookout_config/launch_parameters.py,sha256=wvLXQMPi7D3ExesyvSNLPYEb2WChj9YTslnvQYPsXbk,3033
6
- lookout_config/types.py,sha256=9Osic4J0go-uRKM6walZUEcPGz_7inxhanFUXIPAloo,3701
7
- lookout_config/schemas/lookout.schema.json,sha256=qP2kfLxBfAZTmITQ6f3kcOF3-9PxEeFRcTKXBFfDUVQ,9510
8
- lookout_config/test/lookout_config_test.py,sha256=TdOzIEWnyrckhmK7OtShtoWwSAP8QDCiKalNhvScd2U,73
9
- lookout_config-1.18.5.dist-info/METADATA,sha256=ww6Qs_hM8-o_52IrCp2M6QkFt36pTvN-eS0kGeoeqzg,1442
10
- lookout_config-1.18.5.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
11
- lookout_config-1.18.5.dist-info/top_level.txt,sha256=IiZRgJhNrNL87uLMQm9lQRrMCqJnTOl7aYlA7zRSYyg,15
12
- lookout_config-1.18.5.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
13
- lookout_config-1.18.5.dist-info/RECORD,,