{"id":11878,"date":"2026-06-10T23:26:34","date_gmt":"2026-06-10T21:26:34","guid":{"rendered":"https:\/\/bitacora.eniac2000.com\/?p=11878"},"modified":"2026-06-10T23:26:37","modified_gmt":"2026-06-10T21:26:37","slug":"fotogrametria-asistida-con-ia-pruebas-de-campo-cuando-el-firmware-no-hace-lo-que-promete","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=11878","title":{"rendered":"Fotogrametr\u00eda asistida con IA: Pruebas de campo. Cuando el firmware no hace lo que promete"},"content":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 13 de 13 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=fotogrametria-asistida-por-ia\" class=\"series-1957\" title=\"Fotogrametr\u00eda asistida por IA\">Fotogrametr\u00eda asistida por IA<\/a><\/div>\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"478\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/primera-fotogrametria-1024x478.png\" alt=\"\" class=\"wp-image-11887\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/primera-fotogrametria-1024x478.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/primera-fotogrametria-300x140.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/primera-fotogrametria-768x358.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/primera-fotogrametria-1536x716.png 1536w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/primera-fotogrametria.png 1576w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Reconstrucci\u00f3n fotogram\u00e9trica en 3D de una zona residencial. Jardines y h\u00f3rreos<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La <a href=\"https:\/\/bitacora.eniac2000.com\/?p=11828\">Fase 9<\/a> dej\u00f3 el sistema completo sobre el papel: planificaci\u00f3n, vuelo aut\u00f3nomo, detecci\u00f3n de objetos a dos niveles y procesamiento fotogram\u00e9trico en el servidor. Pero entre un sistema completo sobre el papel y uno en el que conf\u00edas cuando el dron est\u00e1 a 40 metros de altura hay una distancia considerable, y este art\u00edculo va exactamente de recorrerla. Lo que viene a continuaci\u00f3n es la cr\u00f3nica de una serie de pruebas que incluyen vuelos de producci\u00f3n, una revisi\u00f3n de c\u00f3digo que destap\u00f3 un problema serio de seguridad, el dise\u00f1o de un sistema de recuperaci\u00f3n ante fallos, y dos sesiones de pruebas de campo con catorce vuelos que demostraron algo que ya sospechaba: el <em>firmware<\/em> de DJI tiene opiniones propias, y no siempre coinciden con la documentaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Los primeros vuelos de producci\u00f3n: el <em>gimbal<\/em> que ignoraba las fachadas<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"692\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/problema-fachadas-transparentes-1024x692.png\" alt=\"\" class=\"wp-image-11884\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/problema-fachadas-transparentes-1024x692.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/problema-fachadas-transparentes-300x203.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/problema-fachadas-transparentes-768x519.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/problema-fachadas-transparentes.png 1079w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">El problema de las fachadas transparentes<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A principios de junio hice las dos primeras misiones reales con intenci\u00f3n de producir resultados, y no de simplemente probar la aplicaci\u00f3n: fotogrametr\u00eda de dos viviendas y sus respectivas parcelas en la zona de Pontevedra. La primera dej\u00f3 una lecci\u00f3n inmediata: para las misiones de modelo 3D, la aplicaci\u00f3n calculaba un \u00e1ngulo de gimbal de -73,5 grados \u2014 casi cenital. El resultado en OpenDroneMap fue revelador: los edificios sal\u00edan planos, como mont\u00edculos sin fachadas. La c\u00e1mara nunca llegaba a verlas. La correcci\u00f3n fue hacer el \u00e1ngulo dependiente de la altitud, interpolando entre -50 grados a baja altura (fachadas cercanas, hace falta mucha inclinaci\u00f3n) y -65 a gran altura (cobertura amplia sin desperdiciar imagen en el horizonte).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"488\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fachadas-a-51-grados-gimbal-1024x488.png\" alt=\"\" class=\"wp-image-11885\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fachadas-a-51-grados-gimbal-1024x488.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fachadas-a-51-grados-gimbal-300x143.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fachadas-a-51-grados-gimbal-768x366.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fachadas-a-51-grados-gimbal-1536x732.png 1536w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fachadas-a-51-grados-gimbal.png 1555w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Una mejora evidente en la representaci\u00f3n de las fachadas<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Con el <em>gimbal<\/em> corregido, la siguiente misi\u00f3n fue otra historia: 186 waypoints a 20 metros, 173 fotos, y un resultado de ODM que no esperaba tan pronto \u2014 el 100% de las im\u00e1genes reconstruidas, una nube densa de 25,9 millones de puntos, GSD de 0,8 cm\/p\u00edxel y un error 3D relativo de 8 cent\u00edmetros. Los tejados se distinguen teja a teja.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"981\" height=\"786\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/detalle-tejado.png\" alt=\"\" class=\"wp-image-11886\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/detalle-tejado.png 981w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/detalle-tejado-300x240.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/detalle-tejado-768x615.png 768w\" sizes=\"auto, (max-width: 981px) 100vw, 981px\" \/><figcaption class=\"wp-element-caption\">Un buen nivel de detalle del tejado<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Los vuelos reales tambi\u00e9n sirvieron para calibrar la estimaci\u00f3n de bater\u00eda, que ven\u00eda siendo optimista. La especificaci\u00f3n del Mini 3 Pro promete 34 minutos de vuelo (un consumo te\u00f3rico del 2,94% por minuto), pero la realidad, medida en tres vuelos, fue un 4% por minuto clavado. El factor de correcci\u00f3n de la f\u00f3rmula que calcula la cantidad de bater\u00eda necesaria por misi\u00f3n pas\u00f3 de 1,15 a 1,45, y desde entonces la estimaci\u00f3n acierta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Una revisi\u00f3n de c\u00f3digo con ojos nuevos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Con el sistema ya volando misiones reales, le ped\u00ed a Claude una revisi\u00f3n completa del c\u00f3digo y la documentaci\u00f3n: calidad, bugs, mejoras y deuda pendiente, usando para ello el reci\u00e9n estrenado modelo de IA Claude Fable (del que hablaremos m\u00e1s adelante). El veredicto general fue amable (la arquitectura aguanta bien), pero la lista de hallazgos inclu\u00eda uno que me quit\u00f3 la tranquilidad de golpe.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_cb1akpcb1akpcb1a-1024x559.png\" alt=\"\" class=\"wp-image-11889\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_cb1akpcb1akpcb1a-1024x559.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_cb1akpcb1akpcb1a-300x164.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_cb1akpcb1akpcb1a-768x419.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_cb1akpcb1akpcb1a.png 1408w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Problem\u00e1ticas encontradas. Generado con IA<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">El Mini 3 Pro no soporta misiones <em>onboard<\/em>, as\u00ed que toda la navegaci\u00f3n va por Virtual Stick: la app env\u00eda comandos de velocidad veinte veces por segundo, simulando los controles del mando. El detalle cr\u00edtico es que, mientras Virtual Stick est\u00e1 activo, <strong>la autoridad de control la tiene la app y los sticks f\u00edsicos del mando no responden<\/strong>. \u00bfY qu\u00e9 pasaba si la misi\u00f3n lanzaba una excepci\u00f3n en pleno vuelo, como un <em>timeout<\/em> de GPS, por ejemplo? Pues que el c\u00f3digo capturaba el error, pintaba \u00abERROR\u00bb en la pantalla\u2026 y nada m\u00e1s. El dron se quedaba flotando con el control autom\u00e1tico activo, los sticks bloqueados, y sin que la app hiciera absolutamente nada por recuperarlo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hab\u00eda m\u00e1s: los bucles de navegaci\u00f3n no ten\u00edan vigilancia de progreso (si el viento superaba la velocidad de crucero, la app insistir\u00eda contra el viento para siempre), el monitor de bater\u00eda arrancaba tarde, una tabla de la base de datos crec\u00eda sin purgarse jam\u00e1s, y ni un solo test en todo el proyecto. Pero el agujero de la recuperaci\u00f3n era el que importaba.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dise\u00f1ando la recuperaci\u00f3n: el matiz que lo cambia todo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mi primera intuici\u00f3n fue implementar que, si algo falla, el dron ha de quedar en modo sobrevuelo con el Virtual Stick activo para que yo pueda hacer maniobras de emergencia con el mando. Claude me corrigi\u00f3 el modelo mental, y menos mal: es exactamente al rev\u00e9s. Virtual Stick activo significa mandos bloqueados. Si quieres devolverle el control al piloto, lo que hay que hacer es <em>desactivar<\/em> Virtual Stick. De esa conversaci\u00f3n sali\u00f3 el dise\u00f1o definitivo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Error en vuelo con GPS v\u00e1lido<\/strong>: El dron queda en <em>hover<\/em> activo y arranca una cuenta atr\u00e1s de 10 segundos hacia un RTH autom\u00e1tico. Si no toco nada, vuelve solo a casa. Si prefiero decidir yo, la cancelo y elijo entre RTH, control manual o salir.<\/li>\n\n\n\n<li><strong>Error sin GPS<\/strong>: El RTH de <em>firmware<\/em> no puede navegar sin GPS, as\u00ed que no hay cuenta atr\u00e1s que valga. La aplicaci\u00f3n libera el control inmediatamente y me avisa con vibraci\u00f3n para que aterrice a mano.<\/li>\n\n\n\n<li><strong><em>Watchdogs<\/em><\/strong>: Si el ascenso no progresa en 15 segundos o el dron no se acerca al <em>waypoint<\/em> en 30, la misi\u00f3n aborta sola y entra en el flujo anterior. Se acabaron los bucles infinitos contra el viento.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_nth487nth487nth4-1024x559.png\" alt=\"\" class=\"wp-image-11890\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_nth487nth487nth4-1024x559.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_nth487nth487nth4-300x164.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_nth487nth487nth4-768x419.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_nth487nth487nth4.png 1408w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Imagen figurativa del proceso de recuperaci\u00f3n. Generada por IA<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Todo esto se implement\u00f3 y se prob\u00f3 en el tel\u00e9fono el mismo d\u00eda, incluyendo una prueba preliminar que no necesit\u00f3 dron: pulsar \u00abVolar\u00bb sin nada conectado hace que Virtual Stick falle tras tres intentos, y la recuperaci\u00f3n entr\u00f3 limpia por el camino de \u00aberror en tierra\u00bb. Pero el resto solo pod\u00eda validarse volando. As\u00ed que prepar\u00e9 un guion de pruebas de campo: quince pruebas numeradas, con sus precondiciones, sus resultados esperados y su presupuesto de bater\u00edas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Catorce vuelos y un descubrimiento inc\u00f3modo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En la primera sesi\u00f3n de validaci\u00f3n realic\u00e9 seis vuelos. El n\u00facleo funcion\u00f3 a la primera: parada de emergencia con <em>hover<\/em> estable y RTH limpio, control manual con los sticks respondiendo al instante, y el <em>watchdog<\/em> aguantando sin falsos positivos una pausa deliberada de 46 segundos en mitad de una l\u00ednea de vuelo. Pero la prueba T3 (pulsar el bot\u00f3n Pausa del mando durante la navegaci\u00f3n aut\u00f3noma) fall\u00f3 de la manera m\u00e1s inquietante posible: <strong>el dron la ignor\u00f3 por completo<\/strong>. Tres pulsaciones y la misi\u00f3n sigui\u00f3 como si nada.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_8n9aea8n9aea8n9a-1024x559.png\" alt=\"\" class=\"wp-image-11892\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_8n9aea8n9aea8n9a-1024x559.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_8n9aea8n9aea8n9a-300x164.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_8n9aea8n9aea8n9a-768x419.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_8n9aea8n9aea8n9a.png 1408w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Representaci\u00f3n conceptual de algunos de los hallazgos. Generada por IA<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Esto invalidaba una suposici\u00f3n de seguridad que yo daba por s\u00f3lida (y que la documentaci\u00f3n del SDK sugiere): que los botones f\u00edsicos del mando <strong>siempre<\/strong> interrumpen el control autom\u00e1tico. En el Mini 3 Pro con el mando RC-N1, no. Ni el bot\u00f3n Pausa ni los mandos. Si la aplicaci\u00f3n pierde el control y t\u00fa no tienes la app a mano, no hay escape\u2026 salvo el bot\u00f3n RTH dedicado, que afortunadamente s\u00ed funciona, algo que confirm\u00e9 de nuevo en la segunda sesi\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La soluci\u00f3n vino de un detalle del SDK: aunque las acciones del controlador son ignoradas durante el vuelo, <em>sus activaciones s\u00ed llegan a la aplicaci\u00f3n<\/em> como telemetr\u00eda del mando. As\u00ed que la soluci\u00f3n era directa: hacer que la aplicaci\u00f3n escuche dichas actuaciones durante la misi\u00f3n, de tal manera que si se mueve un control con decisi\u00f3n (m\u00e1s del 30% del recorrido, para evitar activaciones accidentales), la aplicaci\u00f3n cancela la misi\u00f3n, libera Virtual Stick y me devuelve el control en el acto. El bot\u00f3n de pausa que el <em>firmware<\/em> se niega a respetar, reconstruido por software.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La misi\u00f3n que se complet\u00f3 en quince milisegundos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La prueba T11 era de regresi\u00f3n: agotar la bater\u00eda hasta el umbral de RTH autom\u00e1tico, cambiarla y reanudar la misi\u00f3n. El RTH salt\u00f3 exactamente al 30%, en el <em>waypoint<\/em> 26 de 27. Hasta ah\u00ed, perfecto. Pero al reanudar, el dron subi\u00f3 a 40 metros (yo hab\u00eda volado a 20, con un cambio de configuraci\u00f3n que no guard\u00e9), lleg\u00f3 a altitud\u2026 y ejecut\u00f3 un RTH inmediato dando la misi\u00f3n por terminada.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"687\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/3ADbo-1024x687.jpg\" alt=\"\" class=\"wp-image-11893\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/3ADbo-1024x687.jpg 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/3ADbo-300x201.jpg 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/3ADbo-768x516.jpg 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/3ADbo.jpg 1168w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Cambio del recorrido de la misi\u00f3n ante el cambio de bater\u00eda. Generado por IA<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">El an\u00e1lisis de los registros de vuelo con Claude lo dej\u00f3 cristalino, y con una precisi\u00f3n asombrosa: entre \u00abIniciando navegaci\u00f3n\u00bb y \u00abMisi\u00f3n completada\u00bb pasaron <strong>quince milisegundos<\/strong>. La causa era un fallo de dise\u00f1o que ning\u00fan test de laboratorio habr\u00eda encontrado: el progreso de reanudaci\u00f3n se guarda como un \u00edndice (\u00abibas por el waypoint 26\u00bb), pero la rejilla de <em>waypoints<\/em> se recalcula al cargar la misi\u00f3n a partir del pol\u00edgono y la configuraci\u00f3n. Mi vuelo a 20 metros gener\u00f3 27 <em>waypoints<\/em>; la configuraci\u00f3n guardada, a 40 metros, generaba solo 7. \u00cdndice 26 sobre una lista de 7: el bucle se salt\u00f3 todos los <em>waypoints<\/em> y finaliz\u00f3 la misi\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La correcci\u00f3n tiene tres capas: la configuraci\u00f3n con la que realmente vuelas se persiste al despegar, el total de <em>waypoints<\/em> del plan se guarda junto al progreso, y al reanudar se valida que ambas rejillas coincidan y, en caso de no hacerlo, la aplicaci\u00f3n desactiva la reanudaci\u00f3n y te explica por qu\u00e9, en lugar de despegar para nada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El l\u00edmite de altura fantasma<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para probar el <em>watchdog<\/em> de ascenso de forma segura y reproducible se me ocurri\u00f3 un truco: limitar la altura m\u00e1xima del dron a 20 metros en la aplicaci\u00f3n oficial de DJI Fly y configurar la misi\u00f3n a 40. El dron se clavar\u00eda en el l\u00edmite, el <em>watchdog<\/em> saltar\u00eda a los 15 segundos, y podr\u00eda ver la cuenta atr\u00e1s de RTH en condiciones controladas. Pues bien: configur\u00e9 el l\u00edmite en DJI Fly, lo verifiqu\u00e9, vol\u00e9\u2026 y el dron subi\u00f3 a 40 metros sin inmutarse. <strong>El l\u00edmite configurado en DJI Fly nunca lleg\u00f3 a persistirse en el dron.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_i8y5xsi8y5xsi8y5-1024x559.png\" alt=\"\" class=\"wp-image-11894\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_i8y5xsi8y5xsi8y5-1024x559.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_i8y5xsi8y5xsi8y5-300x164.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_i8y5xsi8y5xsi8y5-768x419.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_i8y5xsi8y5xsi8y5.png 1408w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">El problema de la altura fantasma. Generado por IA<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La alternativa fue gestionar el l\u00edmite desde la propia aplicaci\u00f3n, escribi\u00e9ndolo directamente al mando del dron por el SDK y reley\u00e9ndolo para confirmar que est\u00e1 aplicado. Con eso, la prueba sali\u00f3 de libro: el dron se clav\u00f3 en 20 metros, a los 15 segundos salt\u00f3 \u00abAscenso estancado\u00bb, vibr\u00f3 el tel\u00e9fono, apareci\u00f3 la cuenta atr\u00e1s\u2026 y exactamente 10 segundos despu\u00e9s (los logs lo certifican: 16:16:10 \u2192 16:16:20) el dron inici\u00f3 el retorno autom\u00e1tico. Repet\u00ed el escenario cancelando la cuenta atr\u00e1s, tomando el control manual, y pulsando RTH a mitad de cuenta, todo seg\u00fan lo dise\u00f1ado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pero el firmware guardaba una \u00faltima sorpresa: <strong>el l\u00edmite de altura vuelve solo a 120 metros despu\u00e9s de cada misi\u00f3n<\/strong>. Y tambi\u00e9n al reiniciar el dron. El valor que escribe el SDK es, simplemente, vol\u00e1til. Como no puedo arreglar el <em>firmware<\/em>, la aplicaci\u00f3n lo compensa: guarda el l\u00edmite que t\u00fa quieres, lo relee antes de cada despegue, lo reaplica si el mando lo ha reseteado, y si la misi\u00f3n planificada supera el l\u00edmite efectivo, aborta en tierra con un mensaje claro en lugar de descubrirlo a 20 metros de altura.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1.573 puntos de telemetr\u00eda en el limbo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El \u00faltimo hallazgo no fue del <em>firmware<\/em> sino de mi propio dise\u00f1o. El m\u00f3dulo de auditor\u00eda env\u00eda la posici\u00f3n del dron al servidor cada segundo durante el vuelo y, cuando no hay red, guarda un registro temporal de los puntos en el tel\u00e9fono para enviarlos despu\u00e9s. Suena bien hasta que haces la pregunta correcta: \u00bfcu\u00e1ndo es \u00abdespu\u00e9s\u00bb? El env\u00edo s\u00f3lo corr\u00eda durante la misi\u00f3n, y el servidor s\u00f3lo es accesible desde la red de casa, ya que hay que suponer que en el campo puede no haber conexi\u00f3n. Resultado: 1.573 puntos de telemetr\u00eda acumulados desde el primer vuelo de pruebas de la serie, sin que nadie los fuera a enviar jam\u00e1s.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_x2sakox2sakox2sa-1024x559.png\" alt=\"\" class=\"wp-image-11895\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_x2sakox2sakox2sa-1024x559.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_x2sakox2sakox2sa-300x164.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_x2sakox2sakox2sa-768x419.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_x2sakox2sakox2sa.png 1408w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Cuando la telemetr\u00eda se queda en el limbo. Generado por IA<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Claude propuso la soluci\u00f3n obvia: un worker que lo env\u00ede todo autom\u00e1ticamente al detectar red, y aqu\u00ed fui yo quien corrigi\u00f3 el dise\u00f1o: <strong>no quiero que todo se suba solo<\/strong>. El procesamiento fotogram\u00e9trico ya es deliberadamente manual (yo decido qu\u00e9 misiones pasan por ODM), y la telemetr\u00eda debe seguir el mismo criterio. El modelo final tiene dos v\u00edas: un bot\u00f3n en <em>Opciones<\/em> que muestra cu\u00e1nto hay pendiente (\u00ab1.573 puntos de 14 vuelos\u00bb) y lo env\u00eda cuando yo quiera, y un env\u00edo oportunista que adjunta la telemetr\u00eda de una misi\u00f3n concreta cuando decido procesar sus fotos: si esa misi\u00f3n va al servidor, su trayectoria viaja con ella.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El primer env\u00edo real, por cierto, destap\u00f3 un <em>bug<\/em> m\u00e1s: el servidor rechazaba la telemetr\u00eda de vuelos que no constaban en su base de datos, y los vuelos de campo (sin red) nunca hab\u00edan llegado a registrarse. El flujo ahora registra cada vuelo antes de enviar sus puntos (la operaci\u00f3n es idempotente, as\u00ed que repetirla es inocua). Resultado verificado: <em>buffer<\/em> a cero y las trayectorias de los 14 vuelos de campo visibles en el visor del servidor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Claude Fable 5: El Cerebro de la Bestia<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si algo define esta etapa del proyecto es la velocidad del ciclo <em>campo\u2013an\u00e1lisis\u2013correcci\u00f3n<\/em>. Volv\u00ed de la primera sesi\u00f3n con seis vuelos y un pu\u00f1ado de fallos anotados; conect\u00e9 el tel\u00e9fono, y Claude descarg\u00f3 los registros de vuelo, cruz\u00f3 mis observaciones con las marcas de tiempo y diagnostic\u00f3 las tres causas ra\u00edz, incluyendo un desfase num\u00e9rico de presentaci\u00f3n de los <em>waypoints<\/em>, que result\u00f3 no ser un <em>bug<\/em> de l\u00f3gica sino tres vistas usando dos convenciones distintas de numeraci\u00f3n. Las correcciones estaban implementadas, probadas en el dispositivo y subidas al repositorio antes de la segunda sesi\u00f3n de vuelo, esa misma tarde. El mismo d\u00eda: <em>bugs<\/em> encontrados en el campo por la ma\u00f1ana, corregidos a mediod\u00eda, validados en el aire por la tarde.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fable5-1024x576.webp\" alt=\"\" class=\"wp-image-11888\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fable5-1024x576.webp 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fable5-300x169.webp 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fable5-768x432.webp 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fable5-1536x864.webp 1536w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/06\/fable5-2048x1152.webp 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Claude Fable 5. Imagen oficial<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Hay un detalle de contexto que merece menci\u00f3n: toda esta etapa la ha llevado <strong>Claude Fable 5<\/strong>, el modelo que Anthropic <a href=\"https:\/\/www.anthropic.com\/news\/claude-fable-5-mythos-5\">lanz\u00f3 el 9 de junio<\/a>, literalmente la v\u00edspera de las pruebas de campo. Fable 5 es el primer modelo de clase <em>Mythos<\/em> disponible al p\u00fablico: Mythos 5, su hermano sin restricciones en \u00e1reas de ciberseguridad, queda reservado a un grupo reducido de especialistas en ciberseguridad, y Fable es esa misma base con salvaguardas para uso general. Es un escal\u00f3n por encima de Opus, hasta ahora el tope de gama. En la pr\u00e1ctica, para este proyecto se not\u00f3 en dos cosas: el mill\u00f3n de <em>tokens<\/em> de contexto permiti\u00f3 que la revisi\u00f3n completa del c\u00f3digo (12.500 l\u00edneas), el an\u00e1lisis de los flight logs y las correcciones convivieran en una sola sesi\u00f3n de trabajo sin perder el hilo, y el razonamiento adaptativo hizo el ciclo de diagn\u00f3stico (como cazar los 15 milisegundos de la reanudaci\u00f3n fantasma cruzando tres logs) notablemente m\u00e1s fino que en fases anteriores de la serie. No es un anuncio: es la constataci\u00f3n de que la herramienta tambi\u00e9n ha ido evolucionando debajo del proyecto mientras el proyecto evolucionaba sobre ella.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n hubo una cura de humildad para la IA, que me parece justo contar. Entre los hallazgos de la revisi\u00f3n de c\u00f3digo hab\u00eda uno aparentemente de manual: el mapa de MapLibre no recib\u00eda los eventos de ciclo de vida de Android, algo que toda la documentaci\u00f3n recomienda corregir. Claude lo \u00abcorrigi\u00f3\u00bb\u2026 y el mapa dej\u00f3 de renderizar por completo. Hicieron falta cuatro builds comparativos para aislar que MapLibre 11.8 gestiona su <em>render<\/em> autom\u00e1ticamente y que cualquier integraci\u00f3n manual del ciclo de vida (incluso la m\u00e1s m\u00ednima) rompe la carga del estilo. La soluci\u00f3n correcta era no tocar nada, y dejarlo escrito en el c\u00f3digo para que nadie lo reintente. La lecci\u00f3n vale para humanos y para modelos: lo que la teor\u00eda recomienda no siempre sobrevive al contacto con el dispositivo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resultado final<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El guion de pruebas termin\u00f3 con un estupendo resultado de 15 sobre 15. La doctrina de seguridad del sistema qued\u00f3 validada en vuelo real y dice as\u00ed: durante la navegaci\u00f3n aut\u00f3noma hay tres v\u00edas de escape, que son el bot\u00f3n de emergencia de la app, mover un control del mando (la aplicaci\u00f3n lo detecta y libera el control), y el bot\u00f3n RTH f\u00edsico. El bot\u00f3n Pausa del mando, oficialmente inerte. Si algo falla en el aire, el dron queda en <em>hover<\/em> y vuelve solo a casa en 10 segundos salvo que yo decida otra cosa; si falla el GPS, me devuelve los controles al instante. Y todos los descubrimientos -el l\u00edmite vol\u00e1til, el bot\u00f3n fantasma, la misi\u00f3n de los 15 milisegundos- est\u00e1n documentados en el registro de pruebas del repositorio, con sus registros de vuelo como evidencia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La aplicaci\u00f3n, que empez\u00f3 esta serie planificando rejillas sobre un mapa, ahora sobrevive a sus propios errores, desconf\u00eda del <em>firmware<\/em> con conocimiento de causa, y ha producido su primer modelo 3D de calidad: 25,9 millones de puntos con 8 cent\u00edmetros de error. Para lo que viene, hay dos caminos abiertos: la Fase 10 (multi-dron, capas WMS del Catastro y SIGPAC, mejoras de UX) y una Fase 11 de endurecimiento (tests unitarios del motor de c\u00e1lculo, seguridad del servidor y deuda t\u00e9cnica) que la revisi\u00f3n de c\u00f3digo dej\u00f3 perfectamente inventariada. Pero eso ser\u00e1 otro art\u00edculo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 13 de 13 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=fotogrametria-asistida-por-ia\" class=\"series-1957\" title=\"Fotogrametr\u00eda asistida por IA\">Fotogrametr\u00eda asistida por IA<\/a><\/div><p>La Fase 9 dej\u00f3 el sistema completo sobre el papel:<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1845,13],"tags":[1959,537,551,1998,673,2000,1999],"series":[1957],"class_list":["post-11878","post","type-post","status-publish","format-standard","hentry","category-generado-con-ia","category-informatica","tag-claude-code","tag-dji-mini-3-pro","tag-dron","tag-fable-5","tag-firmware","tag-msdk","tag-virtual-stick","series-fotogrametria-asistida-por-ia"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11878"}],"version-history":[{"count":7,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11878\/revisions"}],"predecessor-version":[{"id":11896,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11878\/revisions\/11896"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11878"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=11878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}