← Índice del curso

Robótica y Automatización · Tema 26

Cinemática del robot diferencial

Un robot de dos ruedas recibe órdenes de dos velocidades, pero pensamos su movimiento como una velocidad de avance y una de giro. Vamos a pasar de un lenguaje al otro en ambos sentidos, a entender qué curva describe y a respetar los límites de los motores.

01 · Punto de partida

Del tipo de chasis al modelo

En el tema 25 elegimos la configuración diferencial por su simplicidad y por su capacidad de girar sobre el lugar. Ahora la modelamos. La cinemática relaciona velocidades sin preocuparse por las fuerzas: qué velocidades de rueda producen qué movimiento del chasis, y al revés.

La necesitamos en las dos direcciones, igual que en el brazo (temas 21 y 22):

  • Directa: con las velocidades medidas de las dos ruedas, saber a qué velocidad avanza y gira el robot. Es la base de la odometría (tema 27).
  • Inversa: con la velocidad de avance y de giro que pide el controlador (seguidor de línea, navegación), calcular qué velocidad debe tener cada rueda. Es lo que hace que un algoritmo de alto nivel pueda ordenar «avanzá a 20 cm/s y girá a 1 rad/s» a dos motores.

Todo en esta unidad usa un robot con b = 15 cm entre ruedas, ruedas de 3,25 cm de radio y una velocidad máxima de 30 cm/s por rueda. Son valores de ejemplo: medí los tuyos.

02 · Notación

El modelo y su notación

Usamos el marco del robot del tema 20: origen en el punto medio del eje que une las ruedas, eje x hacia adelante, eje y hacia la izquierda y ángulos positivos antihorarios. La pose en el mundo es (x, y, θ).

Robot diferencial visto desde arriba El chasis tiene dos ruedas laterales separadas una distancia b. La rueda izquierda avanza con velocidad vL y la derecha con vR. El robot avanza con velocidad v y gira con velocidad angular omega alrededor de un centro instantáneo de rotación situado a la izquierda cuando la rueda derecha es más rápida. vL (rueda izquierda)vR (rueda derecha)vbCIRR = v / ωω > 0Si vR > vL, gira a la izquierda

Las variables son:

  • b: distancia entre los puntos de contacto de las dos ruedas (ancho de vía efectivo).
  • r: radio de las ruedas. La velocidad de una rueda sobre el suelo es v = r·ωrueda.
  • vL y vR: velocidades lineales de los puntos de contacto de las ruedas izquierda y derecha (positivas hacia adelante).
  • v y ω: velocidad lineal del punto medio del eje y velocidad angular del chasis.

La hipótesis central es que las ruedas ruedan sin deslizar. Es la que hace válidas las fórmulas y la que el mundo real viola un poco; la retomamos al final.

03 · Medir y deducir

De las ruedas al robot

El punto medio del eje se mueve a la velocidad promedio de las dos ruedas. Y la diferencia entre ellas, repartida sobre la distancia que las separa, es la velocidad angular:

v = (vR + vL) / 2     ω = (vR − vL) / b

El signo sale de la convención: si la rueda derecha va más rápida que la izquierda, el robot gira hacia la izquierda, antihorario, ω > 0. Con vL = 12 cm/s y vR = 27 cm/s y b = 15 cm: v = 19,5 cm/s y ω = 1,0 rad/s.

Esta es la cinemática que se usa con los encoders: se mide el desplazamiento de cada rueda en un intervalo, se divide por el tiempo para obtener vL y vR y se calculan v y ω (sección 8). Integrando en el tiempo se obtiene la pose, que es la odometría del próximo tema.

04 · Ordenar el movimiento

Del robot a las ruedas

Despejando las dos ecuaciones anteriores:

vL = v − ω · b / 2     vR = v + ω · b / 2

Es la forma en que un algoritmo de alto nivel «habla» con los motores. Un seguidor de línea decide, por ejemplo, v = 15 cm/s y ω = −1 rad/s (girar a la derecha) y esta fórmula devuelve vL = 22,5 cm/s y vR = 7,5 cm/s. Separar la decisión (qué movimiento) de la ejecución (qué velocidad por rueda) permite cambiar el robot sin tocar el algoritmo, y es la misma idea de capas del proyecto del tema 24.

El término ω·b/2 es la velocidad extra que gana la rueda exterior y pierde la interior. Cuanto más ancho el robot, más velocidad diferencial hace falta para el mismo giro.

05 · La curva que describe

Radio de curvatura y casos especiales

Si v y ω se mantienen constantes, el robot recorre una circunferencia cuyo radio, medido desde el punto medio del eje hasta el centro instantáneo de rotación (CIR), es:

R = v / ω = (b / 2) · (vR + vL) / (vR − vL)

El CIR está sobre el eje de las ruedas, hacia el lado de la rueda más lenta. Los casos que conviene reconocer a primera vista:

Con b = 15 cm. El radio se mide desde el punto medio del eje.
Ruedasv y ωRadioMovimiento
vL = vR > 0ω = 0∞Recta hacia adelante
vL = vR < 0ω = 0∞Recta hacia atrás
vL = −vRv = 00Giro sobre el propio eje
vL = 0, vR > 0v = vR/2, ω = vR/bb/2 = 7,5 cmGira alrededor de la rueda izquierda
vR > vL > 0v > 0, ω > 0R > b/2Curva a la izquierda
vL < 0 < vR|v| < |ω|b/2|R| < b/2Curva cerrada, CIR entre las ruedas

Con v = 20 cm/s y ω = 1 rad/s, el radio es 20 cm. Con v = 0 y ω = 2 rad/s, el robot gira sobre su eje: vL = −15 y vR = +15 cm/s.

La relación entre curvatura y velocidades es lo que gobierna los seguidores de línea (tema 31): el algoritmo calcula una corrección de giro y la cinemática la convierte en una diferencia de velocidades.

06 · Dónde está el robot

Integrar la pose

Con la velocidad y el giro se obtiene cómo cambia la pose en el marco del mundo:

dx/dt = v · cos θ    dy/dt = v · sen θ    dθ/dt = ω

El avance se proyecta en el marco del mundo con la orientación actual (tema 20). En un programa hay que pasar a pasos de tiempo Δt. Tres formas de hacerlo, de menos a más precisa:

  • Euler: x ← x + v·cos θ·Δt, y ← y + v·sen θ·Δt, θ ← θ + ω·Δt. Usa la orientación del inicio del paso. Es la más simple y acumula un error que crece con el paso y con la velocidad.
  • Punto medio: igual, pero con cos(θ + ω·Δt/2) y sen(θ + ω·Δt/2). Usa la orientación a mitad de paso y reduce mucho el error.
  • Arco exacto (si v y ω son constantes en el paso y ω ≠ 0): x ← x + (v/ω)·[sen(θ+ω·Δt) − sen θ], y ← y − (v/ω)·[cos(θ+ω·Δt) − cos θ], θ ← θ + ω·Δt. Si ω = 0, se vuelve a la recta.

Con v = 20 cm/s, ω = 1 rad/s durante 3 s, el robot termina en (2,82; 39,80) cm con orientación 172°. Con Euler y pasos de 20 ms, el error es de 0,40 cm; con 100 ms, 2,0 cm; con 500 ms, 10 cm. Con el punto medio los errores son 0,001, 0,017 y 0,42 cm. Con arcos es cero, a menos de redondeo.

En un robot real, v y ω cambian en cada paso y se obtienen de los encoders. Entonces ninguna fórmula es exacta, pero la de arcos (o la del punto medio) sigue siendo la mejor práctica: es barata y evita un error sistemático. El tema 27 la usa.

07 · La realidad impone límites

Límites de los motores

Cada rueda tiene una velocidad máxima Vmáx. El conjunto de pares (v, ω) realizables es una región: las dos ecuaciones de la inversa deben cumplir |vL| ≤ Vmáx y |vR| ≤ Vmáx, es decir:

|v| + |ω| · b / 2 ≤ Vmáx

Con Vmáx = 30 cm/s y b = 15 cm: puede avanzar a 30 cm/s en recta, o girar a 4 rad/s sobre su eje, o combinaciones. Pedir v = 25 cm/s y ω = 2 rad/s da vR = 40 cm/s: no se puede. Hay que decidir qué sacrificar:

Pedido v = 25 cm/s y ω = 2 rad/s, con Vmáx = 30 cm/s.
PolíticaResultadoRadioEfecto
Recortar cada ruedavL = 10, vR = 30 → v = 20, ω = 1,3315,0 cmLa curva se abre respecto de la pedida (12,5 cm)
Escalar v y ω por igualk = 0,75 → v = 18,75, ω = 1,512,5 cmConserva la curva: llega más lento
Priorizar el giroω = 2, v = 15 → vL = 0, vR = 307,5 cmGira lo pedido pero avanza menos: curva más cerrada

No hay una opción correcta para todos los casos. Para seguir una línea o una trayectoria, escalar es lo más seguro: conserva la forma del camino, que es lo que el algoritmo calculó. Recortar rueda por rueda cambia la curva sin avisar, y es una causa frecuente de seguidores que se salen de la pista en los tramos rápidos. Priorizar el giro conviene para evitar un choque.

Además de la máxima, existe una velocidad mínima útil: por debajo de cierto PWM, el motor no arranca por la zona muerta (tema 13). Una velocidad pedida muy baja puede no producir movimiento.

08 · Hacia el hardware

De cm/s a rpm y a cuentas de encoder

Los motores no entienden de cm/s. La cadena de conversiones, en el sentido de la salida, es:

ωrueda = vrueda / r    rpm = ωrueda · 60 / (2π)    PWM = f(rpm)

La última función sale de calibrar cada motor (tema 13) o, mejor, de un lazo cerrado de velocidad con encoder (tema 18), en el que la referencia es justamente la velocidad de la rueda calculada aquí. La inversa de este esquema es la medición: de las cuentas del encoder a la velocidad lineal de la rueda,

vrueda = (2π · r / CPR) · (Δcuentas / Δt)

Con r = 3,25 cm y CPR = 1440 cuentas por vuelta de rueda, cada cuenta equivale a 0,0142 cm. En un período de 20 ms, una cuenta corresponde a 0,71 cm/s: ésa es la resolución con la que se puede medir la velocidad (tema 18). A 20 cm/s la rueda suma unas 28 cuentas por período.

Con vR = 27,5 cm/s la rueda gira a 27,5 / 3,25 = 8,46 rad/s, unas 81 rpm. Son velocidades modestas: lo habitual es un motor con reductor, que gira mucho más rápido internamente.

09 · Los números del modelo

Dónde falla el modelo

  • Ancho de vía efectivo. Los neumáticos tienen un área de contacto y deslizan al girar; el b efectivo no es la distancia medida entre centros. Un error de 5 % en b da 5 % de error en ω, y se acumula en la orientación. Se calibra haciendo girar el robot en el lugar y comparando el ángulo ordenado con el medido: bef = b · θordenado / θreal. Si ordena 360° y gira 340°, bef = 15 · 360/340 ≈ 15,9 cm.
  • Radios distintos. Si una rueda es 1 % mayor que la otra, con igual velocidad angular el robot curva con R ≈ b/0,01 ≈ 15 m. Tras 2 m recorridos, se desvía unos 13 cm. Se corrige midiendo el recorrido de cada rueda o calibrando.
  • Deslizamiento. Aceleraciones fuertes, suelos resbaladizos o giros bruscos hacen que la rueda gire sin avanzar lo que corresponde (tema 17).
  • Rueda loca. Su orientación inicial desvía el arranque (tema 25).
  • Retardos y dinámica. Los motores no alcanzan la velocidad ordenada de inmediato; el modelo supone que sí.
  • Cuantización de la medición. La velocidad medida tiene escalones de 1/(CPR·Δt) (tema 18).

Los errores sistemáticos —b y radios— se calibran. Los aleatorios —deslizamiento, retardos— se toleran o se corrigen con otros sensores (tema 29). Un modelo es una aproximación útil, no una descripción exacta del robot.

10 · Código para la placa

Cinemática diferencial en Arduino

Este sketch no necesita motores. Recibe una orden v ω (cm/s y rad/s), calcula las velocidades de las ruedas, aplica la política de escalado ante la saturación, informa las rpm y la pose tras 3 s integrando por arcos. Es el puente entre el algoritmo de navegación y los lazos de velocidad de las ruedas.

const float B = 15.0;          // distancia entre ruedas (cm)
const float R_RUEDA = 3.25;    // radio de rueda (cm)
const float V_MAX = 30.0;      // velocidad máxima de cada rueda en el suelo (cm/s)

// Ruedas -> robot
void directa(float vl, float vr, float &v, float &w) {
  v = (vr + vl) / 2.0;
  w = (vr - vl) / B;           // positivo = giro antihorario (a la izquierda)
}

// Robot -> ruedas
void inversa(float v, float w, float &vl, float &vr) {
  vl = v - w * B / 2.0;
  vr = v + w * B / 2.0;
}

// Si una rueda supera V_MAX, se escalan v y w por igual: se conserva el radio de curvatura.
float factorDeEscala(float vl, float vr) {
  const float mayor = max(fabs(vl), fabs(vr));
  return (mayor > V_MAX) ? V_MAX / mayor : 1.0;
}

float rpm(float vRueda) { return vRueda / R_RUEDA * 60.0 / TWO_PI; }

void procesar(float v, float w) {
  float vl, vr;
  inversa(v, w, vl, vr);
  const float k = factorDeEscala(vl, vr);
  Serial.print("pedido v="); Serial.print(v, 2); Serial.print(" w="); Serial.print(w, 2);
  Serial.print(" -> vl="); Serial.print(vl, 2); Serial.print(" vr="); Serial.print(vr, 2);
  if (fabs(w) < 1e-6) Serial.println(" | recta");
  else { Serial.print(" | radio="); Serial.print(v / w, 1); Serial.println(" cm"); }

  if (k < 1.0) {
    v *= k; w *= k;
    inversa(v, w, vl, vr);
    Serial.print("saturado: k="); Serial.print(k, 2);
    Serial.print(" -> v="); Serial.print(v, 2); Serial.print(" w="); Serial.print(w, 2);
    Serial.print(" vl="); Serial.print(vl, 2); Serial.print(" vr="); Serial.println(vr, 2);
  }
  Serial.print("rpm: izq="); Serial.print(rpm(vl), 0); Serial.print(" der="); Serial.println(rpm(vr), 0);

  // Pose tras 3 s, integrando por arcos cada 100 ms (exacto si v y w son constantes).
  float x = 0, y = 0, th = 0;
  const float dt = 0.1;
  for (int i = 0; i < 30; i++) {
    if (fabs(w) < 1e-6) { x += v * cos(th) * dt; y += v * sin(th) * dt; }
    else {
      x += v / w * (sin(th + w * dt) - sin(th));
      y -= v / w * (cos(th + w * dt) - cos(th));
      th += w * dt;
    }
  }
  Serial.print("pose a los 3 s: x="); Serial.print(x, 2); Serial.print(" y="); Serial.print(y, 2);
  Serial.print(" theta="); Serial.print(th * RAD_TO_DEG, 0); Serial.println(" grados");
}

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(100);
  Serial.println("Escribi 'v w' (cm/s, rad/s), por ejemplo: 20 1");
  procesar(20.0, 1.0);
}

void loop() {
  if (Serial.available() == 0) return;
  const float v = Serial.parseFloat();
  const float w = Serial.parseFloat();
  while (Serial.available() > 0) Serial.read();
  procesar(v, w);
}

Al iniciar muestra el caso 20 1: vl=12.50 vr=27.50 | radio=20.0 cm, rpm: izq=37 der=81 y pose a los 3 s: x=2.82 y=39.80 theta=172 grados. Con 25 2 la orden satura: k=0.75 -> v=18.75 w=1.50 vl=7.50 vr=30.00, rpm: izq=22 der=88 y la pose termina en x=-12.22 y=15.13 theta=258 grados.

Los resultados son los de un robot ideal. En un robot real, las dos velocidades de rueda se pasan como referencias a sus lazos de control con encoder (tema 18), y las velocidades medidas alimentan la misma cinemática en sentido directo para estimar la pose (tema 27). Como en temas anteriores, parseFloat() espera con un tiempo límite, aceptable aquí porque el sketch solo calcula.

11 · Exploración interactiva

Laboratorios: cinemática e integración

1. Velocidades de ruedas y movimiento del robot

Elegí el sentido de la conversión. En «Robot → ruedas» das v y ω y el laboratorio calcula las ruedas, aplicando la política de saturación si hace falta. En «Ruedas → robot» das las dos velocidades. La figura muestra, vista desde arriba, la pose inicial (gris), la final tras 3 s (lima) y el centro de giro.

Trayectoria de 3 segundos del robot diferencialVista superior con el robot en su pose inicial, el arco que recorre, su pose final y el centro instantáneo de rotación.
vL / vR resultantes— / —
v y ω resultantes— · —
Radio de curvatura—
rpm de las ruedas (izq. / der.)—

Elegí v y ω.

Con v = 20 cm/s y ω = 1 rad/s salen vL = 12,5 y vR = 27,5 cm/s, radio 20 cm. Pasá a v = 0 y ω = 2: giro sobre el eje con ∓15 cm/s. Poné v = 25 y ω = 2 y alterná las políticas: «escalar» da radio 12,5 cm; «recortar», 15 cm; «priorizar el giro», 7,5 cm con la rueda izquierda detenida. En «Ruedas → robot», dejá una rueda en 0 y la otra en 30: gira alrededor de la detenida, con radio 7,5 cm.

2. Integrar la pose con distintos métodos

El robot sigue una curva con v y ω constantes. La línea lima es el camino exacto; la naranja, el cálculo con Euler; la celeste punteada, el del punto medio. Los puntos grandes marcan el final exacto y el de Euler.

Comparación de métodos de integración de la poseTres trayectorias superpuestas: la exacta, la de Euler y la del punto medio, calculadas con el paso de tiempo elegido.
Posición final exacta—
Error de Euler—
Error del punto medio—
Error por arcos—

Elegí la curva y el paso.

Con v = 20, ω = 1 y 3 s, el final exacto es (2,8; 39,8) cm. Con 100 ms, Euler se aparta 2,0 cm; con 500 ms, 10 cm; con 20 ms, 0,4 cm. El punto medio queda por debajo de 0,5 cm incluso a 500 ms. El error de Euler crece con el paso y con la velocidad.

12 · Código ejecutable

Comprobar el modelo en Python

Repetimos las conversiones, la política de escalado y la comparación de métodos de integración, para verificar el modelo antes de llevarlo al microcontrolador.

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

import math

B = 15.0            # distancia entre ruedas (cm)
R_RUEDA = 3.25      # radio de rueda (cm)
V_MAX = 30.0        # velocidad máxima de cada rueda en el suelo (cm/s)

def directa(vl, vr):
    return (vr + vl) / 2, (vr - vl) / B               # v (cm/s), omega (rad/s)

def inversa(v, w):
    return v - w * B / 2, v + w * B / 2               # vl, vr

def escalar(v, w):
    vl, vr = inversa(v, w)
    k = min(1.0, V_MAX / max(abs(vl), abs(vr), 1e-9))
    return v * k, w * k, k                            # conserva el radio de curvatura

def rpm(v):
    return v / R_RUEDA * 60 / (2 * math.pi)

for v, w in ((20, 1.0), (0, 2.0), (25, 2.0)):
    vl, vr = inversa(v, w)
    radio = "recta" if abs(w) < 1e-9 else f"{v / w:.1f} cm"
    print(f"v={v:4.1f} cm/s w={w:3.1f} rad/s -> vl={vl:5.2f} vr={vr:5.2f} cm/s; radio={radio}; "
          f"rpm=({rpm(vl):.0f}, {rpm(vr):.0f})")
vs, ws, k = escalar(25, 2.0)
print(f"Escalado por saturacion: k={k:.2f} -> v={vs:.2f} cm/s, w={ws:.2f} rad/s, radio={vs / ws:.1f} cm (antes {25 / 2.0:.1f})")
print(f"Prioridad al giro: vr=30 -> v={30 - 2.0 * B / 2:.0f} cm/s, w=2.0 rad/s, radio={(30 - 2.0 * B / 2) / 2.0:.1f} cm")

# Integración de la pose: v = 20 cm/s y w = 1 rad/s durante 3 s
def integrar(v, w, T, dt):
    n = round(T / dt)
    euler = [0.0, 0.0, 0.0]
    medio = [0.0, 0.0, 0.0]
    arco = [0.0, 0.0, 0.0]
    for _ in range(n):
        euler[0] += v * math.cos(euler[2]) * dt
        euler[1] += v * math.sin(euler[2]) * dt
        euler[2] += w * dt
        medio[0] += v * math.cos(medio[2] + w * dt / 2) * dt
        medio[1] += v * math.sin(medio[2] + w * dt / 2) * dt
        medio[2] += w * dt
        arco[0] += v / w * (math.sin(arco[2] + w * dt) - math.sin(arco[2]))
        arco[1] -= v / w * (math.cos(arco[2] + w * dt) - math.cos(arco[2]))
        arco[2] += w * dt
    return euler, medio, arco

v, w, T = 20.0, 1.0, 3.0
exacto = (v / w * math.sin(w * T), v / w * (1 - math.cos(w * T)))
print(f"Posicion exacta tras {T:.0f} s: ({exacto[0]:.2f}, {exacto[1]:.2f}) cm, orientacion {math.degrees(w * T):.0f} grados")
for dt in (0.02, 0.1, 0.5):
    resultados = integrar(v, w, T, dt)
    errores = [math.hypot(p[0] - exacto[0], p[1] - exacto[1]) for p in resultados]
    print(f"dt={dt * 1000:3.0f} ms: error Euler={errores[0]:.2f} cm; punto medio={errores[1]:.3f} cm; por arcos={errores[2]:.1e} cm")

Para (20 cm/s; 1 rad/s): ruedas a 12,5 y 27,5 cm/s, radio 20 cm. En el lugar, con ω = 2: ∓15 cm/s. Para (25; 2): satura; escalando, k = 0,75 y radio 12,5 cm; priorizando el giro, radio 7,5 cm. A los 3 s la posición exacta es (2,82; 39,80) cm, y los errores de Euler son 0,40 cm (20 ms), 2,00 cm (100 ms) y 10,01 cm (500 ms), contra 0,001, 0,017 y 0,419 cm del punto medio.

Probá cambiar B y observar el efecto en las velocidades de rueda para un mismo giro, o V_MAX para ver cuándo satura. Cambiá la duración a 6,28 s (una vuelta completa) y notá que el error de Euler baja: el camino es casi cerrado, pero esto no ocurre en general.

13 · Método y diagnóstico

Pruebas y diagnóstico

  1. Con las ruedas en el aire, ordená velocidades conocidas y medí con el encoder o contando vueltas; comprobá vL y vR.
  2. Medí b y r con calibre o regla y anotá su incertidumbre.
  3. Ordená una recta de 2 m a velocidad moderada y medí la desviación lateral; si hay una curva sistemática, hay una diferencia de radios o de motores.
  4. Ordená un giro de 360° en el lugar y medí el ángulo real; ajustá b efectivo.
  5. Ordená un círculo de radio conocido y comparalo con el trazo del robot.
  6. Probá pedidos que saturan y verificá que la política elegida se comporta como se espera.
  7. Verificá los signos: una rueda con el sentido invertido hace que el giro y el avance se intercambien.
«Mando el mismo PWM a las dos ruedas, así que irá recto»

Casi nunca: los motores no son idénticos. Para ir recto hace falta medir cada rueda y corregir (tema 18) o apoyarse en un giróscopo (tema 29).

«El robot gira al revés de lo que espero»

Un signo está invertido: el sentido de un motor, de un encoder, o la convención de ω. Probá una orden de giro y observá hacia dónde va.

«El radio es v/ω solo si v > 0»

También vale con v negativo (marcha atrás): el signo de R indica de qué lado queda el centro. Con v = 0 el radio es cero y el robot gira sobre su eje.

«Euler es suficiente porque el paso es chico»

El error crece con el paso y con la velocidad y se acumula. Cambiar a arcos o a punto medio cuesta dos líneas y lo elimina casi por completo.

«Si satura, recorto cada rueda y listo»

Eso cambia el radio de la curva sin avisar. Para conservar el camino, escalá v y ω por igual.

«El ancho de vía es la distancia entre los centros de las ruedas»

Es una primera aproximación. El valor efectivo, con deslizamiento y área de contacto, se calibra girando en el lugar.

14 · Práctica guiada

Predecí antes de comprobar

1. De robot a ruedas

Con b = 15 cm, ¿qué velocidades de rueda corresponden a v = 15 cm/s y ω = −1 rad/s? ¿Hacia dónde gira?

Ver solución

vL = 15 − (−1)·7,5 = 22,5 cm/s; vR = 15 + (−1)·7,5 = 7,5 cm/s. La izquierda es más rápida: gira a la derecha (horario), coherente con ω < 0.

2. De ruedas a robot

Si vL = 10 cm/s y vR = 25 cm/s, ¿cuánto valen v, ω y el radio?

Ver solución

v = 17,5 cm/s; ω = 15/15 = 1 rad/s; R = v/ω = 17,5 cm, con el centro a la izquierda.

3. Giro alrededor de una rueda

Con vL = 0 y vR = 30 cm/s, ¿cuánto valen v, ω y R? ¿Dónde está el centro?

Ver solución

v = 15 cm/s, ω = 2 rad/s, R = 7,5 cm = b/2: el centro está en la rueda izquierda detenida.

4. Saturación

Con Vmáx = 30 cm/s, el pedido es v = 25 y ω = 2. Escalando por igual, ¿cuánto valen v, ω y el radio resultantes?

Ver solución

La rueda derecha pediría 40 cm/s: k = 30/40 = 0,75. v = 18,75 cm/s, ω = 1,5 rad/s, R = 12,5 cm, igual al pedido (25/2).

5. A rpm

Una rueda de radio 3,25 cm debe avanzar a 27,5 cm/s. ¿Cuántas rpm?

Ver solución

ω = 27,5/3,25 ≈ 8,46 rad/s; 8,46 · 60/(2π) ≈ 81 rpm.

6. Resolución del encoder

Con CPR = 1440, r = 3,25 cm y un período de 20 ms, ¿cuántas cuentas se esperan a 20 cm/s y qué velocidad representa una cuenta?

Ver solución

Por cuenta: 2π·3,25/1440 ≈ 0,0142 cm. A 20 cm/s en 20 ms son 0,4 cm: unas 28 cuentas. Una cuenta equivale a 0,0142/0,02 ≈ 0,71 cm/s.

7. Una rueda más grande

La rueda derecha es 1 % mayor que la izquierda y ambas giran igual. ¿Qué radio describe el robot y cuánto se desvía en 2 m?

Ver solución

vR = 1,01·vL: R ≈ (b/2)(2,01/0,01) ≈ 15 m. Desvío lateral ≈ d²/(2R) = 200²/3000 ≈ 13 cm.

15 · Síntesis

Ideas para recordar

  • Directa: v = (vR + vL)/2 y ω = (vR − vL)/b. Inversa: vL,R = v ∓ ω·b/2.
  • Con velocidades constantes el robot describe un arco de radio R = v/ω; el CIR está sobre el eje de las ruedas, del lado de la rueda más lenta.
  • Casos clave: recta (ω = 0), giro en el lugar (v = 0, R = 0) y giro alrededor de una rueda (R = b/2).
  • La pose se integra con dx/dt = v·cos θ, dy/dt = v·sen θ, dθ/dt = ω; el arco exacto o el punto medio superan a Euler.
  • Hay una región de (v, ω) realizable: |v| + |ω|·b/2 ≤ Vmáx. Ante la saturación, escalar conserva la curva.
  • La conversión a rpm y a cuentas de encoder conecta el modelo con el hardware y con los lazos de velocidad.
  • Los errores de b y de los radios son sistemáticos y se calibran; el deslizamiento y la dinámica no se pueden eliminar.
  • Separar «qué movimiento» de «qué velocidad por rueda» deja el algoritmo independiente del chasis.

¿Listo para el tema 27?

Antes de avanzar, medí b y r de tu robot (o definí los de un modelo), calculá las velocidades de rueda para un círculo de 30 cm de radio a 15 cm/s y la resolución de velocidad de tu encoder. Pensá cuánto error de orientación acumularías en 10 m con un error del 2 % en b.

En el próximo tema usamos esta cinemática en sentido directo: odometría y estimación de posición, acumulando pasos de encoder y analizando sus errores.