Quick Deployment
This page runs the forklift safety function
on the VSS Warehouse 2D demo dataset (cameras Camera, Camera_01 and Camera_02). The Safety
Core runs in one Docker container, nv-psf, on the same host as AI Perception: the SEI daemon, the
NvPSD Gateway, the MDX client, SAIM, PCM and the decision maker atl_sdm. The command receiver
runs on the host. The commands are the same on x86-64 and IGX Thor, except <gpu-options>.
Complete Prerequisites first. You need two terminals on the host.
Placeholders
Steps
-
Install the Debian package. It provides the command receiver, which runs on the host, the decision maker configuration template, and the baseline directories that you mount into the container.
Expected: the last command prints
0. -
Copy the decision maker configuration. The Debian package installs the forklift safety function’s event binding as a template,
/opt/nvidia/psf/bin/atl_sdm_zone1.conf.sample. Its bindings match the demo dataset. The SEI daemon configuration needs no copy: the container uses its own/opt/nvidia/psf/bin/nvpss.conf, which requires both AI monitors.Expected:
6, one line for each binding. -
Write the camera file for this host. VST gives each camera a stream URL that changes whenever VSS is redeployed. This command reads the current URLs from VST and writes
~/hoisa-demo/sensor_config.conf.Expected: four lines, for example:
-
Check that each camera stream plays. VST can list a camera as online while its stream does not play, and the Safety AI Monitor (SAIM) needs every stream.
Expected: three lines, each
h264. -
Prepare the log files. You mount the host directory
/var/log/psfinto the container, so the logs stay on the host. The processes in the container run as the container usernvidia, which can write to these files but cannot create new files in the directory.Expected: four lines, each starting with
-rw-rw-rw-. -
Learn the baselines. This one-time run records what the three cameras and the perception output normally look like. SAIM writes one baseline per camera. The Perception Monitor (PCM) writes one baseline for all cameras, which also records the event bindings of the decision maker, so this run takes the same
--appand--sdm-configas the next step. The reference PCM baselines in the package were recorded for another decision maker configuration, so this step is needed. The container runs in the foreground for about 5 minutes, can take a little longer, and is removed when it exits. It starts no decision maker.Expected: the container output contains
SAIM completed LEARN successfully,PCM completed LEARN successfullyandAll selected monitors completed LEARN successfully, and the prompt returns.lslistsCamera_baseline.cfg,Camera_01_baseline.cfgandCamera_02_baseline.cfginsaim_baseline, andpcm_baseline.cfginpcm_baseline, each next to the shipped.cfg.defaultfiles.grepprints a line that ends inDVM: baseline: published 3 camera(s) in /opt/nvidia/psf/bin/pcm_baseline/pcm_baseline.cfg; bbox/confidence/occupancy are not fault baselines. -
Start the Safety Core. In terminal 1, start the container in the background with both monitors active. It runs every Safety Core process, including the decision maker, which sends its commands to the command receiver at
127.0.0.1:12350and writes its log to/var/log/psf/atl_sdm.logon the host.Expected:
docker runprints the container ID, andgrepprintsRequired sources: safety_monitor=1 perception_monitor=1 (from /opt/nvidia/psf/bin/nvpss.conf)andAll processes started. Waiting for shutdown signal.... -
Start the command receiver. In terminal 2, start the reference command receiver. It listens for the decision maker on port
12350, forwards every decision to the VST overlay on port12345, and reads operator commands from the named pipe~/hoisa-demo/cmdrx.in, so you can send them from any terminal.Start it only when no person is in the trailer or the ROI. The receiver sends one release request on its own when it starts (see Release a latched safe state), and every accepted release resets what the decision maker knows about people and the forklift.
Expected:
ATL UDP Command Receiver listening on port 12350, then within about 6 secondsStartup: peer connected — sending safe-release to clear any pre-existing latch. Leave it running. Without the VST overlay, the receiver can printVST relay send failed; continuing without display deliveryonce; commands are not affected.
Check that it is working
Run these checks in terminal 1, about 5 minutes after you started the Safety Core. By then every monitor the configuration requires has either registered or been reported missing.
-
The container is up.
Expected:
nv-psf: Upfollowed by the uptime. -
Every required source registered, and no process was refused. A required source (SAIM, PCM or the MDX client) that has not registered within about 4 minutes is reported as
PSS_SAFETY_MONITOR_LOST,PSS_PERCEPTION_MONITOR_LOSTorPSS_MDX_CLIENT_LOST.Expected:
0. -
The Perception Monitor runs both of its checks.
Expected: a line that ends in
checks: container_health=on (5 container(s) listed) data_validation=on (3 baseline camera(s)), a line that containspipeline -> VALID (first status) (health=ok dvm=ok, and0from the second command. Thechecks:line shows only which checks were set up; thepipeline -> VALIDline shows that both reported good results, and the count shows that no container, camera or Kafka feed was missing, Docker answered, no check went silent and the baseline was usable.If the count is not
0, read the matching lines in/var/log/psf/pcm.log. Ifdata_validation=off (no baseline)appears, no usable PCM baseline remained: it is missing, unreadable or corrupt, or the learn run in Learn the baselines used other--appor--sdm-configvalues. The warnings logged just before thechecks:line give the cause. See also Troubleshooting. -
The Perception Monitor trusts the perception pipeline.
Expected: a line that contains
[PCM][INFO] -> AI_PIPELINE_VALID. PCM repeats its verdict every 5 seconds, so the line can end in(re-sent, unchanged). -
The decision maker started and registered with the NvPSD Gateway.
Expected: a line ending in
count=3 {1:Camera, 2:Camera_01, 3:Camera_02}, a lineSDM: sent registration (7 event types) to gateway, and a line that starts withATL Control Algorithm initialized. -
Decision requests arrive. The SEI daemon sends at least one every 5 seconds.
Expected: the second number is larger than the first.
-
Commands reach the receiver and are acknowledged.
Expected:
Sending decision commandlines, each followed by aReceived acknowledgmentline with the sameSeqNo, and receiver lines such asReceived ATL command: 0x07 - UNMUTE (PREVENT OPERATION).0x02 - MUTE (ALLOW OPERATION)appears while the forklift is in the trailer with no person in the trailer or the ROI. -
No safe state is held. Look at terminal 2.
Expected: no
*** FSI SAFE-STATE LATCHED ***banner after the startup release. The receiver prints this banner for every latched safe state, also when the decision maker runs on the CCPLEX. If you see it, follow Release a latched safe state. -
The decision shows on the video. Skip this check if you did not turn on the VST overlay. Open
http://<HOST_IP>:30888/vst/, where<HOST_IP>is the address of this host, and play one of the three cameras.Expected: the overlay changes between
Standard ModeandEfficient Modeas the forklift enters and leaves the trailer.
Every log file, and what writes it, is listed in Logs.
Release a latched safe state
When the decision maker detects a fault, it latches a safe state: it sends UNMUTE followed by
SW_ERROR, keeps sending them, and does not return to normal operation on its own. The latch is
released only by a validated release request from the command receiver.
Automatic release at receiver start. About half a second after the receiver first hears
from the decision maker, it sends one release request on its own (the Startup: peer connected
line). This clears a latch whose cause has already gone, for example one left over from a
previous run. It happens once per receiver start. A latch whose cause is still active is denied.
Manual release. Every safe state entered after that needs an operator. Run these steps in terminal 1:
-
Find the cause. The decision maker names it when it enters the safe state.
Expected: one or more lines such as
ATL: AI pipeline reported INVALID; entering safe hold. -
Fix the cause and wait for it to clear. For each cause, the decision maker logs a line that ends in
latch awaits PLC release.Expected: one line for each cause found in step 1.
-
Confirm the work area is safe: the forklift is outside the trailer and the ROI, and no person is in either. The decision maker checks only its own fault sources and cannot see the scene.
-
Send the release request.
Expected: terminal 2 prints
Sent SAFE RELEASE REQUEST, then>>> safe-state CLEARED <<<, andatl_sdm.loggetsATL: PLC safe-release accepted; local state reset to clear condition.
If a cause is still active, terminal 2 prints safe-release DENIED (SeqNo N) — latch cause still active. and the decision maker logs
ATL: PLC safe-release denied; active safe-state fault source remains, active_causes=N. N is
the sum of the active causes:
After a release, including the automatic one at receiver start, the decision maker forgets where
the forklift and people were, and sends UNMUTE until it next sees the forklift enter the
trailer.
Stop
-
In terminal 1, stop and remove the container.
Expected:
nv-psftwice, and nothing from the last command.docker rmdeletes the container output thatdocker logsshows; the files in/var/log/psfremain. -
In terminal 2, press
Ctrl-C.Expected:
Shutting down.... A receiver left running stops on its own about 55 seconds after the last heartbeat from the decision maker, withcmd_rx: upstream CMD_HEARTBEAT fault latched (tier 3) — local fail-safe, no PSS — stopping.
To run on your own cameras, or with another application, continue with Custom Deployment.