|
|
Line 46: |
Line 46: |
| | | |
| [[ProstateBRP_OpenIGTLink_Communication_June_2013]] | | [[ProstateBRP_OpenIGTLink_Communication_June_2013]] |
− |
| |
− | NOTE: THIS IS NOT THE FINAL VERSION. THE DEFINITION IS SUBJECT TO CHANGE.
| |
− |
| |
− | {| border="1" cellpadding="5" cellspacing="0" align="center"
| |
− | |-
| |
− | | align="left style="background:#e0e0e0;" | ''3D Slicer (operator)''
| |
− | | align="left style="background:#e0e0e0;" | ''Message''
| |
− | | align="left style="background:#e0e0e0;" | ''Robot Controller''
| |
− | | align="left style="background:#e0e0e0;" | ''Radiologist''
| |
− | |-
| |
− | | colspan=4 align="center" style="background:#f0f0f0;" | Start-up
| |
− | |-
| |
− | | align="left" | The operator presses "Start-up" button
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | Send command to robot
| |
− | | align="left" | >> STRING(COMMAND, START_UP) >> <br> ''DEVICE_NAME=COMMAND, STRING=START_UP''
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STRING(ACK, START_UP) << <br> ''DEVICE_NAME=ACK, STRING=START_UP''
| |
− | | align="left" | Echo back an acknowledgement command was received, but not yet completed
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Start up and initialize the hardware. Run the robot homing procedure if necessary (skip if already successfully completed). Move robot to home (loading) configuration.
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(START_UP, OK:??:??) << <br> DEVICE_NAME=START_UP <br>''C=1(OK), SubCode=??, ErrorName=??''
| |
− | | align="left" | Confirm when robot is initialized <br> TODO: Refine error/status codes
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | Display the result of start up process.
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | colspan=4 align="center" style="background:#f0f0f0;" | Planning
| |
− | |-
| |
− | | align="left" | The operator opens the planning panel
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> STRING(COMMAND, PLANNING) >>
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STRING(ACK, PLANNING) <<
| |
− | | align="left" | Echo back an acknowledgement command was received
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Do nothing except keep track of current state, robot is awaiting next workphase.
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | Show that the robot is in PLANNING phase.
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | colspan=4 align="center" style="background:#f0f0f0;" | Calibration
| |
− | |-
| |
− | | align="left" | The operator opens the calibration panel
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> STRING(COMMAND, CALIBRATION) >>
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STRING(ACK, CALIBRATION) <<
| |
− | | align="left" | Echo back an acknowledgement command was received
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Do nothing except keep track of current state, robot is awaiting calibration transform
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | Show that the robot is in CALIBRATION phase.
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | Nav Software (3D Slicer or RadVision) calculates calibration matrix
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> TRANSFORM(CALIBRATION, 4x4 calibration matrix in RAS coordinates) >>
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << TRANSFORM(ACK, 4x4 calibration matrix in RAS coordinates) <<
| |
− | | align="left" | Echo back an acknowledgement transform was received
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Update calibration transform, set flag that registration has been set externally, reply with confirmation
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(CALIBRATION, OK:??:??) << <br> DEVICE_NAME=CALIBRATION <br>''C=1(OK), SubCode=??, ErrorName=??''
| |
− | | align="left" | Confirm that calibration was received and robot is ready for next workphase (targeting)
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | Show that calibration successfully sent to robot.
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | colspan=4 align="center" style="background:#f0f0f0;" | Targeting
| |
− | |-
| |
− | | align="left" | The operator enters "Targeting" mode
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> STRING(COMMAND, TARGETING) >>
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STRING(ACK, TARGETING) <<
| |
− | | align="left" | Acknowledge receiving targeting command
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Confirm if robot is ready for targeting, check if calibration was received
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(TARGETING, OK:??:??) << <br> DEVICE_NAME=TARGETING <br>''C=1(OK), SubCode=??, ErrorName=??''
| |
− | | align="left" | Confirm robot has entered targeting mode
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(TARGET, DNR:??:??) << <br> DEVICE_NAME=TARGETING <br>''C=13(DeviceNotReady), SubCode=??, ErrorName=??''
| |
− | | align="left" | '''ERROR CASE:''' If not able to enter targeting mode (i.e. calibration not received, reply with Code:13 (Device Not Ready)
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | The operator select a target, Nav software creates a 4x4 matrix for desired 6-DOF robot pose to reach the target
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> TRANSFORM(TARGET, 4x4 target matrix in RAS coordinates) >>
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << TRANSFORM(ACK, 4x4 target matrix) <<
| |
− | | align="left" | Acknowledge receipt of target transformation by echoing back
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Calculate if target pose is reachable based on the kinematics, reply with status and set target
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(TARGET, OK:??:??) << <br> DEVICE_NAME=TARGETING <br>''C=1(OK), SubCode=??, ErrorName=??''
| |
− | | align="left" | Reply with OK if target was accepted
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << TRANSFORM(TARGET_POSITION, 4x4 target matrix) <<
| |
− | | align="left" | Send actual target pose in robot controller if one was set (corresponds to when status comes back OK)
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(TARGET, DNR:??:??) << <br> DEVICE_NAME=TARGET <br>''C=13(DeviceNotReady), SubCode=??, ErrorName=??''
| |
− | | align="left" | '''ERROR CASE:''' If not in targeting mode, reply with Code:13 (Device Not Ready)
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(TARGET, CE:??:??) << <br> DEVICE_NAME=TARGET <br>''C=10(ConfigurationError), SubCode=??, ErrorName=??''
| |
− | | align="left" | '''ERROR CASE:''' If not a valid target (i.e. out of workspace), reply with Code:10 (ConfigurationError)
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | Display the reachable target position set in robot controller.
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | The operator confirms the target position set in the controller, and press "MOVE"
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> STRING(COMMAND, MOVE_TO_TARGET) >>
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STRING(ACK, MOVE_TO_TARGET) <<
| |
− | | align="left" | Echo back an acknowledgement command was received (not yet completed)
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | Alert the clinician to hold footpedal to align the robot
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Clinician engages interlock (footpedal in scanner room) to enable robot motion. Robot will only move when interlock is engaged following a move command.
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | The robot moves to the target and streams its pose during motion
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << TRANSFORM(CURRENT_POSITION, 4x4 current robot pose matrix in RAS coordinates) <<
| |
− | | align="left" | Stream current robot pose in RAS coords as moving. Can also be requested (see below).
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | Display the current robot position as it moves toward the target.
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Display that the robot is at the target. Send confirmation.
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(DONE_MOVING, OK:??:??) << <br> DEVICE_NAME=DONE_MOVING <br>''C=1(OK), SubCode=??, ErrorName=??''
| |
− | | align="left" | Reply with OK when robot reaches target
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << TRANSFORM(CURRENT_POSITION, 4x4 current robot pose matrix in RAS coordinates) <<
| |
− | | align="left" | Push out final robot pose in RAS coords as moving. (same format as previous stream - ensures last one is at final position)
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" | Display the current final robot position at the target.
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | colspan=4 align="center" style="background:#f0f0f0;" | Needle Insertion (Manual)
| |
− | |-
| |
− | | align="left" | Ask to lock the robot
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | The operator presses "Lock" button
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> STRING (COMMAND, MANUAL) >>
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STRING(ACK, MANUAL) <<
| |
− | | align="left" | Echo back an acknowledgement command was received (not yet completed)
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Cut motor power to prevent motion of the robot base. This also eliminates causes of MR interference for insertion under live imaging.
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(MANUAL, OK:??:??) << <br> DEVICE_NAME=MANUAL <br>''C=1(OK), SubCode=??, ErrorName=??''
| |
− | | align="left" | Reply with OK when robot is in a safe, locked state
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Insert a needle, optionally under live MR imaging. Perform intervention with the needle (biopsy or seed placement).
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Retract the needle
| |
− | |-
| |
− | | align="left" | Ask to unlock the robot and confirm needle is retracted
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | The operator presses "Unlock"
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> STRING(COMMAND, TARGETING) >>
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STRING(ACK, TARGETING) <<
| |
− | | align="left" | Acknowledge receiving targeting command
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Return robot to home (loading) position. ?? THIS MAKE SENSE HERE, SHOULD IT BE A SEPARATE 'HOME' COMMAND
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Return to targeting mode, check if ready for targeting.
| |
− | | align="left" |
| |
− | |-
| |
− | | colspan=4 align="center" style="background:#f0f0f0;" | Additional Commands
| |
− | |-
| |
− | | align="left" | The operator presses "Stop" button
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> STRING(COMMAND, STOP) >>
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | The robot stops all motion. Stays in current state/workphase.
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(COMMAND, STOP) <<
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | colspan=4 align="center" style="background:#f0f0f0;" |
| |
− | |-
| |
− | | align="left" | The operator presses "Emergency" button
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> STRING(COMMAND, EMERGENCY) >>
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | The robot stops all motion and disables/locks motors. Switches to Emergency state/workphase. ?? IS THIS THE DESIRED ACTION
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(COMMAND, EMERGENCY) <<
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | colspan=4 align="center" style="background:#f0f0f0;" |
| |
− | |-
| |
− | | align="left" | Request current robot pose (or target or calibration transforms)
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> GET_TRANSFORM(CURRENT_POSITION) >>
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | The robot transmits current pose ("CURRENT_POSITION") through IGTLink upon request. This also works for requesting "TARGET_POSITION" and "CALIBRATION" transforms stored in robot controller.
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << TRANSFORM(CURRENT_POSITION, 4x4 current robot pose matrix in RAS coordinates) <<
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | colspan=4 align="center" style="background:#f0f0f0;" |
| |
− | |-
| |
− | | align="left" | Request the robot status/workphase
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | >> STRING(COMMAND, GET_STATUS) >> ?? CONFIRM COMMAND STRUCTURE FOR STATUS REQUEST
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Sends current state/workphase. ?? SHOULD IT SEND OTHER INFO TOO
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(COMMAND, Current Status) <<
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | |-
| |
− | | colspan=4 align="center" style="background:#f0f0f0;" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" |
| |
− | | align="left" | Robot controller sends errors or notifications through IGTLink. Transmitted asynchronously with error text in message body. To be used with limit events, hardware failures, invalid commands, etc.
| |
− | | align="left" |
| |
− | |-
| |
− | | align="left" |
| |
− | | align="left" | << STATUS(ERROR, Error Text) <<
| |
− | | align="left" |
| |
− | | align="left" |
| |
− |
| |
− | |}
| |
| | | |
| ==Delivery Mechanism== | | ==Delivery Mechanism== |