antioch-py 2.0.5__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.5/antioch_py.egg-info → antioch_py-2.0.7}/PKG-INFO +1 -1
  2. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/scene.py +88 -26
  3. {antioch_py-2.0.5 → 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.5 → antioch_py-2.0.7}/antioch/session/views/pir_sensor.py +1 -1
  6. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/radar.py +59 -1
  7. {antioch_py-2.0.5 → antioch_py-2.0.7/antioch_py.egg-info}/PKG-INFO +1 -1
  8. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch_py.egg-info/SOURCES.txt +2 -0
  9. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/ark/hardware.py +12 -32
  10. antioch_py-2.0.7/common/message/pir.py +18 -0
  11. antioch_py-2.0.7/common/session/views/material.py +25 -0
  12. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/pir_sensor.py +29 -14
  13. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/radar.py +25 -0
  14. {antioch_py-2.0.5 → antioch_py-2.0.7}/pyproject.toml +1 -1
  15. antioch_py-2.0.5/common/message/pir.py +0 -15
  16. {antioch_py-2.0.5 → antioch_py-2.0.7}/MANIFEST.in +0 -0
  17. {antioch_py-2.0.5 → antioch_py-2.0.7}/README.md +0 -0
  18. {antioch_py-2.0.5 → antioch_py-2.0.7}/README.pypi.md +0 -0
  19. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/__init__.py +0 -0
  20. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/message.py +0 -0
  21. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/module/__init__.py +0 -0
  22. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/module/clock.py +0 -0
  23. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/module/execution.py +0 -0
  24. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/module/input.py +0 -0
  25. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/module/module.py +0 -0
  26. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/module/node.py +0 -0
  27. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/module/token.py +0 -0
  28. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/__init__.py +0 -0
  29. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/ark.py +0 -0
  30. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/asset.py +0 -0
  31. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/error.py +0 -0
  32. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/record.py +0 -0
  33. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/session.py +0 -0
  34. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/task.py +0 -0
  35. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/animation.py +0 -0
  36. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/articulation.py +0 -0
  37. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/basis_curve.py +0 -0
  38. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/camera.py +0 -0
  39. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/collision.py +0 -0
  40. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/geometry.py +0 -0
  41. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/ground_plane.py +0 -0
  42. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/imu.py +0 -0
  43. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/joint.py +0 -0
  44. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/light.py +0 -0
  45. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/rigid_body.py +0 -0
  46. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch/session/views/xform.py +0 -0
  47. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch_py.egg-info/dependency_links.txt +0 -0
  48. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch_py.egg-info/entry_points.txt +0 -0
  49. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch_py.egg-info/requires.txt +0 -0
  50. {antioch_py-2.0.5 → antioch_py-2.0.7}/antioch_py.egg-info/top_level.txt +0 -0
  51. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/__init__.py +0 -0
  52. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/ark/__init__.py +0 -0
  53. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/ark/ark.py +0 -0
  54. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/ark/kinematics.py +0 -0
  55. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/ark/module.py +0 -0
  56. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/ark/node.py +0 -0
  57. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/ark/scheduler.py +0 -0
  58. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/ark/sim.py +0 -0
  59. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/assets/__init__.py +0 -0
  60. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/constants.py +0 -0
  61. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/core/__init__.py +0 -0
  62. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/core/agent.py +0 -0
  63. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/core/auth.py +0 -0
  64. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/core/registry.py +0 -0
  65. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/core/task.py +0 -0
  66. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/__init__.py +0 -0
  67. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/annotation.py +0 -0
  68. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/array.py +0 -0
  69. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/base.py +0 -0
  70. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/camera.py +0 -0
  71. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/color.py +0 -0
  72. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/frame.py +0 -0
  73. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/image.py +0 -0
  74. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/imu.py +0 -0
  75. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/joint.py +0 -0
  76. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/log.py +0 -0
  77. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/point.py +0 -0
  78. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/point_cloud.py +0 -0
  79. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/pose.py +0 -0
  80. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/quaternion.py +0 -0
  81. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/radar.py +0 -0
  82. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/types.py +0 -0
  83. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/message/vector.py +0 -0
  84. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/rome/__init__.py +0 -0
  85. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/rome/client.py +0 -0
  86. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/rome/error.py +0 -0
  87. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/__init__.py +0 -0
  88. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/environment.py +0 -0
  89. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/sim.py +0 -0
  90. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/__init__.py +0 -0
  91. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/animation.py +0 -0
  92. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/articulation.py +0 -0
  93. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/basis_curve.py +0 -0
  94. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/camera.py +0 -0
  95. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/collision.py +0 -0
  96. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/geometry.py +0 -0
  97. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/ground_plane.py +0 -0
  98. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/imu.py +0 -0
  99. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/joint.py +0 -0
  100. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/light.py +0 -0
  101. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/rigid_body.py +0 -0
  102. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/viewport.py +0 -0
  103. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/session/views/xform.py +0 -0
  104. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/utils/__init__.py +0 -0
  105. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/utils/comms.py +0 -0
  106. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/utils/logger.py +0 -0
  107. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/utils/time.py +0 -0
  108. {antioch_py-2.0.5 → antioch_py-2.0.7}/common/utils/usd.py +0 -0
  109. {antioch_py-2.0.5 → 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.5
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,25 +1331,37 @@ 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
- num_elements: int = 2,
1338
- rays_per_h: int = 64,
1339
- rays_per_v: int = 16,
1340
- gain: float = 0.01,
1341
- hp_corner_hz: float = 0.1,
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,
1342
1348
  lp_corner_hz: float = 10.0,
1343
1349
  threshold: float | None = None,
1344
1350
  threshold_scale: float = 1.0,
1345
- 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,
1346
1355
  lens_transmission: float = 0.9,
1347
- lens_segments_h: int = 8,
1356
+ lens_segments_h: int = 6,
1348
1357
  ambient_temp_c: float = 20.0,
1358
+ thermal_time_constant_s: float = 0.2,
1359
+ pyro_responsivity: float = 4000.0,
1360
+ noise_amplitude: float = 20e-6,
1349
1361
  target_delta_t: float = 10.0,
1350
1362
  target_distance: float = 5.0,
1351
1363
  target_emissivity: float = 0.98,
1364
+ target_velocity_mps: float = 1.0,
1352
1365
  world_pose: Pose | dict | None = None,
1353
1366
  local_pose: Pose | dict | None = None,
1354
1367
  ) -> PirSensor:
@@ -1362,23 +1375,35 @@ class Scene(SessionContainer):
1362
1375
  :param config: Optional PIR sensor configuration (alternative to individual parameters).
1363
1376
  :param update_rate_hz: Sensor update frequency in Hz.
1364
1377
  :param max_range: Maximum detection range in meters.
1365
- :param horiz_fov_deg: Horizontal field of view in degrees.
1366
- :param vert_fov_deg: Vertical field of view in degrees.
1367
- :param num_elements: Number of sensing elements (typically 2).
1368
- :param rays_per_h: Number of rays in horizontal direction.
1369
- :param rays_per_v: Number of rays in vertical direction.
1370
- :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.
1371
1389
  :param hp_corner_hz: High-pass filter corner frequency in Hz.
1372
1390
  :param lp_corner_hz: Low-pass filter corner frequency in Hz.
1373
1391
  :param threshold: Detection threshold (auto-calibrated if None).
1374
1392
  :param threshold_scale: Scale factor applied to auto-calibrated threshold.
1375
- :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).
1376
1397
  :param lens_transmission: Lens transmission coefficient (0-1).
1377
- :param lens_segments_h: Number of horizontal lens segments for interleaved pattern.
1398
+ :param lens_segments_h: Number of horizontal lens segments (facets).
1378
1399
  :param ambient_temp_c: Ambient temperature in Celsius.
1400
+ :param thermal_time_constant_s: Pyroelectric element thermal time constant in seconds.
1401
+ :param pyro_responsivity: Pyroelectric responsivity scaling factor.
1402
+ :param noise_amplitude: Thermal/electronic noise amplitude.
1379
1403
  :param target_delta_t: Target temperature difference for threshold calibration in Celsius.
1380
1404
  :param target_distance: Target distance for threshold calibration in meters.
1381
1405
  :param target_emissivity: Target emissivity for threshold calibration.
1406
+ :param target_velocity_mps: Target velocity for threshold calibration in m/s.
1382
1407
  :param world_pose: Optional world pose.
1383
1408
  :param local_pose: Optional local pose.
1384
1409
  :return: The PIR sensor instance.
@@ -1388,23 +1413,35 @@ class Scene(SessionContainer):
1388
1413
  config = PirSensorConfig(
1389
1414
  update_rate_hz=update_rate_hz,
1390
1415
  max_range=max_range,
1391
- horiz_fov_deg=horiz_fov_deg,
1392
- vert_fov_deg=vert_fov_deg,
1393
- num_elements=num_elements,
1394
- rays_per_h=rays_per_h,
1395
- rays_per_v=rays_per_v,
1396
- 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,
1397
1427
  hp_corner_hz=hp_corner_hz,
1398
1428
  lp_corner_hz=lp_corner_hz,
1399
1429
  threshold=threshold,
1400
1430
  threshold_scale=threshold_scale,
1401
- 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,
1402
1435
  lens_transmission=lens_transmission,
1403
1436
  lens_segments_h=lens_segments_h,
1404
1437
  ambient_temp_c=ambient_temp_c,
1438
+ thermal_time_constant_s=thermal_time_constant_s,
1439
+ pyro_responsivity=pyro_responsivity,
1440
+ noise_amplitude=noise_amplitude,
1405
1441
  target_delta_t=target_delta_t,
1406
1442
  target_distance=target_distance,
1407
1443
  target_emissivity=target_emissivity,
1444
+ target_velocity_mps=target_velocity_mps,
1408
1445
  )
1409
1446
 
1410
1447
  return PirSensor.add(
@@ -1486,6 +1523,31 @@ class Scene(SessionContainer):
1486
1523
 
1487
1524
  set_pir_material(path, emissivity, temperature_c)
1488
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
+
1489
1551
  def _step_physics(self, dt_us: int) -> None:
1490
1552
  """
1491
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
@@ -81,7 +81,7 @@ class PirSensor(SessionContainer):
81
81
  """
82
82
  Get current detection status.
83
83
 
84
- :return: Detection status with is_detected, signal_strength, threshold, and element_power.
84
+ :return: Detection status with is_detected, signal_strength, threshold, element_flux, and element_signal.
85
85
  """
86
86
 
87
87
  status = self._session.query_sim_rpc(
@@ -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.5
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")
@@ -12,28 +12,37 @@ class PirSensorConfig(Message):
12
12
  """
13
13
 
14
14
  # Core sensor parameters
15
- update_rate_hz: float = Field(default=10.0, description="Sensor update frequency in Hz")
16
- max_range: float = Field(default=12.0, description="Maximum detection range in meters")
15
+ update_rate_hz: float = Field(default=60.0, description="Sensor update frequency in Hz")
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
- # Sensing elements
23
- num_elements: int = Field(default=2, description="Number of sensing elements (typically 2)")
24
- rays_per_h: int = Field(default=64, description="Number of rays in horizontal direction")
25
- rays_per_v: int = Field(default=16, description="Number of rays in vertical direction")
23
+ # Ray configuration
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")
26
+
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")
26
32
 
27
33
  # DSP / electronics parameters
28
- gain: float = Field(default=0.01, description="Amplifier gain")
29
- hp_corner_hz: float = Field(default=0.1, description="High-pass filter corner frequency in Hz")
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")
30
37
  lp_corner_hz: float = Field(default=10.0, description="Low-pass filter corner frequency in Hz")
31
-
32
- hold_time_s: float = Field(default=2.0, description="Detection hold time in seconds")
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)")
33
42
 
34
43
  # Lens parameters
35
44
  lens_transmission: float = Field(default=0.9, description="Lens transmission coefficient (0-1)")
36
- lens_segments_h: int = Field(default=8, description="Number of horizontal lens segments for interleaved pattern")
45
+ lens_segments_h: int = Field(default=6, description="Number of horizontal lens segments (facets)")
37
46
 
38
47
  # Environment parameters
39
48
  ambient_temp_c: float = Field(default=20.0, description="Ambient temperature in Celsius")
@@ -42,10 +51,16 @@ class PirSensorConfig(Message):
42
51
  threshold: float | None = Field(default=None, description="Detection threshold (auto-calibrated if None)")
43
52
  threshold_scale: float = Field(default=1.0, description="Scale factor applied to auto-calibrated threshold")
44
53
 
54
+ # Pyroelectric element parameters
55
+ thermal_time_constant_s: float = Field(default=0.2, description="Element thermal time constant in seconds")
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")
58
+
45
59
  # Auto-threshold calibration parameters
46
60
  target_delta_t: float = Field(default=10.0, description="Target temperature difference for threshold calibration in Celsius")
47
61
  target_distance: float = Field(default=5.0, description="Target distance for threshold calibration in meters")
48
62
  target_emissivity: float = Field(default=0.98, description="Target emissivity for threshold calibration")
63
+ target_velocity_mps: float = Field(default=1.0, description="Target velocity for threshold calibration in m/s")
49
64
 
50
65
 
51
66
  class GetPirSensor(Message):
@@ -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.5"
3
+ version = "2.0.7"
4
4
  description = "The Antioch Python SDK"
5
5
  readme = "README.pypi.md"
6
6
  license = "MIT"
@@ -1,15 +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_power: list[float] = Field(default_factory=list, description="Power received on each sensing element")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes