antioch-py 2.0.6__py3-none-any.whl → 2.0.7__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.
antioch/session/scene.py CHANGED
@@ -20,6 +20,7 @@ from antioch.session.views import (
20
20
  has_collision,
21
21
  remove_collision,
22
22
  set_collision,
23
+ set_nonvisual_material,
23
24
  set_pir_material,
24
25
  )
25
26
  from common.core import ContainerSource, get_asset_path
@@ -1330,28 +1331,33 @@ class Scene(SessionContainer):
1330
1331
  self,
1331
1332
  path: str,
1332
1333
  config: PirSensorConfig | None = None,
1333
- update_rate_hz: float = 10.0,
1334
- max_range: float = 12.0,
1335
- horiz_fov_deg: float = 90.0,
1336
- vert_fov_deg: float = 60.0,
1337
- rays_per_h: int = 64,
1338
- rays_per_v: int = 16,
1339
- gain: float = 0.01,
1340
- hp_corner_hz: float = 0.1,
1341
- lp_corner_hz: float = 3.0,
1334
+ update_rate_hz: float = 60.0,
1335
+ max_range: float = 20.0,
1336
+ total_horiz_fov_deg: float = 150.0,
1337
+ sensor_side_fov_deg: float = 45.0,
1338
+ sensor_center_fov_deg: float = 45.0,
1339
+ sensor_rays_horiz: int = 128,
1340
+ sensor_rays_vert: int = 16,
1341
+ min_vertical_angle_center: float = -30.0,
1342
+ max_vertical_angle_center: float = 30.0,
1343
+ min_vertical_angle_side: float = -30.0,
1344
+ max_vertical_angle_side: float = 30.0,
1345
+ gain_center: float = 0.015,
1346
+ gain_sides: float = 0.01,
1347
+ hp_corner_hz: float = 0.4,
1348
+ lp_corner_hz: float = 10.0,
1342
1349
  threshold: float | None = None,
1343
1350
  threshold_scale: float = 1.0,
1344
- hold_time_s: float = 2.0,
1351
+ blind_time_s: float = 0.5,
1352
+ pulse_counter: int = 2,
1353
+ window_time_s: float = 2.0,
1354
+ count_mode: int = 0,
1345
1355
  lens_transmission: float = 0.9,
1346
1356
  lens_segments_h: int = 6,
1347
- vertical_gain_falloff: float = 0.5,
1348
- element_fov_overlap_deg: float = 20.0,
1349
- element_scatter_gain: float = 0.1,
1350
- element_fov_transition_deg: float = 15.0,
1351
1357
  ambient_temp_c: float = 20.0,
1352
1358
  thermal_time_constant_s: float = 0.2,
1353
- pyro_responsivity: float = 1.0,
1354
- noise_amplitude: float = 0.0,
1359
+ pyro_responsivity: float = 4000.0,
1360
+ noise_amplitude: float = 20e-6,
1355
1361
  target_delta_t: float = 10.0,
1356
1362
  target_distance: float = 5.0,
1357
1363
  target_emissivity: float = 0.98,
@@ -1369,22 +1375,27 @@ class Scene(SessionContainer):
1369
1375
  :param config: Optional PIR sensor configuration (alternative to individual parameters).
1370
1376
  :param update_rate_hz: Sensor update frequency in Hz.
1371
1377
  :param max_range: Maximum detection range in meters.
1372
- :param horiz_fov_deg: Horizontal field of view in degrees.
1373
- :param vert_fov_deg: Vertical field of view in degrees.
1374
- :param rays_per_h: Number of rays in horizontal direction.
1375
- :param rays_per_v: Number of rays in vertical direction.
1376
- :param gain: Amplifier gain.
1378
+ :param total_horiz_fov_deg: Total horizontal coverage in degrees. Enables automatic fanning.
1379
+ :param sensor_side_fov_deg: Horizontal FOV for side sensors in degrees.
1380
+ :param sensor_center_fov_deg: Horizontal FOV for center sensor in degrees.
1381
+ :param sensor_rays_horiz: Number of rays per sensor in horizontal direction.
1382
+ :param sensor_rays_vert: Number of rays per sensor in vertical direction.
1383
+ :param min_vertical_angle_center: Minimum vertical angle for center sensor in degrees.
1384
+ :param max_vertical_angle_center: Maximum vertical angle for center sensor in degrees.
1385
+ :param min_vertical_angle_side: Minimum vertical angle for side sensors in degrees.
1386
+ :param max_vertical_angle_side: Maximum vertical angle for side sensors in degrees.
1387
+ :param gain_center: Amplifier gain for center sensor.
1388
+ :param gain_sides: Amplifier gain for side sensors.
1377
1389
  :param hp_corner_hz: High-pass filter corner frequency in Hz.
1378
1390
  :param lp_corner_hz: Low-pass filter corner frequency in Hz.
1379
1391
  :param threshold: Detection threshold (auto-calibrated if None).
1380
1392
  :param threshold_scale: Scale factor applied to auto-calibrated threshold.
1381
- :param hold_time_s: Detection hold time in seconds.
1393
+ :param blind_time_s: Blind time after detection in seconds.
1394
+ :param pulse_counter: Number of pulses required to trigger detection (1-4).
1395
+ :param window_time_s: Window time for pulse counting in seconds.
1396
+ :param count_mode: Pulse counting mode (0 = sign change required, 1 = any crossing).
1382
1397
  :param lens_transmission: Lens transmission coefficient (0-1).
1383
- :param lens_segments_h: Number of horizontal lens segments (sinusoidal sensitivity peaks).
1384
- :param vertical_gain_falloff: Exponent for elevation-based gain reduction (0=uniform).
1385
- :param element_fov_overlap_deg: Half-angle of center region where both elements see well (degrees).
1386
- :param element_scatter_gain: Minimum gain for blocked element due to scatter/reflections (0-1).
1387
- :param element_fov_transition_deg: Width of soft transition from full gain to scatter gain (degrees).
1398
+ :param lens_segments_h: Number of horizontal lens segments (facets).
1388
1399
  :param ambient_temp_c: Ambient temperature in Celsius.
1389
1400
  :param thermal_time_constant_s: Pyroelectric element thermal time constant in seconds.
1390
1401
  :param pyro_responsivity: Pyroelectric responsivity scaling factor.
@@ -1402,22 +1413,27 @@ class Scene(SessionContainer):
1402
1413
  config = PirSensorConfig(
1403
1414
  update_rate_hz=update_rate_hz,
1404
1415
  max_range=max_range,
1405
- horiz_fov_deg=horiz_fov_deg,
1406
- vert_fov_deg=vert_fov_deg,
1407
- rays_per_h=rays_per_h,
1408
- rays_per_v=rays_per_v,
1409
- gain=gain,
1416
+ total_horiz_fov_deg=total_horiz_fov_deg,
1417
+ sensor_side_fov_deg=sensor_side_fov_deg,
1418
+ sensor_center_fov_deg=sensor_center_fov_deg,
1419
+ sensor_rays_horiz=sensor_rays_horiz,
1420
+ sensor_rays_vert=sensor_rays_vert,
1421
+ min_vertical_angle_center=min_vertical_angle_center,
1422
+ max_vertical_angle_center=max_vertical_angle_center,
1423
+ min_vertical_angle_side=min_vertical_angle_side,
1424
+ max_vertical_angle_side=max_vertical_angle_side,
1425
+ gain_center=gain_center,
1426
+ gain_sides=gain_sides,
1410
1427
  hp_corner_hz=hp_corner_hz,
1411
1428
  lp_corner_hz=lp_corner_hz,
1412
1429
  threshold=threshold,
1413
1430
  threshold_scale=threshold_scale,
1414
- hold_time_s=hold_time_s,
1431
+ blind_time_s=blind_time_s,
1432
+ pulse_counter=pulse_counter,
1433
+ window_time_s=window_time_s,
1434
+ count_mode=count_mode,
1415
1435
  lens_transmission=lens_transmission,
1416
1436
  lens_segments_h=lens_segments_h,
1417
- vertical_gain_falloff=vertical_gain_falloff,
1418
- element_fov_overlap_deg=element_fov_overlap_deg,
1419
- element_scatter_gain=element_scatter_gain,
1420
- element_fov_transition_deg=element_fov_transition_deg,
1421
1437
  ambient_temp_c=ambient_temp_c,
1422
1438
  thermal_time_constant_s=thermal_time_constant_s,
1423
1439
  pyro_responsivity=pyro_responsivity,
@@ -1507,6 +1523,31 @@ class Scene(SessionContainer):
1507
1523
 
1508
1524
  set_pir_material(path, emissivity, temperature_c)
1509
1525
 
1526
+ def set_nonvisual_material(
1527
+ self,
1528
+ path: str,
1529
+ base: str,
1530
+ coating: str = "none",
1531
+ attribute: str = "none",
1532
+ ) -> int:
1533
+ """
1534
+ Set non-visual material properties on all Material prims in a subtree.
1535
+
1536
+ These properties define how objects appear to RTX sensors (LiDAR and Radar).
1537
+
1538
+ Example:
1539
+ # Make a person visible to radar/lidar with skin material
1540
+ scene.set_nonvisual_material("/World/person", base="skin")
1541
+
1542
+ :param path: USD path of the root prim to configure.
1543
+ :param base: Base material type.
1544
+ :param coating: Coating type.
1545
+ :param attribute: Material attribute.
1546
+ :return: Number of Material prims modified.
1547
+ """
1548
+
1549
+ return set_nonvisual_material(path, base, coating, attribute)
1550
+
1510
1551
  def _step_physics(self, dt_us: int) -> None:
1511
1552
  """
1512
1553
  Step physics by dt_us.
@@ -13,6 +13,7 @@ from antioch.session.views.ground_plane import GroundPlane
13
13
  from antioch.session.views.imu import Imu
14
14
  from antioch.session.views.joint import Joint
15
15
  from antioch.session.views.light import Light
16
+ from antioch.session.views.material import set_nonvisual_material
16
17
  from antioch.session.views.pir_sensor import PirSensor, set_pir_material
17
18
  from antioch.session.views.radar import Radar
18
19
  from antioch.session.views.rigid_body import RigidBody
@@ -36,5 +37,6 @@ __all__ = [
36
37
  "has_collision",
37
38
  "remove_collision",
38
39
  "set_collision",
40
+ "set_nonvisual_material",
39
41
  "set_pir_material",
40
42
  ]
@@ -0,0 +1,54 @@
1
+ from antioch.session.session import Session
2
+ from common.session.views.material import SetNonVisualMaterial, SetNonVisualMaterialResponse
3
+
4
+
5
+ def set_nonvisual_material(
6
+ path: str,
7
+ base: str,
8
+ coating: str = "none",
9
+ attribute: str = "none",
10
+ ) -> int:
11
+ """
12
+ Set non-visual material properties on all Material prims in a subtree.
13
+
14
+ These properties define how objects appear to RTX sensors (LiDAR and Radar).
15
+
16
+ Valid base materials:
17
+ Metals: aluminum, steel, oxidized_steel, iron, oxidized_iron, silver, brass,
18
+ bronze, oxidized_bronze_patina, tin
19
+ Polymers: plastic, fiberglass, carbon_fiber, vinyl, plexiglass, pvc, nylon, polyester
20
+ Glass: clear_glass, frosted_glass, one_way_mirror, mirror, ceramic_glass
21
+ Other: asphalt, concrete, leaf_grass, dead_leaf_grass, rubber, wood, bark,
22
+ cardboard, paper, fabric, skin, fur_hair, leather, marble, brick,
23
+ stone, gravel, dirt, mud, water, salt_water, snow, ice, calibration_lambertion
24
+ Default: none
25
+
26
+ Valid coatings: none, paint, clearcoat, paint_clearcoat
27
+
28
+ Valid attributes: none, emissive, retroreflective, single_sided, visually_transparent
29
+
30
+ Example:
31
+ # Make a person visible to radar/lidar with skin material
32
+ count = set_nonvisual_material("/World/person", base="skin")
33
+
34
+ # Make a car with aluminum body and paint coating
35
+ count = set_nonvisual_material("/World/car", base="aluminum", coating="paint")
36
+
37
+ :param path: USD path of the root prim to configure.
38
+ :param base: Base material type.
39
+ :param coating: Coating type.
40
+ :param attribute: Material attribute.
41
+ :return: Number of Material prims modified.
42
+ """
43
+
44
+ response = Session.get_current().query_sim_rpc(
45
+ endpoint="set_nonvisual_material",
46
+ payload=SetNonVisualMaterial(
47
+ path=path,
48
+ base=base,
49
+ coating=coating,
50
+ attribute=attribute,
51
+ ),
52
+ response_type=SetNonVisualMaterialResponse,
53
+ )
54
+ return response.materials_modified
@@ -1,6 +1,14 @@
1
1
  from antioch.session.session import Session, SessionContainer
2
2
  from common.message import Pose, RadarScan
3
- from common.session.views.radar import AddRadar, GetRadar, GetRadarResponse, GetRadarScan, RadarConfig
3
+ from common.session.views.radar import (
4
+ AddRadar,
5
+ GetRadar,
6
+ GetRadarResponse,
7
+ GetRadarScan,
8
+ RadarConfig,
9
+ SetRadarDebugMode,
10
+ SetRadarMaterial,
11
+ )
4
12
 
5
13
 
6
14
  class Radar(SessionContainer):
@@ -71,3 +79,53 @@ class Radar(SessionContainer):
71
79
  )
72
80
 
73
81
  return scan
82
+
83
+ def set_debug_mode(self, enabled: bool) -> None:
84
+ """
85
+ Enable or disable debug visualization.
86
+
87
+ :param enabled: Whether to enable debug visualization.
88
+ """
89
+
90
+ self._session.query_sim_rpc(
91
+ endpoint="set_radar_debug_mode",
92
+ payload=SetRadarDebugMode(path=self._path, enabled=enabled),
93
+ )
94
+
95
+
96
+ def set_radar_material(
97
+ path: str,
98
+ reflectivity: float | None = None,
99
+ metallic: float | None = None,
100
+ roughness: float | None = None,
101
+ backscattering: float | None = None,
102
+ cross_section: float | None = None,
103
+ ) -> None:
104
+ """
105
+ Set radar-specific material properties on a prim and all prims in its subtree.
106
+
107
+ These properties define how the prim appears to radar sensors.
108
+
109
+ Example:
110
+ # Make a target highly reflective to radar
111
+ set_radar_material("/World/car", reflectivity=0.9, metallic=1.0)
112
+
113
+ :param path: USD path of the prim to configure.
114
+ :param reflectivity: Radar reflectivity (0-1).
115
+ :param metallic: Metallic property (0-1).
116
+ :param roughness: Surface roughness (0-1).
117
+ :param backscattering: Backscattering coefficient.
118
+ :param cross_section: Radar cross section in dBsm.
119
+ """
120
+
121
+ Session.get_current().query_sim_rpc(
122
+ endpoint="set_radar_material",
123
+ payload=SetRadarMaterial(
124
+ path=path,
125
+ reflectivity=reflectivity,
126
+ metallic=metallic,
127
+ roughness=roughness,
128
+ backscattering=backscattering,
129
+ cross_section=cross_section,
130
+ ),
131
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: antioch-py
3
- Version: 2.0.6
3
+ Version: 2.0.7
4
4
  Summary: The Antioch Python SDK
5
5
  Author-email: Antioch Robotics <support@antioch.dev>
6
6
  License-Expression: MIT
@@ -12,10 +12,10 @@ antioch/session/ark.py,sha256=CF9zaRAZXiVLOkmZpBEaGG4-wydMZ7aUVOnXqnqYZ4U,19096
12
12
  antioch/session/asset.py,sha256=G4wKHVxDkzLEtUap7b7jDF6Y_I4gdHiJ-b756QFBx54,2222
13
13
  antioch/session/error.py,sha256=hEByLcsS8PPpK46prnz1GSWBx0ErGTnSkwBd29FUmWg,1685
14
14
  antioch/session/record.py,sha256=acNeikDeWJFZLovgwbXGHTriqi5-szYjjrnt9s_cdUY,5527
15
- antioch/session/scene.py,sha256=SsbRfmjvJbRm_jXaT8l_fjvJDWR7QH5USDHuEZWBvVg,58536
15
+ antioch/session/scene.py,sha256=gESd-ax_xW7ZKPCUejzZMHYGPO0ouG3Ud_TFsHiMrec,60369
16
16
  antioch/session/session.py,sha256=MxyWAC56SGC6BORzlw8Sxp4s4QBFuxPb7t0kScYDEtM,6626
17
17
  antioch/session/task.py,sha256=ERji5YWU82TL5txBNTLQemJB7Y7xIqS5l76re7MUgvo,11831
18
- antioch/session/views/__init__.py,sha256=81NjZdBs9HZX97Y2nMryfu644icbCLjucnP3_cccfSg,1156
18
+ antioch/session/views/__init__.py,sha256=ida-X6eUhYC0nZ6Bk43yoy2sgKyiPU9Am-N90XG0WgM,1252
19
19
  antioch/session/views/animation.py,sha256=oID0fM3RSU1d3CVA5EiEizKJF18CfNla_1ta7YCQt40,5960
20
20
  antioch/session/views/articulation.py,sha256=0akkhmBJhbJrNmmNwob-S2-t_21Jq9PipTesjYR6wLU,7870
21
21
  antioch/session/views/basis_curve.py,sha256=YMz9pMgj4fLkjhr3QZz8_RBv_HnMN3ZcvLj32WseIlE,5685
@@ -26,15 +26,16 @@ antioch/session/views/ground_plane.py,sha256=oTpGcATB5SirxD1eZUMCeD28eIeDJ6a7E1p
26
26
  antioch/session/views/imu.py,sha256=1EVLRptXSqs4YMJt_wiwXM-B95HzVQmx3MyRblTADMs,1889
27
27
  antioch/session/views/joint.py,sha256=x_clYul4SsCIl0WQAW61w6sS0iDXompvZVEv_2YFG9c,1735
28
28
  antioch/session/views/light.py,sha256=Q9Nn8o0PV9in8Q4eoobsbRxEPhn3xps57K7Z4QmGE8s,4698
29
+ antioch/session/views/material.py,sha256=IfXTj1lJwKWvpz-yj2kELtBbVPAJx_ILVViXUIKKfrI,2071
29
30
  antioch/session/views/pir_sensor.py,sha256=ynEpRz7rwATBAs29QPEcDOuEPxB_jjKnmH05N0KA_FA,4048
30
- antioch/session/views/radar.py,sha256=P8rtNW_c5sgJ-XHMk5VjQ9T8Ot1j-ZPy5EaifC1ujvs,1924
31
+ antioch/session/views/radar.py,sha256=JAmLvhcqqjbD90Og-YeqjfU8gDk-q5IgMCazEgbapxU,3546
31
32
  antioch/session/views/rigid_body.py,sha256=NI-2bFnOLQqClQ3pOhzkggLAhClyKVBXyTmWXgqkZEU,7760
32
33
  antioch/session/views/xform.py,sha256=BELykGHYhdZyHkCY6uakCnmJKwhyiDrCEGy9038GY_Y,3299
33
34
  common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
35
  common/constants.py,sha256=xlgBKdPoiDzAnWkeEsnktMJfXjBP5FTJkM3MGClTnuY,1085
35
36
  common/ark/__init__.py,sha256=Lu2lJ5k7-vN6ZGeX2sYhRwzXEyt9kCyXtgsyvdIaCiU,1472
36
37
  common/ark/ark.py,sha256=rToMvtpu634ylJbEfYlTD13Cb3udF_S4SfI8xQsL1P4,2376
37
- common/ark/hardware.py,sha256=_9CPY_-o5yWgiB8x5pj7dwS8pH0hDCZwyWADCyf32dw,3061
38
+ common/ark/hardware.py,sha256=4A7g_rQO9Ylj5majqJMEgBBWHE8rEjcbAj8yhPBkxiM,2420
38
39
  common/ark/kinematics.py,sha256=G4wzFVyG_awFPJ8SKcZMZCBQkZkF5g6NQg4RhUjAGCs,753
39
40
  common/ark/module.py,sha256=IwkoirFb4dZkfVpn3tjgChRy5S6hVPbrtR9XgJ5UIBI,1922
40
41
  common/ark/node.py,sha256=PWESl7sDdY_Q6aA3CZMRTQ0SONlO9LkUmXhRbUhT8_g,2303
@@ -57,7 +58,7 @@ common/message/image.py,sha256=aF_rU_sOSJQci6g_Wr5Sd16FUFnHm2kgurqWcPPKbaA,5296
57
58
  common/message/imu.py,sha256=mwIu_dK64aixrnz6Hsg8v-vXVKUabLBNbfHe2KqbVPo,328
58
59
  common/message/joint.py,sha256=V9qEILZVaWoAbKGT_V3wvSAvZzoJ7YmrcROkIdzmg5o,1051
59
60
  common/message/log.py,sha256=VN1zCwrUtTPNiyakNjYPZuz3UDMtW19fhD1F1M8MTf8,552
60
- common/message/pir.py,sha256=4HjYg-gefe0PGNNKtmXm4hV8BPKM-boARPkHgXkmTH8,719
61
+ common/message/pir.py,sha256=nSm5dymphomoOZqZAtQeUCowrIginEjVvLwW9NdGNAU,797
61
62
  common/message/point.py,sha256=oryHZEltba1z3GFRyb099oDddmiLE5SM4TKexgtBYaE,2229
62
63
  common/message/point_cloud.py,sha256=e06e6-bGaN8VzwkCy4MltDZocnKP7Bbr14gBlUhXu-A,2035
63
64
  common/message/pose.py,sha256=fcb0-xuIYWaaHHGC_iET9yma1fuicFvXJsaJaLO5XVI,4703
@@ -82,8 +83,9 @@ common/session/views/ground_plane.py,sha256=iHi7bx3qHveh94b88oPz7Yy9cjznc194T6Bx
82
83
  common/session/views/imu.py,sha256=usMm4yeqY_emcTQGjs2hC3Rk-tfen2dp0fIWTDADpxc,1593
83
84
  common/session/views/joint.py,sha256=eP5fLAWqvaQ13xZrNkn79DdRERZMvVrP9emJYZ_J_KA,2098
84
85
  common/session/views/light.py,sha256=IpqkSB6qZCfbe63GAJaPHdy4rJDNki8h-Hm-1kwDwHc,2284
85
- common/session/views/pir_sensor.py,sha256=ykAylA5MK97u_8uyfOYDhoJxdhV023gxn-9EggS3_B8,4936
86
- common/session/views/radar.py,sha256=kM3HcBriE1bQDwgafsRjInQOkEH05IUynJqutSZyT24,2426
86
+ common/session/views/material.py,sha256=QtklOzGZn7nPiMzR7aq9u0nTSkCUlY-rsaPzfv1f9EQ,942
87
+ common/session/views/pir_sensor.py,sha256=HyrV5SU9GEWBL-s9B6AKoR6VhhvPxr7EnEzhSwyECPc,5495
88
+ common/session/views/radar.py,sha256=KTEwFKvEr3f2SrdAhb3iSIKRMKa0PIRXx7-T5hRiDgg,3429
87
89
  common/session/views/rigid_body.py,sha256=19cjU2bZvaFzs8OoNsu4gzZHu97nJMUueBc6Wt0NUWk,4523
88
90
  common/session/views/viewport.py,sha256=tPb1yCFd5nqCapkqSyWCEJ8joEk3fIIfZNr1uAbNAfM,682
89
91
  common/session/views/xform.py,sha256=uxcmtFFGKLF-Jkln1r08CZuyLr7EI8DvdKYuyUFdieM,863
@@ -92,8 +94,8 @@ common/utils/comms.py,sha256=1lpnb9ra5I3xv-Eo0GFZ7nR4TjKseOeDNf9QMWQZbds,17283
92
94
  common/utils/logger.py,sha256=VcZ4dduWut8xWPs-F5ye8RRrNdBehSSG3r1LAWc-IBY,3389
93
95
  common/utils/time.py,sha256=kGDzObbaqWOep4vT1Y2W-BheunxdjYBI4V3Nfp4Ck3Q,790
94
96
  common/utils/usd.py,sha256=to4VPtnamMDIQK-pwDIVfiuzUnNzEImj5szOar1NHiE,253
95
- antioch_py-2.0.6.dist-info/METADATA,sha256=NszvfGjvH5If8-N-J4BfHPsxZfbWH01JFvvHFTKe9Lg,3485
96
- antioch_py-2.0.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
97
- antioch_py-2.0.6.dist-info/entry_points.txt,sha256=1bLTH5BXCOsQkS8k6L_wJ6Nj62j4aoU9Ey_PhWzsRRM,59
98
- antioch_py-2.0.6.dist-info/top_level.txt,sha256=GtzNccsep3YdBt9VXQ7-ZFsFJFffr4hyZvqg0YqRqtw,15
99
- antioch_py-2.0.6.dist-info/RECORD,,
97
+ antioch_py-2.0.7.dist-info/METADATA,sha256=Pbd_ezyxJrXnLGCkcb1RhzJP9PuBnEVBkIUMUhAamSU,3485
98
+ antioch_py-2.0.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
99
+ antioch_py-2.0.7.dist-info/entry_points.txt,sha256=1bLTH5BXCOsQkS8k6L_wJ6Nj62j4aoU9Ey_PhWzsRRM,59
100
+ antioch_py-2.0.7.dist-info/top_level.txt,sha256=GtzNccsep3YdBt9VXQ7-ZFsFJFffr4hyZvqg0YqRqtw,15
101
+ antioch_py-2.0.7.dist-info/RECORD,,
common/ark/hardware.py CHANGED
@@ -1,8 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from enum import Enum
4
+ from typing import Annotated, Literal, Union
4
5
 
5
- from pydantic import Field, ValidationInfo, field_validator
6
+ from pydantic import Field
6
7
 
7
8
  from common.message import Message, Pose
8
9
  from common.session.views.articulation import ArticulationConfig
@@ -29,6 +30,7 @@ class ActuatorGroupHardware(Message):
29
30
  Actuator group hardware that controls multiple joints.
30
31
  """
31
32
 
33
+ type: Literal[HardwareType.ACTUATOR_GROUP] = HardwareType.ACTUATOR_GROUP
32
34
  module: str
33
35
  name: str
34
36
  config: ArticulationConfig
@@ -39,6 +41,7 @@ class ImuHardware(Message):
39
41
  IMU sensor hardware attached to a link.
40
42
  """
41
43
 
44
+ type: Literal[HardwareType.IMU] = HardwareType.IMU
42
45
  module: str
43
46
  name: str
44
47
  path: str
@@ -52,6 +55,7 @@ class PirHardware(Message):
52
55
  PIR (Passive Infrared) sensor hardware attached to a link.
53
56
  """
54
57
 
58
+ type: Literal[HardwareType.PIR] = HardwareType.PIR
55
59
  module: str
56
60
  name: str
57
61
  path: str
@@ -65,6 +69,7 @@ class RadarHardware(Message):
65
69
  Radar sensor hardware attached to a link.
66
70
  """
67
71
 
72
+ type: Literal[HardwareType.RADAR] = HardwareType.RADAR
68
73
  module: str
69
74
  name: str
70
75
  path: str
@@ -80,6 +85,7 @@ class CameraHardware(Message):
80
85
  Used for both RGB and depth cameras - the mode is specified in the config.
81
86
  """
82
87
 
88
+ type: Literal[HardwareType.CAMERA] = HardwareType.CAMERA
83
89
  module: str
84
90
  name: str
85
91
  path: str
@@ -88,34 +94,8 @@ class CameraHardware(Message):
88
94
  config: CameraConfig
89
95
 
90
96
 
91
- class Hardware(Message):
92
- """
93
- Union of all hardware types for an Ark.
94
- """
95
-
96
- type: HardwareType
97
- config: ActuatorGroupHardware | ImuHardware | PirHardware | RadarHardware | CameraHardware
98
-
99
- @field_validator("config", mode="before")
100
- @classmethod
101
- def validate_config(cls, config: dict, info: ValidationInfo):
102
- """
103
- Validate the hardware config based on the type field.
104
- """
105
-
106
- hw_type = info.data.get("type")
107
- if hw_type is None:
108
- raise ValueError("Hardware type is required")
109
- match hw_type:
110
- case HardwareType.ACTUATOR_GROUP:
111
- return ActuatorGroupHardware.model_validate(config)
112
- case HardwareType.IMU:
113
- return ImuHardware.model_validate(config)
114
- case HardwareType.PIR:
115
- return PirHardware.model_validate(config)
116
- case HardwareType.RADAR:
117
- return RadarHardware.model_validate(config)
118
- case HardwareType.CAMERA:
119
- return CameraHardware.model_validate(config)
120
- case _:
121
- raise ValueError(f"Unknown hardware type: {hw_type}")
97
+ # Discriminated union based on the 'type' field
98
+ Hardware = Annotated[
99
+ Union[ActuatorGroupHardware, ImuHardware, PirHardware, RadarHardware, CameraHardware],
100
+ Field(discriminator="type"),
101
+ ]
common/message/pir.py CHANGED
@@ -9,8 +9,10 @@ class PirStatus(Message):
9
9
  """
10
10
 
11
11
  _type = "antioch/pir_status"
12
- is_detected: bool = Field(description="Whether motion is currently detected")
13
- signal_strength: float = Field(description="Current analog signal value after filtering")
14
- threshold: float = Field(description="Current detection threshold")
15
- element_flux: list[float] = Field(default_factory=list, description="Raw accumulated IR flux per element")
16
- element_signal: list[float] = Field(default_factory=list, description="Pyroelectric voltage signal per element (proportional to dT/dt)")
12
+ is_detected: bool = Field(description="Whether motion is currently detected (aggregated across all sensors)")
13
+ signal_strength: float = Field(description="Max absolute signal strength across all sensors")
14
+
15
+ # Multi-sensor status
16
+ sensor_states: list[bool] = Field(default_factory=list, description="Detection state per sensor (Center, Left, Right)")
17
+ sensor_signals: list[float] = Field(default_factory=list, description="Signal strength per sensor")
18
+ sensor_thresholds: list[float] = Field(default_factory=list, description="Detection threshold per sensor")
@@ -0,0 +1,25 @@
1
+ from pydantic import Field
2
+
3
+ from common.message import Message
4
+
5
+
6
+ class SetNonVisualMaterial(Message):
7
+ """
8
+ Set non-visual material properties on all Material prims in a subtree.
9
+
10
+ These properties define how objects appear to RTX sensors (LiDAR and Radar).
11
+ Based on Isaac Sim's isaacsim.sensors.rtx.nonvisual_materials system.
12
+ """
13
+
14
+ path: str = Field(description="USD path of the root prim to configure")
15
+ base: str = Field(description="Base material type (e.g. 'aluminum', 'skin', 'plastic')")
16
+ coating: str = Field(default="none", description="Coating type (e.g. 'none', 'paint', 'clearcoat')")
17
+ attribute: str = Field(default="none", description="Material attribute (e.g. 'none', 'emissive', 'retroreflective')")
18
+
19
+
20
+ class SetNonVisualMaterialResponse(Message):
21
+ """
22
+ Response from setting non-visual material.
23
+ """
24
+
25
+ materials_modified: int = Field(description="Number of Material prims modified")
@@ -13,32 +13,36 @@ class PirSensorConfig(Message):
13
13
 
14
14
  # Core sensor parameters
15
15
  update_rate_hz: float = Field(default=60.0, description="Sensor update frequency in Hz")
16
- max_range: float = Field(default=12.0, description="Maximum detection range in meters")
16
+ max_range: float = Field(default=20.0, description="Maximum detection range in meters")
17
17
 
18
- # Field of view
19
- horiz_fov_deg: float = Field(default=90.0, description="Horizontal field of view in degrees")
20
- vert_fov_deg: float = Field(default=60.0, description="Vertical field of view in degrees")
18
+ # FOV configuration
19
+ total_horiz_fov_deg: float = Field(default=150.0, description="Total horizontal coverage. Enables automatic fanning.")
20
+ sensor_side_fov_deg: float = Field(default=45.0, description="Horizontal FOV for side sensors")
21
+ sensor_center_fov_deg: float = Field(default=45.0, description="Horizontal FOV for center sensor")
21
22
 
22
23
  # Ray configuration
23
- rays_per_h: int = Field(default=128, description="Number of rays in horizontal direction")
24
- rays_per_v: int = Field(default=16, description="Number of rays in vertical direction")
24
+ sensor_rays_horiz: int = Field(default=128, description="Number of rays per sensor in horizontal direction")
25
+ sensor_rays_vert: int = Field(default=16, description="Number of rays per sensor in vertical direction")
25
26
 
26
- # DSP / electronics parameters
27
- gain: float = Field(default=0.01, description="Amplifier gain")
28
- hp_corner_hz: float = Field(default=0.1, description="High-pass filter corner frequency in Hz")
29
- lp_corner_hz: float = Field(default=1.0, description="Low-pass filter corner frequency in Hz")
27
+ # Sensor vertical angle range
28
+ min_vertical_angle_center: float = Field(default=-30.0, description="Minimum vertical angle for center sensor in degrees")
29
+ max_vertical_angle_center: float = Field(default=30.0, description="Maximum vertical angle for center sensor in degrees")
30
+ min_vertical_angle_side: float = Field(default=-30.0, description="Minimum vertical angle for side sensors in degrees")
31
+ max_vertical_angle_side: float = Field(default=30.0, description="Maximum vertical angle for side sensors in degrees")
30
32
 
31
- hold_time_s: float = Field(default=2.0, description="Detection hold time in seconds")
33
+ # DSP / electronics parameters
34
+ gain_center: float = Field(default=0.015, description="Amplifier gain for center sensor")
35
+ gain_sides: float = Field(default=0.01, description="Amplifier gain for side sensors")
36
+ hp_corner_hz: float = Field(default=0.4, description="High-pass filter corner frequency in Hz")
37
+ lp_corner_hz: float = Field(default=10.0, description="Low-pass filter corner frequency in Hz")
38
+ blind_time_s: float = Field(default=0.5, description="Blind time after detection in seconds")
39
+ pulse_counter: int = Field(default=2, description="Number of pulses required to trigger detection (1-4)")
40
+ window_time_s: float = Field(default=2.0, description="Window time for pulse counting in seconds")
41
+ count_mode: int = Field(default=0, description="Pulse counting mode (0: sign change required, 1: any crossing)")
32
42
 
33
43
  # Lens parameters
34
44
  lens_transmission: float = Field(default=0.9, description="Lens transmission coefficient (0-1)")
35
45
  lens_segments_h: int = Field(default=6, description="Number of horizontal lens segments (facets)")
36
- vertical_gain_falloff: float = Field(default=0.5, description="Exponent for elevation-based gain reduction (0=uniform)")
37
-
38
- # Element vignetting parameters (models window blocking effect)
39
- element_fov_overlap_deg: float = Field(default=20.0, description="Half-angle of center region where both elements see well (degrees)")
40
- element_scatter_gain: float = Field(default=0.1, description="Minimum gain for blocked element due to scatter/reflections (0-1)")
41
- element_fov_transition_deg: float = Field(default=15.0, description="Width of soft transition from full gain to scatter gain (degrees)")
42
46
 
43
47
  # Environment parameters
44
48
  ambient_temp_c: float = Field(default=20.0, description="Ambient temperature in Celsius")
@@ -49,8 +53,8 @@ class PirSensorConfig(Message):
49
53
 
50
54
  # Pyroelectric element parameters
51
55
  thermal_time_constant_s: float = Field(default=0.2, description="Element thermal time constant in seconds")
52
- pyro_responsivity: float = Field(default=1.0, description="Pyroelectric responsivity scaling factor")
53
- noise_amplitude: float = Field(default=0.0, description="Thermal/electronic noise amplitude")
56
+ pyro_responsivity: float = Field(default=4000.0, description="Pyroelectric responsivity scaling factor")
57
+ noise_amplitude: float = Field(default=20e-6, description="Thermal/electronic noise amplitude")
54
58
 
55
59
  # Auto-threshold calibration parameters
56
60
  target_delta_t: float = Field(default=10.0, description="Target temperature difference for threshold calibration in Celsius")
@@ -65,6 +65,15 @@ class GetRadarScan(Message):
65
65
  path: str
66
66
 
67
67
 
68
+ class SetRadarDebugMode(Message):
69
+ """
70
+ Enable or disable debug visualization for a radar sensor.
71
+ """
72
+
73
+ path: str
74
+ enabled: bool = Field(description="Whether to enable debug visualization")
75
+
76
+
68
77
  class BufferRadarRead(Message):
69
78
  """
70
79
  Request to buffer current radar scan at simulation time.
@@ -80,3 +89,19 @@ class GetBufferedRadarRead(Message):
80
89
 
81
90
  path: str
82
91
  read_sim_time: float
92
+
93
+
94
+ class SetRadarMaterial(Message):
95
+ """
96
+ Set radar-specific material properties on a prim and all materials in its subtree.
97
+
98
+ These properties define how the prim appears to radar sensors.
99
+ Based on RTX Sensor Non-Visual Materials system.
100
+ """
101
+
102
+ path: str = Field(description="USD path of the prim to configure")
103
+ reflectivity: float | None = Field(default=None, description="Radar reflectivity (0-1)")
104
+ metallic: float | None = Field(default=None, description="Metallic property (0-1)")
105
+ roughness: float | None = Field(default=None, description="Surface roughness (0-1)")
106
+ backscattering: float | None = Field(default=None, description="Backscattering coefficient")
107
+ cross_section: float | None = Field(default=None, description="Radar cross section in dBsm")