Con el siguiente código, uso la rutina scipy.interpolate.splprep para interpolar un conjunto de puntos usando B-splines. Evidentemente, esta curva en la figura de la izquierda es bastante "aguda" cerca del punto 6: su curvatura es demasiado grande (ver la figura de la derecha).
Quiero que la curvatura se limite a <10 . Puedo mejorar esto aumentando el factor de suavidad s , por ejemplo, establecerlo en s=8 da:
Lo que satisface mi límite de curvatura. Sin embargo, actualmente tengo que encontrar este factor de suavidad s a través de prueba y error (además, una s más alta no implica necesariamente una curvatura más baja). ¿Hay alguna forma en que pueda delimitar explícitamente la curvatura? Sé que es teóricamente posible en base a esta pregunta .
Esto es solo una sugerencia, pero una cosa que es posible como alternativa al suavizado deliberado es la introducción de puntos de datos adicionales (falsos) a través de los cuales debería pasar la curva.
La condición para insertar tales puntos es detectar si hay una fuerte inversión de dirección entre dos puntos (reales) consecutivos. Esto podría hacerse comparando el ángulo entre las direcciones de los vectores que contienen dos nodos consecutivos y si este ángulo es inferior a cierto umbral, el punto se considera un punto de 'inversión'.
Una vez que se identifican dichos puntos de inversión, puede introducir puntos P (falsos), donde el número entero P depende de qué tan suave le gustaría que fueran estas transiciones. Por ejemplo, si no le importa una forma de U, puede introducir solo un punto falso por cada punto de inversión que esté ligeramente desplazado en la dirección ortogonal a la dirección de inversión.
Un método conocido es interpolar puntos utilizando rutas de Dubins . Proporciona la curva más corta entre dos curvas cualesquiera, al mismo tiempo que satisface una curvatura mínima. En este artículo se describe una implementación, llamada interpolación de Markov-Dubins .
Sin embargo, no recomiendo este enfoque porque las curvas no son suaves (hay discontinuidades en la aceleración debido a niveles fijos de curvatura).
No por el momento, al menos no en scipy. Tristemente.