2013 Summer Project Week:ProstateBRP
From NAMIC Wiki
Home < 2013 Summer Project Week:ProstateBRP
Key Investigators
- WPI: Gregory Fischer, Nirav Patel
- BWH: Junichi Tokuda, Nobuhiko Hata, Clare Tempany
Objective
- Define and review the clinical workflow
- Define QA protocol
- Test a new OpenIGTLink-based communication protocol for Slicer-Robot integration.
Approach, Plan
Progress
Protocol Definition
(This is not a master copy)
3D Slicer (operator) | Message | Robot Controller | Radiologist |
Start-up | |||
The operator presses "Start-up" button | |||
Send command to robot | >> STRING(COMMAND, START_UP) >> DEVICE_NAME=COMMAND, STRING=START_UP |
||
<< STRING(ACK, START_UP) << DEVICE_NAME=ACK, STRING=START_UP |
Echo back an acknowledgement command was received, but not yet completed | ||
Start up and initialize the hardware. Run the robot homing procedure if necessary (skip if already successfully completed). Move robot to home (loading) configuration. | |||
<< STATUS(START_UP, OK:??:??) << DEVICE_NAME=START_UP C=1(OK), SubCode=??, ErrorName=?? |
Confirm when robot is initialized TODO: Refine error/status codes |
||
Display the result of start up process. | |||
Planning | |||
The operator opens the planning panel | |||
>> STRING(COMMAND, PLANNING) >> | |||
<< STRING(ACK, PLANNING) << | Echo back an acknowledgement command was received | ||
Do nothing except keep track of current state, robot is awaiting next workphase. | |||
Show that the robot is in PLANNING phase. | |||
Calibration | |||
The operator opens the calibration panel | |||
>> STRING(COMMAND, CALIBRATION) >> | |||
<< STRING(ACK, CALIBRATION) << | Echo back an acknowledgement command was received | ||
Do nothing except keep track of current state, robot is awaiting calibration transform | |||
Show that the robot is in CALIBRATION phase. | |||
Nav Software (3D Slicer or RadVision) calculates calibration matrix | |||
>> TRANSFORM(CALIBRATION, 4x4 calibration matrix in RAS coordinates) >> | |||
<< TRANSFORM(ACK, 4x4 calibration matrix in RAS coordinates) << | Echo back an acknowledgement transform was received | ||
Update calibration transform, set flag that registration has been set externally, reply with confirmation | |||
<< STATUS(CALIBRATION, OK:??:??) << DEVICE_NAME=CALIBRATION C=1(OK), SubCode=??, ErrorName=?? |
Confirm that calibration was received and robot is ready for next workphase (targeting) | ||
Show that calibration successfully sent to robot. | |||
Targeting | |||
The operator enters "Targeting" mode | |||
>> STRING(COMMAND, TARGETING) >> | |||
<< STRING(ACK, TARGETING) << | Acknowledge receiving targeting command | ||
Confirm if robot is ready for targeting, check if calibration was received | |||
<< STATUS(TARGETING, OK:??:??) << DEVICE_NAME=TARGETING C=1(OK), SubCode=??, ErrorName=?? |
Confirm robot has entered targeting mode | ||
<< STATUS(TARGET, DNR:??:??) << DEVICE_NAME=TARGETING C=13(DeviceNotReady), SubCode=??, ErrorName=?? |
ERROR CASE: If not able to enter targeting mode (i.e. calibration not received, reply with Code:13 (Device Not Ready) | ||
The operator select a target, Nav software creates a 4x4 matrix for desired 6-DOF robot pose to reach the target | |||
>> TRANSFORM(TARGET, 4x4 target matrix in RAS coordinates) >> | |||
<< TRANSFORM(ACK, 4x4 target matrix) << | Acknowledge receipt of target transformation by echoing back | ||
Calculate if target pose is reachable based on the kinematics, reply with status and set target | |||
<< STATUS(TARGET, OK:??:??) << DEVICE_NAME=TARGETING C=1(OK), SubCode=??, ErrorName=?? |
Reply with OK if target was accepted | ||
<< TRANSFORM(TARGET_POSITION, 4x4 target matrix) << | Send actual target pose in robot controller if one was set (corresponds to when status comes back OK) | ||
<< STATUS(TARGET, DNR:??:??) << DEVICE_NAME=TARGET C=13(DeviceNotReady), SubCode=??, ErrorName=?? |
ERROR CASE: If not in targeting mode, reply with Code:13 (Device Not Ready) | ||
<< STATUS(TARGET, CE:??:??) << DEVICE_NAME=TARGET C=10(ConfigurationError), SubCode=??, ErrorName=?? |
ERROR CASE: If not a valid target (i.e. out of workspace), reply with Code:10 (ConfigurationError) | ||
Display the reachable target position set in robot controller. | |||
The operator confirms the target position set in the controller, and press "MOVE" | |||
>> STRING(COMMAND, MOVE_TO_TARGET) >> | |||
<< STRING(ACK, MOVE_TO_TARGET) << | Echo back an acknowledgement command was received (not yet completed) | ||
Alert the clinician to hold footpedal to align the robot | Clinician engages interlock (footpedal in scanner room) to enable robot motion. Robot will only move when interlock is engaged following a move command. | ||
The robot moves to the target and streams its pose during motion | |||
<< TRANSFORM(CURRENT_POSITION, 4x4 current robot pose matrix in RAS coordinates) << | Stream current robot pose in RAS coords as moving. Can also be requested (see below). | ||
Display the current robot position as it moves toward the target. | |||
Display that the robot is at the target. Send confirmation. | |||
<< STATUS(DONE_MOVING, OK:??:??) << DEVICE_NAME=DONE_MOVING C=1(OK), SubCode=??, ErrorName=?? |
Reply with OK when robot reaches target | ||
<< TRANSFORM(CURRENT_POSITION, 4x4 current robot pose matrix in RAS coordinates) << | Push out final robot pose in RAS coords as moving. (same format as previous stream - ensures last one is at final position) | ||
Display the current final robot position at the target. | |||
Needle Insertion (Manual) | |||
Ask to lock the robot | |||
The operator presses "Lock" button | |||
>> STRING (COMMAND, MANUAL) >> | |||
<< STRING(ACK, MANUAL) << | Echo back an acknowledgement command was received (not yet completed) | ||
Cut motor power to prevent motion of the robot base. This also eliminates causes of MR interference for insertion under live imaging. | |||
<< STATUS(MANUAL, OK:??:??) << DEVICE_NAME=MANUAL C=1(OK), SubCode=??, ErrorName=?? |
Reply with OK when robot is in a safe, locked state | ||
Insert a needle, optionally under live MR imaging. Perform intervention with the needle (biopsy or seed placement). | |||
Retract the needle | |||
Ask to unlock the robot and confirm needle is retracted | |||
The operator presses "Unlock" | |||
>> STRING(COMMAND, TARGETING) >> | |||
<< STRING(ACK, TARGETING) << | Acknowledge receiving targeting command | ||
Return robot to home (loading) position. ?? THIS MAKE SENSE HERE, SHOULD IT BE A SEPARATE 'HOME' COMMAND | |||
Return to targeting mode, check if ready for targeting. | |||
Additional Commands | |||
The operator presses "Stop" button | |||
>> STRING(COMMAND, STOP) >> | |||
The robot stops all motion. Stays in current state/workphase. | |||
<< STATUS(COMMAND, STOP) << | |||
The operator presses "Emergency" button | |||
>> STRING(COMMAND, EMERGENCY) >> | |||
The robot stops all motion and disables/locks motors. Switches to Emergency state/workphase. ?? IS THIS THE DESIRED ACTION | |||
<< STATUS(COMMAND, EMERGENCY) << | |||
Request current robot pose (or target or calibration transforms) | |||
>> GET_TRANSFORM(CURRENT_POSITION) >> | |||
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. | |||
<< TRANSFORM(CURRENT_POSITION, 4x4 current robot pose matrix in RAS coordinates) << | |||
Request the robot status/workphase | |||
>> STRING(COMMAND, GET_STATUS) >> ?? CONFIRM COMMAND STRUCTURE FOR STATUS REQUEST | |||
Sends current state/workphase. ?? SHOULD IT SEND OTHER INFO TOO | |||
<< STATUS(COMMAND, Current Status) << | |||
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. | |||
<< STATUS(ERROR, Error Text) << |
Delivery Mechanism
The work will be delivered as a 3D Slicer extension. The code is hosted at https://github.com/ProstateBRP/BRPProstateNav