{"id":11672,"date":"2026-03-23T20:39:22","date_gmt":"2026-03-23T19:39:22","guid":{"rendered":"https:\/\/bitacora.eniac2000.com\/?p=11672"},"modified":"2026-03-23T20:52:40","modified_gmt":"2026-03-23T19:52:40","slug":"diseno-y-desarrollo-de-un-entorno-de-fotogrametria-con-drones-asistido-por-ia","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=11672","title":{"rendered":"Dise\u00f1o y desarrollo de un entorno de fotogrametr\u00eda con drones asistido por IA"},"content":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 1 de 11 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<img decoding=\"async\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/Screenshot_20260322-105318-1024x461.png\" alt=\"Imagen destacada\" style=\"display: none;\">\n\n\n\n<p>Una de las tem\u00e1ticas m\u00e1s recurrentes en mi p\u00e1gina es el uso de drones. Soy un aficionado al piloto de UAS desde hace ya a\u00f1os, y tengo la titulaci\u00f3n de piloto de drones en categor\u00edas A1\/A3. Es algo que hago por afici\u00f3n, pero que me tomo en serio. Ya casi desde el principio me interes\u00f3 algo m\u00e1s que el simple hecho de volarlos para tomar v\u00eddeos e im\u00e1genes (prueba de ellos es <a href=\"https:\/\/www.youtube.com\/@javihidalgo\" data-type=\"link\" data-id=\"https:\/\/www.youtube.com\/@javihidalgo\" target=\"_blank\" rel=\"noreferrer noopener\">mi canal de YouTube<\/a>), y pronto la fotogrametr\u00eda fue algo que <a href=\"https:\/\/bitacora.eniac2000.com\/?p=5523\" data-type=\"post\" data-id=\"5523\">despert\u00f3 mi inter\u00e9s<\/a>. En su momento fue algo sobre lo que ya escrib\u00ed algunos art\u00edculos, pero en lo que tampoco pude avanzar demasiado, sobre todo por las limitaciones que ten\u00eda en lo relativo a la <a href=\"https:\/\/bitacora.eniac2000.com\/?p=5526\" target=\"_blank\" rel=\"noreferrer noopener\">aplicaci\u00f3n de captura de im\u00e1genes<\/a>, y el <a href=\"https:\/\/bitacora.eniac2000.com\/?p=5532\" target=\"_blank\" rel=\"noreferrer noopener\">entorno de procesado<\/a>.<\/p>\n\n\n\n<p>Pero ese inter\u00e9s era algo que segu\u00eda estando ah\u00ed. As\u00ed que, cuando hace algunos meses, empec\u00e9 a interesarme por el desarrollo de aplicaciones asistido por IA, la fotogrametr\u00eda fue algo que pronto escal\u00f3 puestos en mi lista de iniciativas a desarrollar. El problema principal es que los pasos iniciales que di no eran muy compatibles con las necesidades de este proyecto: el desarrollo de aplicaciones en el que estaba trabajando -con tan buenos resultados en otros \u00e1mbitos- no estaba bien alineado con lo que se requer\u00eda para esto. Y es que las aplicaciones apoyadas por IA que estaba desarrollando eran aplicaciones web, b\u00e1sicamente.<\/p>\n\n\n\n<p>Este punto era bloqueante ya que, si bien existe un SDK documentado por DJI para el manejo de sus drones que permite el desarrollo de aplicaciones ajenas a las oficiales para interactuar con diversos modelos, el uso de este SDK requer\u00eda el desarrollo de aplicaciones nativas para Android, algo que quedaba fuera del alcance de los motores de IA en los que me estaba basando. Aun as\u00ed, emple\u00e9 bastante tiempo en llegar a una soluci\u00f3n mixta, con el desarrollo de una aplicaci\u00f3n web apoyada en componentes nativos de Android, pero con resultados bastante pobres. Especialmente porque no tengo los conocimientos adecuados para el desarrollo de aplicaciones nativas en Kotlin o usando Android Suite.<\/p>\n\n\n\n<p>Pero hace algunas semanas empec\u00e9 a trabajar en una l\u00ednea distinta, que me ha abierto las puertas a poder retomar este proyecto: el uso de Anthropic y Claude Code como elemento de desarrollo asistido por IA. El desarrollo con Claude Code es algo diferencial con respecto a otros entornos que estaba utilizando. Aunque sigues teniendo que estar muy encima para controlar lo que desarrolla la IA, das instrucciones muy claras de lo que est\u00e1s buscando, y tener las capacidades adecuadas para validar que el resultado desarrollado se ajusta a las especificaciones que has definido, el salto es abismal. Sobre todo por el hecho de que <em>tambi\u00e9n<\/em> tiene capacidad para realizar despliegue y configuraci\u00f3n de elementos de infraestructura. Y esto es algo que, en mi faceta de integrador de sistemas, es clave.<\/p>\n\n\n\n<p>El caso es que, cuando confirm\u00e9 que con Claude Code pod\u00eda hacer desarrollo nativo de aplicaciones para Android, el desarrollar una aplicaci\u00f3n que fuera capaz de definir las misiones en las que realizar vuelos para escanear el \u00e1rea sobre el que realizar la fotogrametr\u00eda, tomar las im\u00e1genes conforme a las necesidades del vuelo se situaba en mis capacidades de desarrollo. Y as\u00ed lo hice.<\/p>\n\n\n\n<p>A diferencia de otras ocasiones anteriores en las que he utilizado Claude Code, en esta ocasi\u00f3n no desplegu\u00e9 un agent team, sino que realic\u00e9 una aproximaci\u00f3n de desarrollo con un \u00fanico asistente de IA, ya que el objeto no era s\u00f3lo desarrollar la aplicaci\u00f3n, sino utilizarlo como gu\u00eda de aprendizaje para el desarrollo de aplicaciones para Android. Y el caso es que esta aproximaci\u00f3n funcion\u00f3 estupendamente.<\/p>\n\n\n\n<p>En primer lugar Claude realiz\u00f3 un an\u00e1lisis de en qu\u00e9 pod\u00eda apoyar como asisntente de IA, y cu\u00e1les eran las principales dificultades del proyecto, que comparto por su inter\u00e9s:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">En qu\u00e9 puede apoyar Claude Code<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Generar el scaffolding<\/strong> inicial del proyecto en Android Studio<\/li>\n\n\n\n<li><strong>Explicar y escribir c\u00f3digo<\/strong> Java\/Kotlin paso a paso mientras aprendes<\/li>\n\n\n\n<li><strong>Interpretar la documentaci\u00f3n<\/strong> del DJI Mobile SDK (que es extensa y a veces confusa)<\/li>\n\n\n\n<li><strong>Depurar errores<\/strong> de compilaci\u00f3n y de conexi\u00f3n con el dron<\/li>\n\n\n\n<li><strong>Sugerir arquitectura<\/strong> de la app (permisos, ciclo de vida, manejo de estados)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Los retos reales del proyecto<\/h3>\n\n\n\n<p><strong>1. El DJI Mobile SDK tiene sus propias complejidades:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Requiere registro de app y una <strong>App Key<\/strong> de DJI Developer<\/li>\n\n\n\n<li>El SDK v5 (el m\u00e1s reciente) cambi\u00f3 bastante respecto al v4<\/li>\n\n\n\n<li>La conexi\u00f3n f\u00edsica requiere testear en dispositivo real (no emulador)<\/li>\n<\/ul>\n\n\n\n<p><strong>2. Android desde cero implica aprender:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kotlin o Java como lenguaje<\/li>\n\n\n\n<li>Ciclo de vida de Activities\/Fragments<\/li>\n\n\n\n<li>Manejo de permisos en tiempo de ejecuci\u00f3n (GPS, c\u00e1mara, Bluetooth, USB)<\/li>\n\n\n\n<li>Gradle y gesti\u00f3n de dependencias<\/li>\n<\/ul>\n\n\n\n<p><strong>3. El Mini 3 Pro tiene limitaciones en el SDK:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No todas las funciones avanzadas est\u00e1n disponibles para todos los modelos<\/li>\n\n\n\n<li>Necesitar\u00e1s el <strong>RC-N1<\/strong> o el <strong>RC 2<\/strong> conectado al tel\u00e9fono v\u00eda USB o Wi-Fi<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Las piezas clave del proyecto<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udd34 El desaf\u00edo central: el algoritmo de rejilla<\/h4>\n\n\n\n<p>El coraz\u00f3n de una app de fotogrametr\u00eda es el <strong>planificador de l\u00edneas de vuelo<\/strong>. Dado un pol\u00edgono en el mapa, tienes que calcular:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>L\u00edneas paralelas<\/strong> separadas seg\u00fan el overlap lateral deseado (ej. 75%)<\/li>\n\n\n\n<li><strong>Waypoints<\/strong> en cada l\u00ednea con separaci\u00f3n basada en overlap frontal y altura de vuelo<\/li>\n\n\n\n<li><strong>GSD<\/strong> (Ground Sampling Distance) calculado seg\u00fan sensor del Mini 3 Pro y altura<\/li>\n\n\n\n<li><strong>Orientaci\u00f3n \u00f3ptima<\/strong> del patr\u00f3n seg\u00fan el pol\u00edgono<\/li>\n<\/ul>\n\n\n\n<p>Claude Code puede generar este algoritmo, pero necesitar\u00e1s entender la geometr\u00eda para validarlo.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udfe0 El reto del DJI SDK v5<\/h4>\n\n\n\n<p>El Mini 3 Pro usa el <strong>SDK v5 de DJI<\/strong>, que es bastante diferente al v4. Puntos cr\u00edticos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Las misiones de waypoints usan <code>WaypointMissionManager<\/code> con archivos KMZ<\/li>\n\n\n\n<li>El trigger de c\u00e1mara puede hacerse por <strong>tiempo<\/strong> o por <strong>distancia recorrida<\/strong> (mejor para fotogrametr\u00eda)<\/li>\n\n\n\n<li>Requiere activaci\u00f3n con App Key y el dron f\u00edsico para pruebas reales<\/li>\n<\/ul>\n\n\n\n<p>Un primer an\u00e1lisis muy acertado, pero que no se qued\u00f3 ah\u00ed. Fue capaz de componer un plan de acci\u00f3n para desarrollar la aplicaci\u00f3n, y asistirme para ponerlo en pr\u00e1ctica. Plan que empezaba por desplegar Android Studio en el Mac Mini M4, y validar la instalaci\u00f3n del entorno. Por suerte, ya hab\u00eda empezado a hacer en el pasado intentos en este sentido, y ya ten\u00eda el entorno desplegado. A partir de ah\u00ed, pod\u00edamos empezar. Propuso realizar un despliegue estructurado en fases.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fase 1 &#8211; Aplicaci\u00f3n m\u00ednima<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mapa interactivo<\/strong> con tiles de OpenStreetMap v\u00eda MapLibre GL<\/li>\n\n\n\n<li><strong>Dibujo de pol\u00edgonos<\/strong> para definir el \u00e1rea de inter\u00e9s<\/li>\n\n\n\n<li><strong>Configuraci\u00f3n de par\u00e1metros de vuelo<\/strong>: altura, overlap frontal\/lateral, velocidad, orientaci\u00f3n de pasadas<\/li>\n\n\n\n<li><strong>Selector 2D\/3D<\/strong>: rejilla simple (ortomosaico) o doble rejilla cross-hatch (modelo 3D)<\/li>\n\n\n\n<li><strong>C\u00e1lculo autom\u00e1tico<\/strong> de GSD, grilla de waypoints, n\u00famero de fotos, duraci\u00f3n estimada y bater\u00eda necesaria<\/li>\n\n\n\n<li><strong>Preview visual<\/strong> de las l\u00edneas de vuelo sobre el mapa (actualizaci\u00f3n en tiempo real)<\/li>\n\n\n\n<li><strong>Persistencia local<\/strong>: guardar, cargar y eliminar misiones con Room\/SQLite<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Fase 2 \u2014 Ejecuci\u00f3n con el dron<a href=\"https:\/\/github.com\/i82hisaj\/DJIPhotogrammetryPlanner?tab=readme-ov-file#fase-2--ejecuci\u00f3n-con-el-dron\"><\/a><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Integraci\u00f3n con DJI Mobile SDK v5<\/li>\n\n\n\n<li>Conexi\u00f3n y estado del dron en tiempo real<\/li>\n\n\n\n<li>Upload de misi\u00f3n y ejecuci\u00f3n autom\u00e1tica<\/li>\n\n\n\n<li>Trigger de c\u00e1mara por distancia<\/li>\n\n\n\n<li>Telemetr\u00eda en vivo y vista FPV<\/li>\n\n\n\n<li>RTH autom\u00e1tico ante baja bater\u00eda<\/li>\n\n\n\n<li>Capas de mapa adicionales: ortofotos SIGPAC y mapas del Catastro de Espa\u00f1a (WMS\/WMTS)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Fase 3 \u2014 Integraci\u00f3n cloud<a href=\"https:\/\/github.com\/i82hisaj\/DJIPhotogrammetryPlanner?tab=readme-ov-file#fase-3--integraci\u00f3n-cloud\"><\/a><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Upload de im\u00e1genes a WebODM v\u00eda API REST<\/li>\n\n\n\n<li>Configuraci\u00f3n del servidor WebODM<\/li>\n\n\n\n<li>Seguimiento del procesamiento<\/li>\n\n\n\n<li>Notificaci\u00f3n de modelo listo<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Mejoras futuras planificadas<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/i82hisaj\/DJIPhotogrammetryPlanner?tab=readme-ov-file#mejoras-futuras-planificadas\"><\/a>Soporte para m\u00faltiples drones<\/li>\n\n\n\n<li>Integraci\u00f3n con una plataforma de gesti\u00f3n de misiones<\/li>\n<\/ul>\n\n\n\n<p>Un plan bastante completo. Pero&#8230; \u00bfera realista? Bueno, creo que una imagen vale m\u00e1s que mil palabras:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"461\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/Screenshot_20260322-105318-1024x461.png\" alt=\"Captura de la interfaz de usuario de la aplicaci\u00f3n\" class=\"wp-image-11681\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/Screenshot_20260322-105318-1024x461.png 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/Screenshot_20260322-105318-300x135.png 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/Screenshot_20260322-105318-768x346.png 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/Screenshot_20260322-105318-1536x691.png 1536w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/Screenshot_20260322-105318-2048x922.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Captura de la interfaz de usuario de la aplicaci\u00f3n<\/figcaption><\/figure>\n\n\n\n<p>En pr\u00f3ximos art\u00edculos seguiremos hablando del proceso de desarrollo seguido, las dificultades encontradas, y c\u00f3mo las resolv\u00ed. Pero como adelanto dejo el resultado del procesado fotogram\u00e9trico de esta misi\u00f3n, en forma de representaci\u00f3n 3D:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"617\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/IMG-20260322-WA0005-1024x617.jpg\" alt=\"Reconstrucci\u00f3n en 3D mediante nube de puntos\" class=\"wp-image-11675\" srcset=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/IMG-20260322-WA0005-1024x617.jpg 1024w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/IMG-20260322-WA0005-300x181.jpg 300w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/IMG-20260322-WA0005-768x463.jpg 768w, https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2026\/03\/IMG-20260322-WA0005.jpg 1506w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Reconstrucci\u00f3n en 3D mediante nube de puntos<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 1 de 11 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>Una de las tem\u00e1ticas m\u00e1s recurrentes en mi p\u00e1gina es<\/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":[13],"tags":[106,1958,1954,537,551,824],"series":[1957],"class_list":["post-11672","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-android","tag-claude","tag-dji","tag-dji-mini-3-pro","tag-dron","tag-ia","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\/11672","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=11672"}],"version-history":[{"count":6,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11672\/revisions"}],"predecessor-version":[{"id":11688,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/11672\/revisions\/11688"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11672"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=11672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}