Same pose stream, new safety axis: musculoskeletal-load prevention. This is an honest 2D reduction of REBA - band exposure TIME, not a precise REBA score. Edge: - geometry: arm_elevation_deg (shoulder->elbow vs vertical-down, best of both arms) and knee_flexion_deg (hip-knee-ankle interior angle, worst of both legs). Both return None when no confident side exists - "unmeasurable" must never read as "0 deg / straight". - detectors/ergonomics.py: per-frame dt accumulation into bands (trunk 20-60 and 60+ deg via the existing torso angle, arm 90+ deg, knee <110 deg), gated on confident core keypoints; detection gaps are dt-capped (2s) so a dropout never counts as exposure. Hourly per-camera report, skipped when nothing was observed (an empty-workshop report is noise). - Engine: tracks in an incident state (FALLING/FALLEN/NO_MOTION) are excluded - a fallen worker's 90-deg trunk is an incident, not an ergonomic exposure. The report event (ergo_report/INFO) carries no track_id and no spatial: a camera-level anonymous aggregate, per the PIPA-first product stance. - run_once: NO snapshots on ergo_report (a frame would turn a statistic into surveillance imagery); capture is skipped entirely when only ergo fired. Server/UI: ergo_report accepted (validator + chk_events_type, edited in the still-undeployed heatmap migration); detail view now renders event metrics with Korean labels and seconds humanized - the ergo report's whole value IS its metrics. Korean type label in list + detail. Verified: pytest 232 pass (10 new) / PHPUnit 135 pass. NOTE: the detail-view visual check is pending - the Chrome extension disconnected mid-verification; harness is staged under the session scratchpad (events/1/view).
14 lines
810 B
SQL
14 lines
810 B
SQL
-- Heatmap raw material: normalized (0..1) spatial point per event, and the five new
|
|
-- event types (occupancy rules + near-miss + ergo report). The chk_events_type constraint
|
|
-- would REJECT the new types' inserts on MySQL 8.0.16+ without this. (Never applied to any
|
|
-- deployment before this revision, so the type list is edited in place.)
|
|
ALTER TABLE move_events
|
|
ADD COLUMN spatial_x DOUBLE NULL AFTER metrics_json,
|
|
ADD COLUMN spatial_y DOUBLE NULL AFTER spatial_x;
|
|
|
|
ALTER TABLE move_events DROP CHECK chk_events_type;
|
|
ALTER TABLE move_events ADD CONSTRAINT chk_events_type CHECK (event_type IN (
|
|
'fall','no_motion','immobility','ghost','zone_warning',
|
|
'zone_restricted','pinch','monitoring_degraded','device_fault',
|
|
'lone_worker','overcapacity','overstay','near_fall','ergo_report'
|
|
));
|