Configuration¶
RSIPI reads an RSI Ethernet config to determine network settings and which variables are exchanged with the robot. Six ship with the package, resolved by name with context(); available_contexts() lists them and describe_contexts() explains each:
| Context | What it wires | On hardware |
|---|---|---|
basic |
Cartesian corrections, digital I/O, $SEN_PREA, Tech parameters — KUKA's own example, unchanged |
verified |
joints (default) |
basic + joint corrections, joint feedback, digital-output read-back |
verified |
max |
joints + applied-correction monitors, motor currents, analogue I/O, $SEN_PINT, program override — everything a 6-axis robot can bind |
verified 2026-09-10 (11/11) |
full |
joints + external axes; reports RSIBad at RSI_ON on a robot without them |
not yet |
onlysend |
the robot streams and the PC never replies — logging only, no corrections | verified |
stop |
basic + a STOP object, to end RSI_MOVECORR() from the PC |
verified 2026-09-10 |
Every shipped context carries POSCORRMON/AXISCORRMON objects at 500 mm / 180°: without them the controller applies its own 6 mm / 6° overall-correction default and stops RSI with KSS29000 — the first thing that bit on the robot. config_builder warns if your own context lacks them.
A context is four files that only work as a set (.rsi, .rsi.xml, .rsi.diagram, RSI_EthernetConfig_*.xml), and the same set must be on the controller. Two commands cover the round trip:
# Copy a shipped context out of the package, ready for the controller
python -m RSIPI.deploy --context joints --out C:\deploy
# Generate the matching Ethernet config for a context you built in RSIVisual
python -m RSIPI.config_builder MyContext.rsi.xml --ip 10.10.10.10 --port 64000
config_builder derives every channel number, tag and type from what the RSIVisual context already records, so the config cannot disagree with the context — the mismatch behind RSI_CREATE: Invalid index - signal output. It reproduces all six shipped configs channel for channel.
What to put on the controller (KRC4, KSS 8.3, RSI 3.x — log in as Expert):
| What | To (on the controller) |
|---|---|
The context's four files, together — e.g. RSIPI_Basic.rsi, RSIPI_Basic.rsi.xml, RSIPI_Basic.rsi.diagram, RSI_EthernetConfig_Basic.xml from deploy --context basic |
C:\KRC\ROBOTER\Config\User\Common\SensorInterface\ |
The KRL program from controller/Program/ that creates that context: RSIPI_Minimal.src → Basic, RSIPI_Max.src → Max, RSIPI_Stop.src → Stop, RSIPI_OnlySend.src → OnlySend (each names its context in its RSI_CREATE line; edit that line to use another, e.g. Joints) |
C:\KRC\ROBOTER\KRC\R1\Program\ |
The .rsi.xml carries the object parameters the controller reads, the .rsi and .rsi.diagram are RSIVisual's view of the same context, and the Ethernet config names the channels — a partial or mixed set fails at RSI_CREATE. The PC's RSI interface must be on the IP in the config (10.10.10.10 as shipped). Then, on the pendant: select the program, run it to its HALT, start the Python side, and press Start — the PC must be listening before RSI_ON, or the ETHERNET object reports RSIBad after 0.4 s of silence. Full walkthrough, network settings and troubleshooting: Controller setup; what each RSI object does and how it reaches KRL: RSI objects.
<ROOT>
<CONFIG>
<IP_NUMBER>10.10.10.10</IP_NUMBER> <!-- External PC IP -->
<PORT>64000</PORT> <!-- UDP port -->
<SENTYPE>ImFree</SENTYPE> <!-- XML root element name -->
<ONLYSEND>FALSE</ONLYSEND> <!-- FALSE = bidirectional -->
</CONFIG>
<!-- SEND: What the robot sends TO us (read-only from Python) -->
<SEND>
<ELEMENTS>
<ELEMENT TAG="DEF_RIst" TYPE="DOUBLE" INDX="INTERNAL" /> <!-- TCP position -->
<ELEMENT TAG="DEF_RSol" TYPE="DOUBLE" INDX="INTERNAL" /> <!-- Commanded position -->
<ELEMENT TAG="DEF_Delay" TYPE="LONG" INDX="INTERNAL" /> <!-- Packet delay count -->
<ELEMENT TAG="Digout.o1" TYPE="BOOL" INDX="2" /> <!-- Digital output state -->
</ELEMENTS>
</SEND>
<!-- RECEIVE: What the robot receives FROM us (writable from Python) -->
<RECEIVE>
<ELEMENTS>
<ELEMENT TAG="RKorr.X" TYPE="DOUBLE" INDX="1" HOLDON="1" /> <!-- Cartesian correction -->
<ELEMENT TAG="RKorr.Y" TYPE="DOUBLE" INDX="2" HOLDON="1" />
<ELEMENT TAG="RKorr.Z" TYPE="DOUBLE" INDX="3" HOLDON="1" />
<ELEMENT TAG="RKorr.A" TYPE="DOUBLE" INDX="4" HOLDON="1" />
<ELEMENT TAG="RKorr.B" TYPE="DOUBLE" INDX="5" HOLDON="1" />
<ELEMENT TAG="RKorr.C" TYPE="DOUBLE" INDX="6" HOLDON="1" />
<ELEMENT TAG="DiO" TYPE="LONG" INDX="8" HOLDON="1" /> <!-- Digital I/O -->
</ELEMENTS>
</RECEIVE>
</ROOT>
(This is a trimmed illustrative excerpt, not a literal copy of the shipped file --
RSI_EthernetConfig.xml also declares DiL, Tech.C1, Digout.o2/o3, and Source1
in SEND, and EStr, Tech.T2, and FREE in RECEIVE.)
Key points:
- DEF_ prefixed tags are expanded internally (e.g., DEF_RIst becomes RIst: {X, Y, Z, A, B, C}).
- HOLDON="1" means the last value is held if no new value is sent.
- SEND variables are read via api.monitoring (position, motor currents, IPOC), api.krl.read_param() (Tech.C), and api.io.get_input() (digital inputs); RECEIVE variables are written via api.motion, api.io, and api.krl.write_param().
- The config must match the RSI object configuration on the KUKA controller.