UNIVERSIDAD PRIVADA DEL VALLE
FACULTAD DE INFORMÁTICA Y ELECTRÓNICA
INGENIERÍA EN __________
CAMPUS TIQUIPAYA
Informe de Práctica de Laboratorio N°4
MOVIMIENTO DE
TRAYECTORIA RECTILÍNEA
DEL ROBOT
MÓVIL CON
SINCRONIZACIÓN PID
GRUPO “A”
Integrantes: Edilson Ramirez Rodriguez
Carlos Maldonado Escalera
Ricardo Gonzales Saravia
Brayan Mamani Quispe
Carrera: Biomedica
Materia: ROBÓTICA
Docente: Ing. Elias Chavez
Gestión: I-2025
Fecha de presentación: 28 de 04 del 2025
MOVIMIENTO DE TRAYECTORIA RECTILÍNEA DEL ROBOT MÓVIL CON
SINCRONIZACIÓN PID
1. Marco teórico
Un robot móvil diferencial se caracteriza por tener dos ruedas laterales que giran de manera
independiente, permitiendo tanto el movimiento hacia adelante como el giro sobre su propio eje. Para
lograr un desplazamiento rectilíneo y preciso, es esencial la implementación de un algoritmo de control
que ajuste las velocidades de cada rueda. Uno de los métodos más comunes y efectivos es el uso de un
controlador PID (Proporcional, Integral, Derivativo) para sincronizar ambas ruedas y asegurar que el
robot mantenga una trayectoria recta.
Descripción del Algoritmo
• Lectura de sensores: El algoritmo inicia con la medición de las velocidades actuales de las
ruedas del robot móvil diferencial mediante encoders o sensores similares. Estas mediciones
permiten calcular los errores en las velocidades deseadas para cada rueda.
• Cálculo del error: El error se define como la diferencia entre la velocidad de referencia y la
velocidad actual de cada rueda. Para un desplazamiento rectilíneo, las velocidades de las dos
ruedas deben ser iguales.
donde Vref es la velocidad deseada y Vactual es la velocidad medida.
Controlador PID:
• Control Proporcional (P): Proporcional a la magnitud del error. Ajusta la velocidad de cada
rueda en función del error instantáneo.
• Control Integral (I): Acumula los errores pasados, corrigiendo desviaciones que puedan
haber sido acumuladas con el tiempo.
• Control Derivativo (D): Actúa sobre la tasa de cambio del error, previniendo oscilaciones y
proporcionando una respuesta más estable.
La salida del controlador PID es la señal de control que se envía a los actuadores de las ruedas para
corregir el error. La fórmula general del controlador PID es:
donde:
• u(t) es la señal de control,
• Kp, Ki y Kd son las ganancias proporcional, integral y derivativa, respectivamente,
• e(t) es el error en el tiempo.
Aplicación de la corrección: Las velocidades corregidas se aplican a las ruedas mediante los motores,
ajustando la potencia para que ambas mantengan la misma velocidad, logrando así el movimiento
rectilíneo.
Ciclo de retroalimentación: Este proceso se repite en un ciclo continuo de retroalimentación, donde las
velocidades se miden y ajustan constantemente, permitiendo que el robot corrija cualquier desviación que
pueda ocurrir durante el desplazamiento.
2. Resultados de Laboratorio Virtual
Utilizando el robot móvil LEGO MINDSTORMS NXT o LEGO EV3 o LEGO SPIKE PRIME (Prototipo armado
con sensores y actuadores) para completar el laboratorio, programe el robot en BRICX CC o ROBOTC o SPIKE –
PYTHON para que complete dos vueltas alrededor del cuadrado interior del recorrido. Las líneas a lo largo del
camino están ahí para la retroalimentación del sensor de LUZ (debe usar el mismo para el cambio de trayectoria);
sobrepasarlos no es tomando en cuenta como falta en la tarea. También debe detenerse si se presenta un obstáculo a
una distancia de 10 cm.
Código usado:
inline void avanzar(int potencia = 50)
{
Off(OUT_AC);
SetSensor(IN_1, SENSOR_ROTATION);
ClearSensor(IN_1);
SetSensor(IN_3, SENSOR_ROTATION);
ClearSensor(IN_3);
OnFwdSync(OUT_AC, potencia, 0);
return;
}
sub mover_distancia(int distancia, int velocidad = 50)
{
Off(OUT_AC);
SetSensor(IN_1, SENSOR_ROTATION);
ClearSensor(IN_1);
SetSensor(IN_3, SENSOR_ROTATION);
ClearSensor(IN_3);
int angulo = distancia * 3600 / 172;
RotateMotorEx(OUT_AC, velocidad, angulo, 0, true, true);
}
sub girar(int angulo, bool sentido, int velocidad)
{
// Sentido -> true (Horario)
// Sentido -> false (Antihorario)
Off(OUT_AC);
SetSensor(IN_1, SENSOR_ROTATION);
ClearSensor(IN_1);
SetSensor(IN_3, SENSOR_ROTATION);
ClearSensor(IN_3);
int L_R = 5; // Relación longitud/radio
int grados = angulo * L_R * 10;
grados = grados / 11;
if (sentido)
{
RotateMotor(OUT_C, velocidad, grados);
}
else
{
RotateMotor(OUT_A, velocidad, grados);
}
}
#define UMBRAL 60
task main()
{
repeat (3)
{
SetSensorLight(IN_4);
avanzar(45);
while (Sensor(IN_4) > UMBRAL);
// until (Sensor(IN_4) <= UMBRAL)
Off(OUT_AC);
mover_distancia(20, 45);
girar(95, true, 45);
SetSensorLight(IN_4);
avanzar(45);
while (Sensor(IN_4) > UMBRAL);
// until (Sensor(IN_4) <= UMBRAL)
Off(OUT_AC);
mover_distancia(20, 45);
girar(90, true, 45);
SetSensorLight(IN_4);
avanzar(45);
while (Sensor(IN_4) > UMBRAL);
// until (Sensor(IN_4) <= UMBRAL)
Off(OUT_AC);
mover_distancia(21, 45);
girar(90, true, 45);
SetSensorLight(IN_4);
avanzar(45);
while (Sensor(IN_4) > UMBRAL);
// until (Sensor(IN_4) <= UMBRAL)
Off(OUT_AC);
mover_distancia(20, 45);
girar(90, true, 45);
}
mover_distancia(40, 45);
girar(90, true, 45);
avanzar(-70);
}
Realizar un video que muestren el proceso de movimiento del robot y su finalización en la
plataforma STREAM, añada el link junto al presente documento.
[Link]
Fotografías de inicio, etapa intermedia y fin del recorrido del robot móvil.
3. Conclusiones
En el laboratorio, se pudo implementar un algoritmo que permitió a un robot móvil diferencial
seguir una trayectoria cuadrada utilizando un sensor de color para detectar líneas y motores
controlados por encoders para realizar giros. Los resultados fueron satisfactorios, ya que el robot
completó el recorrido cuatro veces.
El sensor de color funcionó adecuadamente para detener el robot en las líneas negras, y el uso de
encoders permitió un control preciso en los giros. Esto demostró que el ajuste independiente de las
ruedas, en combinación con sensores, es esencial para mantener trayectorias rectilíneas y realizar
maniobras eficientes. Los resultados se alinean con la teoría de control de robots móviles,
destacando la importancia de una buena calibración en sistemas de navegación autónoma.
4. Cuestionario
1. Describa la función RotateMotorEx en Bricx CC y su equivalente en LEGO Education SPIKE
La función RotateMotorEx en Bricx Command Center (Bricx CC) es utilizada para controlar motores en los robots
LEGO Mindstorms NXT o EV3, permitiendo un control más avanzado del giro del motor. A diferencia de la función
básica RotateMotor, RotateMotorEx ofrece la posibilidad de especificar parámetros adicionales como la
sincronización de motores y el ajuste del punto de frenado. Los parámetros que recibe son:
• Motor port: el puerto del motor que se desea controlar (A, B o C).
• Power: la potencia del motor (un valor entre -100 y 100, donde los valores negativos indican movimiento en
sentido inverso).
• Degrees: la cantidad de grados que el motor debe rotar.
• TurnRatio: permite establecer un valor para la relación de giro entre dos motores cuando se usan en conjunto
(por ejemplo, para girar el robot).
• Brake: determina si el motor debe frenar o detenerse gradualmente al final del movimiento.
La función es útil cuando se requiere un control preciso sobre el desplazamiento del robot, permitiendo especificar la
distancia y velocidad a la que se debe mover.
2. Realice un ejemplo de programa de multitarea en Bricx CC y LEGO Education SPIKE
task task1() {
RotateMotorEx(OUT_A, 50, 360, 0, true);
}
task task2() {
RotateMotorEx(OUT_B, 50, 720, 0, true);
}
task main() {
StartTask(task1);
StartTask(task2);
Wait(5000); }
3. Desarrolle el diagrama de flujo del programa usado en la práctica
5. Referencias bibliográficas.
Siegwart, R., & Nourbakhsh, I. R. (2004). Introduction to Autonomous Mobile Robots. MIT Press.
Siciliano, B., & Khatib, O. (Eds.). (2016). Springer Handbook of Robotics (2nd ed.). Springer.
Fu, K. S., Gonzalez, R. C., & Lee, C. S. G. (1987). Robotics: Control, Sensing, Vision, and Intelligence.
McGraw-Hill.