← Índice del curso

Robótica y Automatización · Tema 17

Perfiles de velocidad

Un robot que arranca y frena de golpe patina, tironea o pierde pasos. Vamos a planificar la velocidad con una aceleración limitada: fase de aceleración, crucero y frenado, calculando tiempos y distancias antes de mover nada.

01 · Punto de partida

De la posición a la velocidad

En el tema 16 suavizamos la posición de un servo: la referencia avanzaba con una velocidad máxima o con una forma cúbica. Ahora cambiamos el punto de vista y planificamos directamente la velocidad de un actuador que recorre una distancia: las ruedas de un robot móvil, un eje con motor paso a paso o un carro lineal.

La variable que se limita es la aceleración. Un perfil de velocidad es una función v(t) cuya pendiente nunca supera un valor a elegido y cuyo área bajo la curva es la distancia que queremos recorrer.

Seguimos en lazo abierto: el perfil es una orden bien formada, no una garantía de que el robot la cumpla. El tema 18 incorpora encoders para medir y corregir.

02 · El problema

Por qué limitar la aceleración

Pedir una velocidad de golpe equivale, en el instante inicial, a una aceleración enorme. Según el actuador, eso se manifiesta de maneras distintas:

Efectos habituales de arrancar o frenar sin rampa.
SistemaQué puede pasarQué lo evita
Robot móvil con ruedasDeslizamiento de las ruedas, cabeceo, carga que se desplaza y odometría falsaAceleración por debajo del límite de adherencia, con margen
Motor paso a pasoPérdida de pasos o calado: el rotor no alcanza a seguir el campo (tema 14)Rampa de frecuencia desde una velocidad de arranque tolerable
Motor DC con driverPico de corriente, caída de tensión y reinicios del controlador (temas 11 a 13)Variación gradual de la orden de velocidad
Mecanismo con holgura o correasGolpes, vibración y desgasteAceleración y frenado graduales

Frenar de golpe es tan problemático como arrancar: la inercia del robot y de su carga no desaparece al cortar la orden. Un perfil responsable planifica los dos extremos.

Los valores concretos de aceleración admisible no salen de una fórmula universal: dependen de la masa, la adherencia, el torque disponible y la mecánica. Por eso este tema da el método y los cálculos, y deja los números para medir en el robot.

03 · Tres fases

El perfil trapezoidal

El perfil trapezoidal acelera con aceleración constante a hasta la velocidad máxima vmáx, mantiene esa velocidad y frena con la misma magnitud de aceleración. El gráfico de velocidad contra tiempo tiene forma de trapecio.

Perfil trapezoidal de velocidad La velocidad sube linealmente de cero a la velocidad máxima durante el tiempo de aceleración, se mantiene constante durante el crucero y baja linealmente a cero durante el frenado. El área bajo la curva es la distancia recorrida. Aceleraciónpendiente +aCrucerov constante = v máxFrenadopendiente −atatctdv máx0tÁrea = distancia recorrida

Con distancia D, velocidad máxima v y aceleración a, las fases del perfil simétrico son:

ta = td = v / a    da = dd = v² / (2a)
dc = D − v² / a    tc = dc / v    T = ta + tc + td = D / v + v / a

La distancia de aceleración sale del área de un triángulo: ½ · v · ta = v²/(2a). Un ejemplo: D = 100 cm, v = 40 cm/s y a = 50 cm/s². Aceleración: 0,8 s y 16 cm. Crucero: (100 − 32)/40 = 1,7 s. Total: 3,3 s, que coincide con 100/40 + 40/50 = 3,3 s.

El segundo término, v/a, es el costo en tiempo de arrancar y frenar con suavidad. Mientras el crucero domina, subir a mejora poco el tiempo total.

04 · Distancias cortas

Cuando no alcanza la velocidad máxima

Si la distancia es menor que v²/a, no hay espacio para acelerar hasta vmáx y frenar. El crucero desaparece: el perfil sube hasta un pico y baja enseguida. Es el perfil triangular.

Condición: D < vmáx² / a
vpico = √(a · D)    T = 2 · √(D / a)

Con los mismos límites del ejemplo anterior (40 cm/s y 50 cm/s²), v²/a = 32 cm. Para D = 20 cm el pico es √(50·20) ≈ 31,6 cm/s y la duración 2·√(20/50) ≈ 1,26 s. Nunca se llega a 40 cm/s.

Esta rama debe estar en el código: un cálculo que siempre supone crucero produciría una duración de crucero negativa cuando D < v²/a. El diagnóstico más simple es comparar D con v²/a antes de seguir.

La asimetría (aceleración de arranque distinta de la de frenado) y el caso de arrancar con velocidad inicial no nula siguen la misma lógica, con dos aceleraciones distintas. Conviene empezar con el caso simétrico y reposo a reposo.

05 · De dónde sale el número

Límites físicos: adherencia y torque

La aceleración elegida debe caber dentro de lo que el sistema puede transmitir al suelo o a la carga. Hay tres cotas habituales:

  • Adherencia. La fuerza de tracción máxima es μ · N. En suelo horizontal, con todo el peso apoyado sobre ruedas tractoras, amáx ≈ μ · g. Con μ = 0,5 son unos 4,9 m/s². Con tracción en solo una parte de las ruedas, o con el peso trasladándose al frenar o acelerar, el valor real es menor.
  • Torque del actuador. El motor debe entregar la fuerza m · a más la que pidan fricción y pendiente, a la velocidad en que se trabaja. La curva torque–velocidad (tema 14 para paso a paso) suele empeorar al subir la velocidad.
  • Estabilidad de la carga. Un objeto alto o poco sujeto puede deslizar o volcar antes de que las ruedas patinen. Depende de su geometría y de su apoyo.

La menor de esas cotas manda, y se la reduce con un margen de seguridad. El coeficiente μ varía mucho con el suelo, el estado de las ruedas y la humedad; tomalo de una medición en tu superficie.

Y recordá que la aceleración efectiva no es la planificada si el motor se queda corto: el perfil dice lo que se pide, no lo que ocurre.

06 · Pararse a tiempo

Distancia de frenado

Frenar con desaceleración constante a desde la velocidad v consume la distancia v²/(2a) y el tiempo v/a. La distancia crece con el cuadrado de la velocidad: duplicar la velocidad cuadruplica la distancia de frenado.

En un sistema real hay además una latencia: tiempo desde que se detecta una condición hasta que el actuador empieza a frenar (lectura del sensor, ciclo del programa, driver). Durante ese lapso el robot sigue a velocidad v:

dparada = v · tlatencia + v² / (2a)

Con v = 1 m/s, a = 2 m/s² y 100 ms de latencia, resultan 0,1 + 0,25 = 0,35 m. Si el obstáculo se detecta a 30 cm, no se frena a tiempo con esos parámetros: hay que bajar la velocidad, aumentar la capacidad de frenado o detectar antes.

Esta cuenta vale como criterio de diseño de la velocidad máxima: la velocidad a la que puede ir el robot depende de a qué distancia detecta lo que debe esquivar. Frenar no es gratis ni instantáneo, y una detención de emergencia que usa el mismo perfil tiene la misma distancia.

07 · Del cálculo al programa

Generar el perfil en tiempo discreto

Podemos calcular todo por adelantado con las fórmulas de arriba o generar la velocidad paso a paso. La segunda forma es más flexible: permite cambiar el destino a mitad de movimiento o detenerse a pedido. En cada actualización, con período Δt, se calcula la velocidad como el mínimo de tres cotas:

vk+1 = mín( vk + a · Δt,  vmáx,  √(2 · a · restante) )
  • vk + a·Δt limita la aceleración.
  • vmáx limita la velocidad.
  • √(2·a·restante) es la velocidad máxima desde la que todavía se puede frenar a tiempo en lo que falta.

Tercera cota: es lo que inicia el frenado en el momento correcto sin calcular tiempos. Cuando restante se acerca a cero, la velocidad se acerca a cero. Eso trae un detalle numérico: la velocidad nunca llega exactamente a cero, así que se fija una velocidad mínima positiva que se mantiene hasta completar la distancia (en un paso a paso, coincide con una velocidad de arranque tolerable).

Este esquema produce los dos perfiles automáticamente: si la distancia es corta, la tercera cota actúa antes de llegar a vmáx y resulta un triángulo. Además, para una parada a pedido basta reducir restante al valor v²/(2a): el robot frena con la aceleración planificada, no en seco.

Como en el tema 16, el tiempo se mide con micros() o millis() y el Δt se calcula con el reloj, no se supone. La integración con paso discreto introduce un pequeño error de tiempo y de distancia, que conviene verificar (más adelante, en Python).

08 · Código para la placa

Rampa de pasos en Arduino

Aplicamos el generador a un motor paso a paso con driver STEP/DIR, como en el tema 14. Supuestos que debés verificar en tu montaje: un UNO R3, STEP en D2 y DIR en D3, 1600 pasos por vuelta (200 pasos con microstepping 1/8), un driver cuyo pulso mínimo sea compatible con 4 µs y una alimentación de motor adecuada al modelo. El motor se prueba sin carga.

Comandos por el monitor serie: F y B mueven una vuelta completa (1600 pasos) en cada sentido; S frena con la aceleración planificada. La velocidad máxima es de 2000 pasos/s (75 RPM) y la aceleración de 4000 pasos/s².

const byte PIN_STEP = 2, PIN_DIR = 3;
const float V_MAX = 2000.0;      // pasos/s
const float V_MIN = 100.0;       // velocidad de arranque y de llegada
const float ACEL = 4000.0;       // pasos/s²
const long PASOS_VUELTA = 1600;
const unsigned long PERIODO_V_US = 1000;

long restantes = 0;
float v = 0;
bool activo = false;
unsigned long ultimoPaso = 0, ultimaV = 0;

void iniciar(bool adelante) {
  digitalWrite(PIN_DIR, adelante ? HIGH : LOW);
  delayMicroseconds(10);
  restantes = PASOS_VUELTA;
  v = V_MIN;
  activo = true;
  ultimaV = ultimoPaso = micros();
}

void setup() {
  digitalWrite(PIN_STEP, LOW);
  pinMode(PIN_STEP, OUTPUT);
  pinMode(PIN_DIR, OUTPUT);
  Serial.begin(115200);
  Serial.println("F/B: una vuelta con rampa; S: frenar con rampa");
}

void loop() {
  if (Serial.available() > 0) {
    const char cmd = Serial.read();
    if (!activo && (cmd == 'F' || cmd == 'B')) {
      iniciar(cmd == 'F');
    } else if (activo && cmd == 'S') {
      const long freno = (long)(v * v / (2.0 * ACEL)) + 1;
      if (freno < restantes) restantes = freno;
    }
  }
  if (!activo) return;

  const unsigned long ahora = micros();
  if (ahora - ultimaV >= PERIODO_V_US) {
    const float dt = (ahora - ultimaV) * 1e-6;
    ultimaV = ahora;
    float nueva = v + ACEL * dt;
    if (nueva > V_MAX) nueva = V_MAX;
    const float vFreno = sqrt(2.0 * ACEL * restantes);
    if (nueva > vFreno) nueva = vFreno;
    v = (nueva < V_MIN) ? V_MIN : nueva;
  }
  if (ahora - ultimoPaso >= (unsigned long)(1000000.0 / v)) {
    ultimoPaso = ahora;
    digitalWrite(PIN_STEP, HIGH);
    delayMicroseconds(4);
    digitalWrite(PIN_STEP, LOW);
    if (--restantes <= 0) {
      activo = false;
      Serial.println("Ordenes de paso completadas; posicion real no confirmada");
    }
  }
}

Con esos números, una vuelta tiene v²/(2a) = 500 pasos de aceleración, 500 de frenado y 600 de crucero. El tiempo estimado es 1600/2000 + 2000/4000 = 1,3 s. La aceleración tarda 0,5 s.

Las condiciones de arranque, la velocidad de partida y la aceleración que tolera el motor dependen del modelo, de la tensión, de la corriente configurada y de la carga. Los valores del ejemplo son un punto de partida para ensayar, no una garantía. Si el motor vibra, zumba sin girar o pierde pasos, reducí ACEL y V_MAX.

Dos limitaciones deliberadas: la temporización usa un solo hilo y funciona a velocidades de pocos kHz (a frecuencias mayores hacen falta temporizadores por hardware o bibliotecas especializadas), y el programa cuenta pasos ordenados, no pasos realizados. El mensaje final lo dice así: no se confirma la posición real, igual que en el tema 14.

La parada con S mantiene la deceleración planificada; no es una parada de emergencia. Para una emergencia real hace falta una vía independiente, por ejemplo cortar la habilitación del driver, aceptando que el rotor puede quedar libre.

09 · Para seguir

Más allá: la curva S

En el trapecio la aceleración salta de 0 a a al arrancar y de a a 0 al llegar al crucero. Ese salto se llama tirón o jerk (derivada de la aceleración) y puede excitar vibraciones y esfuerzos en mecanismos flexibles o con holgura.

La curva S limita también el jerk: la aceleración sube y baja gradualmente, con fases adicionales a ambos lados de cada tramo de aceleración constante. A cambio, el cálculo tiene más casos y el movimiento tarda algo más para la misma aceleración máxima.

Resumen de perfiles con reposo en ambos extremos.
PerfilContinuidadCuándo conviene
Salto de velocidadNingunaCasi nunca; solo cargas muy livianas y robustas
TrapezoidalVelocidad continua; aceleración con saltosPrimera opción para móviles y ejes paso a paso
Curva SVelocidad y aceleración continuasMecanismos flexibles, cargas delicadas, vibraciones

No hace falta implementar una curva S en este curso. Alcanza con saber que existe y cuándo el trapecio se queda corto, para no atribuir a la electrónica una vibración que nace del perfil.

10 · Exploración interactiva

Laboratorios: perfil trapezoidal y distancia de frenado

1. Trapecio o triángulo

Recorrido D, velocidad máxima y aceleración. El laboratorio decide la forma del perfil y calcula fases, tiempos y distancias.

Velocidad en función del tiempoEl perfil calculado con los parámetros elegidos. La altura de referencia es la velocidad máxima configurada; el eje horizontal llega a la duración total.v máx0— sÁrea = distancia recorrida
Forma del perfil—
Velocidad pico—
Aceleración / crucero / frenado—
Duración total—

Modificá distancia, velocidad y aceleración.

Con los valores iniciales hay trapecio: 0,8 s de aceleración, 1,7 s de crucero, 0,8 s de frenado y 3,3 s en total. Bajá la distancia a 20 cm: el crucero desaparece y el pico cae a unos 31,6 cm/s. Duplicá la aceleración con D = 100 cm: el total baja de 3,3 a 2,9 s, no a la mitad, porque domina el crucero.

2. Adherencia y distancia de parada

Robot de tracción total sobre suelo horizontal: se toma amáx = μ·g, con g = 9,81 m/s². Se pide frenar con la aceleración elegida. Se compara la distancia de parada con la distancia a la que se detecta un obstáculo.

Límite de adherencia μ·g—
Uso del límite—
Distancia de parada—
Margen frente al obstáculo—

Ajustá adherencia, frenado y distancia.

Con los valores iniciales, el límite es 4,9 m/s²; el frenado de 2 m/s² usa un 41 % de ese límite. La parada requiere 0,1 + 0,25 = 0,35 m y con un obstáculo a 50 cm quedan 15 cm de margen. Subí la velocidad a 1,5 m/s: la distancia de parada pasa a unos 0,71 m y ya no alcanza.

El modelo no considera traslado de peso, pendiente, desgaste del suelo ni tiempos de respuesta del driver. Es una estimación para dimensionar, no una verificación de seguridad.

11 · Código ejecutable

Verificar el perfil en Python

Comparamos la solución analítica con el generador discreto v = mín(v + a·Δt, vmáx, √(2·a·restante)) para dos distancias, con las mismas cifras de la sección 3 y 4. Para que la integración termine se mantiene una velocidad mínima de 0,5 cm/s.

Probalo en el navegador. Python se descarga con Pyodide la primera vez y requiere conexión. El código es editable y no controla un robot real.

import math

def analitico(D, vmax, a):
    if D >= vmax**2 / a:
        ta = vmax / a
        tc = (D - vmax**2 / a) / vmax
        return vmax, ta, tc, 2 * ta + tc
    pico = math.sqrt(a * D)
    ta = pico / a
    return pico, ta, 0.0, 2 * ta

def simular(D, vmax, a, dt, vmin=0.5):
    x = v = t = pico = 0.0
    while x < D:
        v_freno = math.sqrt(2 * a * (D - x))
        v = max(min(v + a * dt, vmax, v_freno), vmin)
        x += v * dt
        t += dt
        pico = max(pico, v)
    return pico, t

for D in (100, 20):
    p, ta, tc, T = analitico(D, 40, 50)
    ps, ts = simular(D, 40, 50, 0.01)
    print(f"D={D:3} cm  teoria: pico={p:5.1f} cm/s T={T:5.2f} s (ta={ta:.2f}, tc={tc:.2f})")
    print(f"          simulado: pico={ps:5.1f} cm/s T={ts:5.2f} s")

Para 100 cm: pico de 40,0 cm/s y 3,30 s en teoría, 3,27 s simulados. Para 20 cm: pico de 31,6 cm/s teórico y 31,5 simulado; 1,26 s contra 1,24 s. El generador reproduce ambos perfiles sin separar casos, con una diferencia pequeña de tiempo.

Esa diferencia sale de la integración discreta y de la velocidad mínima. Probá dt = 0.001 y comprobá cómo se reduce; probá también vmin = 5 para ver que una velocidad de llegada alta acorta el tiempo pero termina más «a golpe».

12 · Método y diagnóstico

Pruebas y diagnóstico

  1. Calculá a mano las fases y la duración esperada antes de mover nada.
  2. Probá con aceleración y velocidad bajas, sin carga y con espacio libre.
  3. Cronometrá el movimiento real (o registrá millis()) y compará con la duración calculada.
  4. Subí la aceleración por etapas; anotá en cuál aparece patinaje, vibración, zumbido o pérdida de pasos.
  5. Probá distancias cortas para comprobar que se comporta como triángulo y no genera un crucero negativo.
  6. Probá la parada a pedido desde velocidad de crucero y medí la distancia real de frenado.
  7. Repetí con la carga real y con el estado de batería más bajo previsto.
«Con rampa suave ya no puedo perder pasos»

Reduce el riesgo, no lo elimina. Torque, resonancias, carga y corriente configurada siguen decidiendo. El conteo sigue siendo de pasos ordenados.

«Duplico la aceleración y el movimiento dura la mitad»

Solo se acorta el término v/a. Si el crucero domina, la mejora es pequeña; si el recorrido es corto, el efecto es mayor (T = 2√(D/a)).

«El crucero siempre existe»

Solo si D ≥ v²/a. Si no, el perfil es triangular y la velocidad máxima nunca se alcanza.

«Frenar es lo mismo que arrancar al revés, no cuenta tiempo ni distancia»

Es simétrico en el cálculo, pero la distancia de frenado condiciona dónde debe empezar la desaceleración y cuánto margen se necesita frente a un obstáculo.

«La aceleración máxima es la del motor»

También cuentan la adherencia, la estabilidad de la carga, el driver y la alimentación. Manda la más restrictiva.

«La velocidad planificada es la velocidad real»

Es la orden. Sin medición (encoders, tema 18) no sabés si el robot la cumple, sobre todo con carga, batería baja o suelo distinto.

13 · Práctica guiada

Predecí antes de comprobar

1. Trapecio completo

Un robot debe recorrer 100 cm con vmáx = 40 cm/s y a = 50 cm/s². Calculá cada fase y el total.

Ver solución

v²/a = 32 cm < 100 cm, hay crucero. ta = td = 0,8 s (16 cm cada una). Crucero: (100−32)/40 = 1,7 s. Total 3,3 s, que coincide con D/v + v/a.

2. Distancia corta

Con los mismos límites, ¿qué pasa si el recorrido es de 20 cm?

Ver solución

20 < 32: perfil triangular. Pico √(50·20) ≈ 31,6 cm/s, duración 2·√(20/50) ≈ 1,26 s. No se llega a 40 cm/s.

3. Paso a paso

Un eje usa 1600 pasos/vuelta, vmáx = 2000 pasos/s y a = 4000 pasos/s². ¿Cuánto dura un movimiento de 800 pasos? ¿Y de 1600?

Ver solución

v²/a = 1000 pasos. Para 800 es triangular: pico √(4000·800) ≈ 1789 pasos/s, T = 2·√(800/4000) ≈ 0,894 s. Para 1600 hay crucero: 1600/2000 + 2000/4000 = 1,3 s.

4. Límite de adherencia

La rueda sobre un piso con μ = 0,4 y tracción total. ¿Cuál es el límite teórico de aceleración? ¿Qué valor elegirías con un margen del 60 %?

Ver solución

a ≈ 0,4 · 9,81 ≈ 3,9 m/s². Con 60 % del límite: unos 2,4 m/s². Se confirma midiendo en el robot real.

5. Parada ante un obstáculo

Un robot va a 1,2 m/s, frena con 2 m/s² y tiene 80 ms de latencia. ¿A qué distancia mínima debe detectar un obstáculo?

Ver solución

1,2 × 0,08 + 1,2²/(2·2) = 0,096 + 0,36 = 0,456 m. Con margen de seguridad, bastante más de 46 cm.

6. Cambiar la aceleración

Para D = 100 cm y vmáx = 40 cm/s, ¿cuánto dura el movimiento con a = 100 cm/s²? ¿Por qué no es la mitad de 3,3 s?

Ver solución

100/40 + 40/100 = 2,5 + 0,4 = 2,9 s. Solo se redujo el término v/a; el crucero a 40 cm/s sigue dominando.

14 · Síntesis

Ideas para recordar

  • Un perfil de velocidad limita la aceleración y el área bajo v(t) es la distancia.
  • El trapecio tiene aceleración, crucero y frenado: T = D/v + v/a si D ≥ v²/a.
  • Si D < v²/a el perfil es triangular con pico √(a·D) y T = 2√(D/a).
  • La aceleración debe caber en adherencia, torque y estabilidad de la carga; manda la más restrictiva, con margen.
  • La distancia de frenado crece con v²; con latencia se suma v · tlatencia.
  • El generador discreto toma el mínimo de aceleración, velocidad máxima y √(2·a·restante).
  • La rampa se temporiza con el reloj y no bloquea el programa.
  • El perfil es una orden en lazo abierto; la curva S limita además el tirón y la medición real llega con encoders.

¿Listo para el tema 18?

Antes de avanzar, elegí una velocidad y una aceleración para tu robot, calculá las fases para dos distancias (una larga y una corta) y estimá la distancia de parada con tu latencia. Pensá cómo te darías cuenta de que el robot no está cumpliendo el perfil.

En el próximo tema estudiamos control de velocidad y posición con encoders: medir, comparar con la referencia y corregir el motor.