{"id":1250,"date":"2026-08-17T21:24:00","date_gmt":"2026-08-17T20:24:00","guid":{"rendered":"https:\/\/jorgeturiel.es\/?p=1250"},"modified":"2026-08-17T12:27:56","modified_gmt":"2026-08-17T11:27:56","slug":"y-si-pascal-pudiera-ser-parte-de-ros2","status":"publish","type":"post","link":"https:\/\/jorgeturiel.es\/?p=1250","title":{"rendered":"\u00bfY si Pascal pudiera ser parte de ROS2?"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A primera vista parece una idea fuera de contexto, por no decir que es una locura. Pascal en su versi\u00f3n moderna, tambi\u00e9n llamada Object Pascal, implementa clases, gen\u00e9ricos, etc. Pero ROS2 es un gran ecosistema que se programa en C++ o Pyhton, dos lenguajes diametralmente opuestos. Pero indagando en en ROS2 descubr\u00ed que tiene un n\u00facleo escrito en C<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">La arquitectura de ROS 2 tiene como n\u00facleo <strong><code>RCL<\/code><\/strong>, escrito en C, y encima est\u00e1n las capas cliente como RCLCP (C++) y RCLCPY (Python). Adem\u00e1s, ROS 2 utiliza DDS para la comunicaci\u00f3n. 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.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen.png\" alt=\"\" class=\"wp-image-1253\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen.png 1024w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-300x168.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-768x429.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Free Pascal puede trabajar con C, casi sin ninguna trabaja, de echo dispone de  capacidades para ello:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DLL\/shared libraries<\/li>\n\n\n\n<li>cdecl<\/li>\n\n\n\n<li>external<\/li>\n\n\n\n<li>wrappers<\/li>\n\n\n\n<li>estructuras C<\/li>\n\n\n\n<li>punteros<\/li>\n\n\n\n<li>callbacks<\/li>\n\n\n\n<li>interfaces C<\/li>\n\n\n\n<li>bindings generados manualmente<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Una cosa que se suele olvidar es que C y Pascal se llevan bastante bien a nivel <a href=\"https:\/\/es.wikipedia.org\/wiki\/Interfaz_binaria_de_aplicaciones\">ABI<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Yo no har\u00eda un ROS2 para pascal<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La idea es usar RCL que es C, y llamarlo desde Pascal, as\u00ed seria una opci\u00f3n 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\u00eda el siguiente c\u00f3digo en pascal<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \">function rcl_init(\n  argc: Integer;\n  argv: PPChar;\n  options: PRclInitOptions;\n  context: PRclContext\n): TRclRetCode; cdecl; external 'rcl';<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">De tal manera que el c\u00f3digo que al realizar un programa en Pascal quedar\u00eda algo as\u00ed:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \">Node := TRosNode.Create('my_robot');\n\nNode.CreatePublisher('\/cmd_vel');\n\nNode.CreateSubscription('\/scan',@OnLaserScan);<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfPor d\u00f3nde empezar\u00eda?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lo idea ser\u00eda hacer una peque\u00f1a demostraci\u00f3n que ser\u00eda conseguir que un peque\u00f1o programa de Pascal, fuera capaz de lanzar un nodo, y subscribirse a un t\u00f3pico.  Luego habr\u00eda que ir sumando m\u00e1s caracter\u00edsticas, 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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con lo cual llegar\u00edamos a un situaci\u00f3n como refleja esta imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-1.png\" alt=\"\" class=\"wp-image-1254\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-1.png 1024w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-1-300x168.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-1-768x429.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Como afrontarlo.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Es un tarea compleja, adem\u00e1s de desafiante.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La arquitectura de RCL se puede resumir en esta imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-2.png\" alt=\"\" class=\"wp-image-1255\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-2.png 1024w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-2-300x168.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-2-768x429.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00f3n de interfaces (.msg, .srv y .action) en c\u00f3digo fuente ejecutable para diferentes lenguajes de programaci\u00f3n como C, C++ y Python. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed la duda es como afrontar esto. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una forma de utilizar los tipos ROSIDL desde Pascal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">TStringTJointStateTTwistTOdometry...<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">y conseguir su correspondiente <strong>type support<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La idea ser\u00eda llegar a esto:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-3.png\" alt=\"\" class=\"wp-image-1257\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-3.png 1024w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-3-300x168.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2026\/08\/imagen-3-768x429.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">El objetivo para empezar podr\u00eda ser\u00eda descubrir:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Qu\u00e9 estructuras expone <code><em>RCL<\/em><\/code>.<\/li>\n\n\n\n<li>C\u00f3mo se inicializa un contexto.<\/li>\n\n\n\n<li>C\u00f3mo se crea un nodo.<\/li>\n\n\n\n<li>C\u00f3mo se crea un <em>publisher<\/em>\/<em>subscriber<\/em>.<\/li>\n\n\n\n<li>C\u00f3mo funciona el <code><em>wait se<\/em>t<\/code>.<\/li>\n\n\n\n<li>C\u00f3mo se reciben mensajes.<\/li>\n\n\n\n<li>Qu\u00e9 parte de la gesti\u00f3n de memoria corresponde a <code>rcl<\/code>.<\/li>\n\n\n\n<li>C\u00f3mo se representan los mensajes.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Y siendo m\u00e1s ambicioso, una hoja de ruta podr\u00eda ser:<\/p>\n\n\n\n<style>\n.roadmap-container {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n  gap: 16px;\n  font-family: system-ui, sans-serif;\n  margin: 20px 0;\n}\n.phase-card {\n  background: #1e1e2e;\n  border: 1px solid #313244;\n  border-radius: 8px;\n  padding: 16px;\n  color: #cdd6f4;\n}\n.phase-title {\n  font-weight: bold;\n  font-size: 0.9em;\n  text-transform: uppercase;\n  letter-spacing: 0.5px;\n  color: #89b4fa;\n  border-bottom: 1px solid #313244;\n  padding-bottom: 8px;\n  margin-bottom: 12px;\n}\n.task-list {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n.task-item {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 0.88em;\n  margin-bottom: 6px;\n}\n.task-item input[type=\"checkbox\"] {\n  accent-color: #fab387;\n  width: 15px;\n  height: 15px;\n}\n<\/style>\n\n<div class=\"roadmap-container\">\n  <div class=\"phase-card\">\n    <div class=\"phase-title\">FASE 1 \u2014 RCL<\/div>\n    <ul class=\"task-list\">\n      <li class=\"task-item\"><input type=\"checkbox\" checked disabled> Investigar rcl<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Binding contexto<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Binding nodo<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Publisher<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Subscriber<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Wait set<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Primer ejemplo funcional<\/li>\n    <\/ul>\n  <\/div>\n\n  <div class=\"phase-card\">\n    <div class=\"phase-title\">FASE 2 \u2014 MENSAJES<\/div>\n    <ul class=\"task-list\">\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Entender type support<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> std_msgs\/String<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Generar .pas<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Mensajes propios<\/li>\n    <\/ul>\n  <\/div>\n\n  <div class=\"phase-card\">\n    <div class=\"phase-title\">FASE 3 \u2014 SERVICIOS<\/div>\n    <ul class=\"task-list\">\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> .srv<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Cliente<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Servidor<\/li>\n    <\/ul>\n  <\/div>\n\n  <div class=\"phase-card\">\n    <div class=\"phase-title\">FASE 4 \u2014 ACCIONES<\/div>\n    <ul class=\"task-list\">\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> .action<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Action client<\/li>\n      <li class=\"task-item\"><input type=\"checkbox\" disabled> Action server<\/li>\n    <\/ul>\n  <\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Saludos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A primera vista parece una idea fuera de contexto, por no decir que es una locura. Pascal en su versi\u00f3n moderna, tambi\u00e9n llamada Object Pascal, implementa clases, gen\u00e9ricos, etc. Pero ROS2 es un gran ecosistema que se programa en C++ o Pyhton, dos lenguajes diametralmente opuestos. Pero indagando en en ROS2 descubr\u00ed que tiene un [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1257,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[69,25],"tags":[70,32,71],"class_list":["post-1250","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-divagaciones","category-pascal","tag-divagaciones","tag-free-pascal","tag-ros"],"_links":{"self":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/1250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1250"}],"version-history":[{"count":4,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/1250\/revisions"}],"predecessor-version":[{"id":1260,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/1250\/revisions\/1260"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/media\/1257"}],"wp:attachment":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}