OpenIGTLink Fiducial Marker Transfer seems to max out at 2^16 bytes

Operating system: Windows 10
Slicer version: 4.11
Expected behavior: OpenIGTLink - Fiducial marker transfer of all points
Actual behavior: OpenIGTLink seems to max out at 2^16 bytes regardless of number of fiducials to be transferred.

Can you tell a bit about your use case? How many points do you want to transfer? How many times per second? What is the OpenIGTLink client and server (Slicer, Plus, pyigtl, …)?

Hi Andras, thanks very much for your inquiry.

We were wanting to transfer up to 500 fiducial makers, which put the total byte transfer over 65K.
This is a one-time transfer, at the beginning of our procedure.

3D Slicer is the server, and the client is custom code on our Kuka LBR, which has worked well for smaller numbers of fiducials.
We have a very larger data buffer on the robot side, but all the data after 65K is zeros…the data within the first 65K is correct.

But you make an excellent point that this could be a limitation on the Kuka side.
We could probably hook up a laptop and make a quick simulation in Matlab to test.
Do you think this would be a reasonable debug step?

Best regards,
Andy

I’ve tried and 600 points are transferred without problems via OpenIGTLink between two Slicer instances. This confirms that the problem is on the Kuka side.

You can also use pyigtl as an OpenIGTLink test client.

Note that fiducials are intended for cases when the user needs to identify each individual point (user can recognize each point by name or by spatial position). 500 fiducial markers are more likely describe a point cloud, which can be much more efficiently stored in a Model node in Slicer and transferred as POLYDATA message in OpenIGTLink.

Thanks Andras!
We will verify from our side, for our own education.
…and I suspected there was a more efficient transfer structure, but since we saw this “error” wanted to bring it up.
We very much appreciate your help and guidance!!
Best regards,
Andy

One more thing that you may find useful - this is an example to send 600 random fiducial point positions via pyigtl:

import pyigtl
import numpy as np

client = pyigtl.OpenIGTLinkClient(host="127.0.0.1", port=18944)
point_message = pyigtl.PointMessage(device_name="points", positions=np.random.rand(600,3)*20)
client.send_message(point_message)

It sounds like a very interesting project. It would be nice if you could post some images or videos if you got some features working.

Thanks again Andras, and once we get the thing working we’d be glad to post something.

1 Like