A primera vista parece una idea fuera de contexto, por no decir que es una locura. Pascal en su versión moderna, también llamada Object Pascal, implementa clases, genéricos, etc. Pero ROS2 es un gran ecosistema que se programa en C++ o Pyhton, dos lenguajes diametralmente opuestos. Pero indagando en en ROS2 descubrí que tiene un núcleo escrito en C

La arquitectura de ROS 2 tiene como núcleo RCL, escrito en C, y encima están las capas cliente como RCLCP (C++) y RCLCPY (Python). Además, ROS 2 utiliza DDS para la comunicación. Esa arquitectura en capas es precisamente lo que hace interesante a FPC. La idea es replicar el concepto de capas que tiene ROS2, esta imagen representa la idea.

Free Pascal puede trabajar con C, casi sin ninguna trabaja, de echo dispone de capacidades para ello:

  • DLL/shared libraries
  • cdecl
  • external
  • wrappers
  • estructuras C
  • punteros
  • callbacks
  • interfaces C
  • bindings generados manualmente

Una cosa que se suele olvidar es que C y Pascal se llevan bastante bien a nivel ABI.

Yo no haría un ROS2 para pascal

La idea es usar RCL que es C, y llamarlo desde Pascal, así seria una opción en la misma capa de C++ y Python, ya que FPC encaja bastante bien con C. Se puede hacer un binding de manera que se escribiría el siguiente código en pascal

De tal manera que el código que al realizar un programa en Pascal quedaría algo así:

¿Por dónde empezaría?

Lo idea sería hacer una pequeña demostración que sería conseguir que un pequeño programa de Pascal, fuera capaz de lanzar un nodo, y subscribirse a un tópico. Luego habría que ir sumando más características, como por ejemplo un nodo que publique mensajes, un nodo que funcione como servidor, otro nodo como servidor de acciones, y sus correspondientes nodos cliente.

Con lo cual llegaríamos a un situación como refleja esta imagen.

Como afrontarlo.

Es un tarea compleja, además de desafiante.

La arquitectura de RCL se puede resumir en esta imagen.

Todo ello sin olvidarnos de ROSIDL. ROSIDL (ROS Interface Definition Language) es un conjunto de paquetes esenciales en ROS 2 que se encarga de analizar, procesar y convertir archivos de definición de interfaces (.msg, .srv y .action) en código fuente ejecutable para diferentes lenguajes de programación como C, C++ y Python.

Aquí la duda es como afrontar esto.

Una forma de utilizar los tipos ROSIDL desde Pascal.

Por ejemplo:

TStringTJointStateTTwistTOdometry...

y conseguir su correspondiente type support.

La idea sería llegar a esto:

El objetivo para empezar podría sería descubrir:

  1. Qué estructuras expone RCL.
  2. Cómo se inicializa un contexto.
  3. Cómo se crea un nodo.
  4. Cómo se crea un publisher/subscriber.
  5. Cómo funciona el wait set.
  6. Cómo se reciben mensajes.
  7. Qué parte de la gestión de memoria corresponde a rcl.
  8. Cómo se representan los mensajes.

Y siendo más ambicioso, una hoja de ruta podría ser:

FASE 1 — RCL
  • Investigar rcl
  • Binding contexto
  • Binding nodo
  • Publisher
  • Subscriber
  • Wait set
  • Primer ejemplo funcional
FASE 2 — MENSAJES
  • Entender type support
  • std_msgs/String
  • Generar .pas
  • Mensajes propios
FASE 3 — SERVICIOS
  • .srv
  • Cliente
  • Servidor
FASE 4 — ACCIONES
  • .action
  • Action client
  • Action server

Saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio esta protegido por reCAPTCHA y laPolítica de privacidady losTérminos del servicio de Googlese aplican.

El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.