This project provides a C++ S-Function to stream real-time position and orientation data of an OptiTrack rigid body (from Motive) directly into Simulink using the official NatNet SDK.
- Real-time acquisition of pose (position + quaternion) from OptiTrack via network
- Simple S-Function interface for Simulink models
- Connection state output (connected, tracking, no tracking)
- Tested with MATLAB/Simulink R2024b (and newer)
- Based on NatNet SDK 4.x
- MATLAB & Simulink (tested with R2024b or newer)
- Microsoft Visual C++ (for compilation)
- NatNet SDK 4.x (tested with version 4.3)
- Running Motive that streams data via network
- Source file
optitrack_sfunction.cpp(included) - NatNet SDK headers & library:
NatNetClient.h,NatNetTypes.h,NatNetLib.lib,NatNetLib.dll
- Configure MATLAB’s C++ compiler:
mex -setup C++- Compile the S-Function, pointing to your NatNet SDK paths:
mex optitrack_sfunction.cpp \
-I"path/to/NatNetSDK/include" \
-L"path/to/NatNetSDK/lib/x64" \
-lNatNetLibExample (Windows):
mex optitrack_sfunction.cpp \
-I"C:\NatNetSDK\include" \
-L"C:\NatNetSDK\lib\x64" \
-lNatNetLib- Copy
NatNetLib.dllto your Simulink model folder or another location accessible by MATLAB at runtime.
-
Open Simulink and create a new model.
-
Add an S-Function block (search “S-Function”).
-
Configure the block:
-
S-function name:
optitrack_sfunction -
Parameters (in order):
- IP address of the machine running Motive
- IP address of this (client) machine
- Rigid Body ID to track
Example parameter string:
'192.168.0.2', '192.168.0.3', 1- 192.168.0.2 = Motive server IP
- 192.168.0.3 = client (this machine) IP
- 1 = ID of the tracked rigid body
-
-
Connect the outputs of the S-Function block:
-
Channel 1: Position — a 3×1 vector
[x; y; z] -
Channel 2: Quaternion — a 4×1 vector
[qw; qx; qy; qz] -
Channel 3: Connection state
1.0= valid tracking0.5= connected but no tracking0.0= disconnected
-
-
Run the simulation. If all is configured correctly, you should see real-time pose data coming into Simulink.
- The block works only in Normal simulation mode — code generation or accelerated modes are not supported.
- If you face connectivity issues, check firewall settings and ensure the IPs are set correctly.
- Diagnostic or status messages are printed in MATLAB’s command window.
- Author: Rafael Carbonell Lázaro
- Based on the official OptiTrack NatNet SDK
- (You may add a license file or specify an open-source license here.)
- Support for multiple rigid bodies in a single S-Function
- Support for streamed marker data or other object types
- Compatibility with accelerated or code-generation modes
- Error handling improvements and reconnection strategies
- Cross-platform support (e.g. Linux, macOS)
Este proyecto provee una S-Function en C++ para recibir en tiempo real la posición y orientación de un cuerpo rígido (Rigid Body) de OptiTrack (desde Motive) directamente en Simulink, usando el SDK oficial de NatNet.
- Adquisición en tiempo real de pose (posición + cuaternión) desde OptiTrack por red
- Interfaz sencilla tipo S-Function para modelos Simulink
- Salida del estado de conexión (conectado, tracking válido, sin tracking)
- Probado con MATLAB/Simulink R2024b (y versiones superiores)
- Basado en NatNet SDK 4.x
- MATLAB & Simulink (probado con R2024b o superior)
- Microsoft Visual C++ (para compilar)
- NatNet SDK 4.x (probado con la versión 4.3)
- Motive ejecutándose y enviando datos por red
- Archivo fuente
optitrack_sfunction.cpp(incluido) - Archivos del SDK NatNet:
NatNetClient.h,NatNetTypes.h,NatNetLib.lib,NatNetLib.dll
- Configura el compilador de C++ en MATLAB:
mex -setup C++- Compila la S-Function, indicando las rutas de tu SDK NatNet:
mex optitrack_sfunction.cpp \
-I"ruta/a/NatNetSDK/include" \
-L"ruta/a/NatNetSDK/lib/x64" \
-lNatNetLibEjemplo (Windows):
mex optitrack_sfunction.cpp \
-I"C:\NatNetSDK\include" \
-L"C:\NatNetSDK\lib\x64" \
-lNatNetLib- Copia
NatNetLib.dlla la carpeta de tu modelo Simulink o a otra ubicación accesible por MATLAB en tiempo de ejecución.
-
Abre Simulink y crea un nuevo modelo.
-
Añade un bloque S-Function (busca “S-Function”).
-
Configura el bloque:
-
Nombre de la S-function:
optitrack_sfunction -
Parámetros (orden):
- Dirección IP del equipo que ejecuta Motive
- Dirección IP de este equipo (cliente)
- ID del cuerpo rígido que deseas trackear
Ejemplo de parámetros:
'192.168.0.2', '192.168.0.3', 1- 192.168.0.2 = IP del servidor Motive
- 192.168.0.3 = IP del cliente (este equipo)
- 1 = ID del cuerpo rígido a trackear
-
-
Conecta las salidas del bloque:
-
Salida 1: Posición — vector 3×1
[x; y; z] -
Salida 2: Cuaternión — vector 4×1
[qw; qx; qy; qz] -
Salida 3: Estado de conexión
1.0= seguimiento válido0.5= conectado pero sin tracking0.0= desconectado
-
-
Ejecuta la simulación. Si todo está bien configurado, deberías ver datos de pose en tiempo real dentro de Simulink.
- El bloque solo funciona en modo de simulación Normal — no es compatible con generación de código ni modo acelerado.
- Si tienes problemas de conexión, verifica las reglas del firewall y que las IP estén correctamente asignadas.
- Los mensajes de diagnóstico o estado aparecen en la ventana de comandos de MATLAB.
- Autor: Rafael Carbonell Lázaro
- Basado en el SDK oficial de OptiTrack NatNet
- (Puedes agregar un archivo de licencia o especificar una licencia de código abierto aquí.)
- Soporte para múltiples cuerpos rígidos en la misma S-Function
- Lectura de datos de marcadores u otros tipos de objetos
- Compatibilidad con modos acelerado o generación de código
- Mejoras en manejo de errores y estrategias de reconexión
- Soporte multiplataforma (Linux, macOS)