antioch-py 2.0.6__tar.gz → 2.0.7__tar.gz

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.

Potentially problematic release.


This version of antioch-py might be problematic. Click here for more details.

Files changed (109) hide show
  1. {antioch_py-2.0.6/antioch_py.egg-info → antioch_py-2.0.7}/PKG-INFO +1 -1
  2. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/scene.py +78 -37
  3. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/__init__.py +2 -0
  4. antioch_py-2.0.7/antioch/session/views/material.py +54 -0
  5. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/radar.py +59 -1
  6. {antioch_py-2.0.6 → antioch_py-2.0.7/antioch_py.egg-info}/PKG-INFO +1 -1
  7. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch_py.egg-info/SOURCES.txt +2 -0
  8. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/ark/hardware.py +12 -32
  9. antioch_py-2.0.7/common/message/pir.py +18 -0
  10. antioch_py-2.0.7/common/session/views/material.py +25 -0
  11. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/pir_sensor.py +23 -19
  12. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/radar.py +25 -0
  13. {antioch_py-2.0.6 → antioch_py-2.0.7}/pyproject.toml +1 -1
  14. antioch_py-2.0.6/common/message/pir.py +0 -16
  15. {antioch_py-2.0.6 → antioch_py-2.0.7}/MANIFEST.in +0 -0
  16. {antioch_py-2.0.6 → antioch_py-2.0.7}/README.md +0 -0
  17. {antioch_py-2.0.6 → antioch_py-2.0.7}/README.pypi.md +0 -0
  18. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/__init__.py +0 -0
  19. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/message.py +0 -0
  20. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/module/__init__.py +0 -0
  21. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/module/clock.py +0 -0
  22. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/module/execution.py +0 -0
  23. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/module/input.py +0 -0
  24. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/module/module.py +0 -0
  25. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/module/node.py +0 -0
  26. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/module/token.py +0 -0
  27. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/__init__.py +0 -0
  28. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/ark.py +0 -0
  29. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/asset.py +0 -0
  30. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/error.py +0 -0
  31. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/record.py +0 -0
  32. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/session.py +0 -0
  33. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/task.py +0 -0
  34. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/animation.py +0 -0
  35. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/articulation.py +0 -0
  36. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/basis_curve.py +0 -0
  37. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/camera.py +0 -0
  38. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/collision.py +0 -0
  39. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/geometry.py +0 -0
  40. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/ground_plane.py +0 -0
  41. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/imu.py +0 -0
  42. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/joint.py +0 -0
  43. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/light.py +0 -0
  44. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/pir_sensor.py +0 -0
  45. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/rigid_body.py +0 -0
  46. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch/session/views/xform.py +0 -0
  47. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch_py.egg-info/dependency_links.txt +0 -0
  48. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch_py.egg-info/entry_points.txt +0 -0
  49. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch_py.egg-info/requires.txt +0 -0
  50. {antioch_py-2.0.6 → antioch_py-2.0.7}/antioch_py.egg-info/top_level.txt +0 -0
  51. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/__init__.py +0 -0
  52. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/ark/__init__.py +0 -0
  53. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/ark/ark.py +0 -0
  54. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/ark/kinematics.py +0 -0
  55. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/ark/module.py +0 -0
  56. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/ark/node.py +0 -0
  57. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/ark/scheduler.py +0 -0
  58. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/ark/sim.py +0 -0
  59. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/assets/__init__.py +0 -0
  60. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/constants.py +0 -0
  61. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/core/__init__.py +0 -0
  62. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/core/agent.py +0 -0
  63. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/core/auth.py +0 -0
  64. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/core/registry.py +0 -0
  65. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/core/task.py +0 -0
  66. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/__init__.py +0 -0
  67. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/annotation.py +0 -0
  68. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/array.py +0 -0
  69. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/base.py +0 -0
  70. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/camera.py +0 -0
  71. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/color.py +0 -0
  72. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/frame.py +0 -0
  73. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/image.py +0 -0
  74. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/imu.py +0 -0
  75. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/joint.py +0 -0
  76. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/log.py +0 -0
  77. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/point.py +0 -0
  78. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/point_cloud.py +0 -0
  79. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/pose.py +0 -0
  80. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/quaternion.py +0 -0
  81. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/radar.py +0 -0
  82. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/types.py +0 -0
  83. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/message/vector.py +0 -0
  84. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/rome/__init__.py +0 -0
  85. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/rome/client.py +0 -0
  86. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/rome/error.py +0 -0
  87. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/__init__.py +0 -0
  88. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/environment.py +0 -0
  89. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/sim.py +0 -0
  90. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/__init__.py +0 -0
  91. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/animation.py +0 -0
  92. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/articulation.py +0 -0
  93. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/basis_curve.py +0 -0
  94. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/camera.py +0 -0
  95. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/collision.py +0 -0
  96. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/geometry.py +0 -0
  97. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/ground_plane.py +0 -0
  98. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/imu.py +0 -0
  99. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/joint.py +0 -0
  100. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/light.py +0 -0
  101. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/rigid_body.py +0 -0
  102. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/viewport.py +0 -0
  103. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/session/views/xform.py +0 -0
  104. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/utils/__init__.py +0 -0
  105. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/utils/comms.py +0 -0
  106. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/utils/logger.py +0 -0
  107. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/utils/time.py +0 -0
  108. {antioch_py-2.0.6 → antioch_py-2.0.7}/common/utils/usd.py +0 -0
  109. {antioch_py-2.0.6 → antioch_py-2.0.7}/setup.cfg +0 -0
@@ -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
@@ -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
@@ -30,6 +30,7 @@ antioch/session/views/ground_plane.py
30
30
  antioch/session/views/imu.py
31
31
  antioch/session/views/joint.py
32
32
  antioch/session/views/light.py
33
+ antioch/session/views/material.py
33
34
  antioch/session/views/pir_sensor.py
34
35
  antioch/session/views/radar.py
35
36
  antioch/session/views/rigid_body.py
@@ -92,6 +93,7 @@ common/session/views/ground_plane.py
92
93
  common/session/views/imu.py
93
94
  common/session/views/joint.py
94
95
  common/session/views/light.py
96
+ common/session/views/material.py
95
97
  common/session/views/pir_sensor.py
96
98
  common/session/views/radar.py
97
99
  common/session/views/rigid_body.py
@@ -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
+ ]
@@ -0,0 +1,18 @@
1
+ from pydantic import Field
2
+
3
+ from common.message.base import Message
4
+
5
+
6
+ class PirStatus(Message):
7
+ """
8
+ PIR sensor status containing detection state and signal information.
9
+ """
10
+
11
+ _type = "antioch/pir_status"
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")
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "antioch-py"
3
- version = "2.0.6"
3
+ version = "2.0.7"
4
4
  description = "The Antioch Python SDK"
5
5
  readme = "README.pypi.md"
6
6
  license = "MIT"
@@ -1,16 +0,0 @@
1
- from pydantic import Field
2
-
3
- from common.message.base import Message
4
-
5
-
6
- class PirStatus(Message):
7
- """
8
- PIR sensor status containing detection state and signal information.
9
- """
10
-
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)")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes