Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ __pycache__/
.pytest_cache/
.ruff_cache/
.mypy_cache/
.cache/
.coverage
htmlcov/
build/
Expand All @@ -13,7 +14,14 @@ ros2_ws/log/
dist/
*.egg-info/
outputs/
artifacts/
log/
.radcounter/
*.log
runtime/llm/bin/*/
runtime/llm/models/*.gguf
runtime/llm/logs/
!runtime/llm/bin/.gitkeep
!runtime/llm/models/.gitkeep
.idea/
.vscode/
19 changes: 19 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# RadCounterSim repository instructions

## Surface sources and decontamination

- Before creating or modifying a surface/planar source, its visualization, or a
decontamination workflow, read and follow
`docs/decontamination-authoring-rules.md`.
- The August 6, 2026 irregular-source and wall-decontamination videos named in
that document are the canonical behavior and appearance references. Do not
substitute a tidy framed panel, a uniformly filled rectangle, or a small set
of hand-arranged polygons.
- A change to surface-source generation or decontamination behavior is incomplete
unless the implementation, regression tests, and
`docs/decontamination-authoring-rules.md` are updated together. If behavior is
intentionally unchanged, the rule document need not be edited, but the change
must retain its invariants and tests.
- Validation must operate on the same irregular activity-bearing geometry shown
to the user. Never decontaminate a hidden regular proxy while displaying an
unrelated irregular overlay.
71 changes: 71 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,22 @@ and shared by rendering, PhysX collision, and Embree attenuation. Proprietary
formats can use a no-shell external converter or an importer plugin. See
`docs/environment-import.md`; CAD tessellation uses the `cad` uv group.

Complete runtime compositions are selected independently from a system catalog:

```bash
uv run radcounter-system list
uv run radcounter-system activate --profile fukushima-packbot
radcounter-app
uv run radcounter-system activate --profile vertical-slice
```

The Operations window exposes the same catalog as ordinary preset,
environment, robot, and detector selectors, so no command or file path is
required for normal switching. The LLM instruction area remains a separate
robot-task control. The Fukushima Daiichi profile fetches the pinned CC BY 4.0
SolidWorks source and converts it directly to USD on Linux with Isaac Sim's
bundled HOOPS converter; see `docs/system-profiles.md`.

The experiment command writes the required manifest, resolved configuration,
JSONL events, Parquet tables, metrics, NPZ maps, snapshots directory, and HTML
report under `outputs/<scenario>/<timestamp>_<run_id>/`.
Expand All @@ -62,6 +78,61 @@ Isaac Sim requires the user to review and accept NVIDIA's Omniverse EULA. The
launch script never accepts it implicitly. After acceptance, launch with
`OMNI_KIT_ACCEPT_EULA=YES ./scripts/run_isaac.sh`.

## Articulated GUI workflow

The GUI workflow loads NVIDIA's Clearpath Ridgeback + Franka Panda and Nova
Carter assets. It drives real articulation and wheel joints, solves the
seven-axis arm with Lula IK, closes the physical gripper before attaching a
payload constraint, and performs contact-driven decontamination. Shield
placement/correction, contaminated-drum relocation/disposal, and obstacle
relocation all use the same base-arm-gripper sequence; operation-time USD pose
teleports are prohibited.

```bash
export OMNI_KIT_ACCEPT_EULA=YES RADCOUNTER_HOST_ENV_NO_ROS=1
source scripts/host_env.sh
uv run --project "$RADCOUNTER_ISAAC_ROOT" --locked python scripts/run_gui.py
```

Use `--headless --no-keep-open --phase-hold-s 0` for a noninteractive gate. The
complete public audit is written to `artifacts/gui-validation/latest.json`.
The visible GUI is capped at 60 FPS by default to avoid consuming a full GPU
while idle. Override it with `--max-fps 30`, or use `--max-fps 0` to remove the
cap.

The viewport keeps one active robot explicit in a top status bar and provides
one-click follow/onboard views, a 12 FPS building overview, through-wall robot
beacons, routes, targets, measurement locations, and contact-derived
decontamination progress. Only the main viewport is rendered; selecting an
onboard view switches that viewport instead of rendering every robot camera.
See `docs/robot-monitoring.md`.

## Local natural-language application

The interactive application accepts English instructions, maps
them to a strict allowlist, previews physical operations, and executes them
through the existing workflow boundary. Release builds own a bundled
`llama.cpp` sidecar and an official Qwen3-4B GGUF model; users do not install
Ollama, PyTorch, or a Python inference SDK.

Complex instructions can sequence up to 24 logical steps, tour every feasible
measurement station, run bounded multi-pass irregular-surface decontamination
against public removal/remaining/coverage conditions, and place then reposition
physical shield panels at host-derived source-line fractions. Every physical
attempt is revalidated against the live scene and remains confirmation-gated.

```bash
./scripts/build_llama_runtime.sh
uv run python scripts/fetch_llm_model.py
OMNI_KIT_ACCEPT_EULA=YES ./scripts/run_app.sh
```

Isaac Sim remains a user-installed prerequisite and is never redistributed by
the OSS package. After initial setup, `radcounter-app` or the optional desktop
entry launches the simulator and private local model as one application. See
`docs/natural-language-control.md` for runtime layout, safety policy, hardware
fallbacks, and packaging details.

## Safety boundary

Estimator and planner APIs accept `BeliefState` and public observations only.
Expand Down
30 changes: 30 additions & 0 deletions THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,35 @@ this repository unless a file explicitly states otherwise.
- Python packages resolved by `uv.lock`: governed by each package's metadata
and license files.

## Optional packaged local-inference components

Release packages may include these independently licensed components under
`runtime/llm`. They are not stored in this Git repository.

- llama.cpp, including `llama-server`: MIT License,
https://github.com/ggml-org/llama.cpp
- Qwen3-4B and its official GGUF quantization: Apache License 2.0,
https://huggingface.co/Qwen/Qwen3-4B-GGUF

The release packaging process pins and verifies both inputs. Their copyright,
license, and notice files must accompany redistributed binaries and models.

## Optional Fukushima Daiichi CAD environment

The system catalog can fetch and import the independently distributed
`Qualot/fukushima_daiichi_solidworks` generic Fukushima Daiichi CAD model.
Neither its SolidWorks source nor derived USD assets are stored in this Git
repository.

- Project: https://github.com/Qualot/fukushima_daiichi_solidworks
- Pinned integration revision: `f6541deb6159c5d908a4f028d021e3d2c9f7f8e8`
- License: Creative Commons Attribution 4.0 International (CC BY 4.0)
- Attribution: Qualot/fukushima_daiichi_solidworks contributors

The fetch and Linux conversion scripts preserve source revision, license,
attribution, converter metadata, and SHA-256 provenance. Anyone redistributing
a derived USD, render, or other adaptation is responsible for retaining the CC BY 4.0
attribution and indicating modifications.

Users are responsible for reviewing and accepting the terms of external
software before installing or running it.
28 changes: 28 additions & 0 deletions configs/environment-converters/solidworks_to_usd.hoops.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"accurateSurfaceCurvatures": true,
"accurateTessellation": false,
"compositionStyle": 0,
"convertCurves": false,
"convertHidden": false,
"convertMetadata": true,
"convertPhysicsData": false,
"dedup": true,
"dMetersPerUnit": 0.0,
"filterStyle": 1,
"globalXforms": false,
"iUpAxis": 0,
"instancing": false,
"instancingStyle": 0,
"materialType": 1,
"omitHiddenOnLoad": true,
"physicsAccuracyLevel": 0.99,
"physicsUseGeometryOnRiBRep": false,
"reportProgress": true,
"reportProgressFreq": 4,
"sOptimizeConfig": "",
"tessLOD": 2,
"upAxis": 0,
"useMaterials": true,
"useNormals": true,
"viewLayerName": ""
}
39 changes: 39 additions & 0 deletions configs/environments/fukushima_daiichi_solidworks.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
schema_version: "1.0"
environment:
environment_id: fukushima-daiichi-generic-cad
uri: ../../.cache/external/fukushima_daiichi_solidworks/export/Building.usdc
format: usd
coordinate_system:
units: auto
# The SolidWorks-exported USD declares Y-up; let the importer read and
# normalize that metadata instead of relabelling the geometry as Z-up.
up_axis: auto
forward_axis: +X
handedness: right
scale: 1.0
# Put the authored -18 m lower operating floor at simulator Z=0 and keep
# the open CAD cut face next to the catalog's robot/work-surface anchors.
translation_world_m: [2.2, 0.0, 18.0]
rotation_world_rpy_deg: [0.0, 0.0, 0.0]
default_material_id: steel
material_rules:
- pattern: "*Building*"
material_id: concrete
- pattern: "*Structure*"
material_id: steel
- pattern: "*PCV*"
material_id: steel
- pattern: "*RPV*"
material_id: steel
- pattern: "*Pedestal*"
material_id: concrete
collision:
enabled: true
geometry_source: auto
approximation: triangle_mesh
show_collision_geometry: false
max_triangles: 8000000
cad_mesh_size_m: 0.10
cache_directory: ~/.cache/radcountersim/environments
streaming:
enabled: false
28 changes: 14 additions & 14 deletions configs/robots/countermeasure_robot.yaml
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
robot_id: countermeasure-robot-1
reference_model_id: mhi-meister
manufacturer: Mitsubishi Heavy Industries
model: MEISTeR
geometry_fidelity: reference_procedural
source: https://www.mhi.com/business/products-services/energy-environment/nuclear-power-generation/robot-mechatronics/meister
controller: mhi_meister_dual_arm_crawler
asset: assets/robots/mhi_meister.xacro
reference_model_id: clearpath-ridgeback-franka
manufacturer: Clearpath Robotics / Franka Robotics
model: Ridgeback + Franka Emika Panda
geometry_fidelity: manufacturer_asset
source: https://docs.isaacsim.omniverse.nvidia.com/latest/assets/usd_assets_robots.html
controller: ridgeback_franka_lula_ik
asset: /Isaac/Robots/Clearpath/RidgebackFranka/ridgeback_franka.usd
articulation_root: /World/CountermeasureRobot
base_dofs: 7
arm_dofs: 14
gripper_dofs: 4
end_effector_frames: [left_tool0, right_tool0]
decon_tool_path: /World/CountermeasureRobot/right_tool0
maximum_payload_kg_per_arm: 15.0
capabilities: [place_shield, move_object, remove_object, cut_obstacle, core_sample, suction_decontaminate, abrasive_blast_decontaminate]
base_dofs: 3
arm_dofs: 7
gripper_dofs: 2
end_effector_frames: [right_gripper, panda_hand]
decon_tool_path: /World/CountermeasureRobot/panda_hand/RadCounterDeconTool/ContactPad
maximum_payload_kg_per_arm: 3.0
capabilities: [place_shield, move_shield, move_object, remove_object, contact_decontaminate]
34 changes: 34 additions & 0 deletions configs/robots/fukushima_packbot_fleet.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
schema_version: 1
robots:
- id: packbot
uri: ../../assets/robots/packbot_fukushima.urdf
format: urdf
prim_path: /World/Robots/PackBot
robot_type: wheeled
fixed_base: false
collision_from_visuals: false
collision_type: Convex Hull
translation_m: [2.0, -1.0, 0.0]
reference:
model_id: irobot-packbot-fukushima
manufacturer: iRobot
model: PackBot, Fukushima Daiichi deployment configuration
source_urls:
- https://www.tepco.co.jp/en/nu/fukushima-np/f1-roadmap/images/11042801a-e.pdf
geometry_fidelity: reference_procedural
dimensions_m: [0.70, 0.53, 0.18]
mass_kg: 35.0
joint_groups:
- name: flippers
joint_names: [left_flipper_joint, right_flipper_joint]
mode: position
- name: sensor_head
joint_names: [mast_pan_joint, camera_tilt_joint]
mode: position
base_controller:
type: differential
joint_names: [left_track_joint, right_track_joint]
wheel_radius_m: 0.08
track_width_m: 0.41
maximum_linear_speed_m_s: 2.58
maximum_angular_speed_rad_s: 2.0
28 changes: 14 additions & 14 deletions configs/robots/measurement_robot.yaml
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
robot_id: measurement-robot-1
reference_model_id: irobot-packbot-fukushima
manufacturer: iRobot
model: PackBot, Fukushima Daiichi deployment configuration
geometry_fidelity: reference_procedural
source: https://www.tepco.co.jp/en/nu/fukushima-np/f1-roadmap/images/11042801a-e.pdf
controller: packbot_differential_crawler
asset: assets/robots/packbot_fukushima.urdf
articulation_root: /World/MeasurementRobot/base_link
wheel_dof_names: [left_track_joint, right_track_joint]
flipper_dof_names: [left_flipper_joint, right_flipper_joint]
wheel_radius_m: 0.08
wheel_base_m: 0.41
reference_model_id: nvidia-nova-carter
manufacturer: NVIDIA
model: Nova Carter
geometry_fidelity: manufacturer_asset
source: https://docs.isaacsim.omniverse.nvidia.com/latest/assets/usd_assets_robots.html
controller: nova_carter_differential_wheels
asset: /Isaac/Robots/NVIDIA/NovaCarter/nova_carter.usd
articulation_root: /World/MeasurementRobot/chassis_link
wheel_dof_names: [joint_wheel_left, joint_wheel_right]
flipper_dof_names: []
wheel_radius_m: 0.14
wheel_base_m: 0.413
detector_id: omni-1
detector_path: /World/MeasurementRobot/radiation_link/Detector
detector_extrinsic_xyz_m: [0.03, 0.16, 0.41]
detector_path: /World/MeasurementRobot/chassis_link/Detector
detector_extrinsic_xyz_m: [0.0, 0.0, 0.72]
Loading
Loading