0% encontró este documento útil (0 votos)
16 vistas21 páginas

ROS2 en Raspberry Pi 4: Guía Completa

Este documento describe cómo configurar una Raspberry Pi 4 con Ubuntu Server 22.04 para crear un entorno de simulación educativa utilizando ROS2 y Stage, incluyendo la instalación de un entorno gráfico, scripts de automatización y ejemplos de programación de robots. Se detallan los requisitos de hardware y software, así como los pasos para la instalación y configuración de ROS2 y Stage. Además, se incluyen scripts para facilitar el lanzamiento de simulaciones y el control de robots, así como recomendaciones para el overclocking seguro de la Raspberry Pi.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
16 vistas21 páginas

ROS2 en Raspberry Pi 4: Guía Completa

Este documento describe cómo configurar una Raspberry Pi 4 con Ubuntu Server 22.04 para crear un entorno de simulación educativa utilizando ROS2 y Stage, incluyendo la instalación de un entorno gráfico, scripts de automatización y ejemplos de programación de robots. Se detallan los requisitos de hardware y software, así como los pasos para la instalación y configuración de ROS2 y Stage. Además, se incluyen scripts para facilitar el lanzamiento de simulaciones y el control de robots, así como recomendaciones para el overclocking seguro de la Raspberry Pi.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

🛠️ 1.

Introducción
Este documento detalla el proceso completo para transformar una Raspberry Pi 4 con
Ubuntu Server 22.04 en un entorno de simulación educativa con ROS2 y Stage,
incluyendo configuración de entorno gráfico, automatización con scripts, overclocking,
y programación básica de un robot simulado.

Está pensado para facilitar el aprendizaje práctico, incluso sin conexión a Internet ni

📥
necesidad de acceder a cuentas privadas como GitHub.

🖥️
●​ Descarga de Ubuntu Server 22.04.

⚙️
●​ Instalación del entorno gráfico (Xfce).

🤖
●​ Instalación de ROS2 Humble.

🛠️
●​ Instalación y compilación de Stage para ROS2 (con y sin Git).
●​ Scripts automatizados (instalar_stage.sh, lanzar_todo.sh,

🧠
etc.).
●​ Opcional: tu primer script mover_robot.py y el
esquiva_robot.py comentado.
🚀 Overclocking paso a paso.
🔐 Inicio de sesión automático y carga del entorno gráfico sin
●​
●​
credenciales ni comandos.

✍️ 2. Requisitos
2.1. Hardware mínimo recomendado
- Raspberry Pi 4 con 4 GB de RAM
- Tarjeta microSD clase 10 (solo para el primer booteo, se usará SSD)
- SSD SATA (120 GB o más) conectado vía USB 3.0
- Fuente de alimentación de 5V – 3A
- Disipador + ventilador para la Pi
2.2. Software necesario
- Imagen de Ubuntu Server 22.04 para Raspberry Pi:
[Link]
- Balena Etcher (para grabar la imagen)
- Otro equipo para preparar la imagen inicial si es necesario
​ 2.3. Hardware mínimo para el montaje del Robot Móvil Diferencial (PonchoBot)
​ ​ - Placa Esp32 montada sobre una mini protoboard
​ ​ - Dos microservos sg90 de giro continuo con sus ruedas
​ ​ - Un chasis con una rueda loca para el montaje del robot
​ ​ - Una power bank de 5v - 3A para energizar el sistema

🧭 3. Instalación de Ubuntu Server 22.04 en


Raspberry Pi 4
1.​ Descargar imagen oficial Ir a [Link] y
seleccionar Ubuntu Server 22.04 LTS (64-bit) para Raspberry Pi 4.
2.​ Grabar la imagen en una microSD
○​ Usar Balena Etcher para grabar el archivo .[Link] en una tarjeta
microSD clase 10.
○​ Seleccionar la imagen descargada, la microSD, y luego hacer clic en
“Flash!”.
3.​ Primer arranque y migración a SSD
○​ Insertar la microSD en la Raspberry Pi y conectar el SSD por USB 3.0.
○​ En el primer inicio, iniciar sesión:
■​ Usuario: ubuntu
■​ Contraseña: ubuntu
○​ Ubuntu pedirá cambiar la contraseña.
4.​ Opcional: Migrar el sistema al SSD Hay varias formas (como usando rsync
o instaladores tipo PiClone), pero si estás trabajando directo en SSD o usando
imágenes que ya se cargan en ese medio, podés omitir este paso.

🖥️ 4. Instalación de entorno gráfico (Xfce)


Ubuntu Server no tiene GUI por defecto. Para instalar un entorno ligero:

1.​ Actualizar paquetes

sudo apt update && sudo apt upgrade -y

2.​ Instalar Xfce y utilidades mínimas

sudo apt install -y xfce4 lightdm xserver-xorg mousepad xterm

3.​ Establecer LightDM como gestor de inicio

Cuando se te pregunte cuál display manager usar, seleccioná: lightdm

4.​ Probar entorno gráfico

Podés reiniciar con:

sudo reboot

O iniciar manualmente con: startx

🤖 5. Instalación de ROS2 Humble en Raspberry Pi 4


con Ubuntu Server 22.04
ROS2 Humble es la versión recomendada para Ubuntu 22.04 y tiene soporte activo. A
continuación te explico cómo instalarlo correctamente.

📌 5.1. Configurar locales


sudo apt update && sudo apt install -y locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

Esto asegura que los paquetes de ROS2 usen el sistema de codificación


correcto.

🔐 5.2. Agregar claves GPG y repositorios


sudo apt install -y curl gnupg lsb-release
sudo curl -sSL [Link] |
sudo gpg --dearmor -o /usr/share/keyrings/[Link]

Agregar el repositorio:

echo "deb [signed-by=/usr/share/keyrings/[Link]] \


[Link] $(lsb_release -cs) main" | \
sudo tee /etc/apt/[Link].d/[Link] > /dev/null

📦 5.3. Instalar ROS2 Humble


sudo apt update
sudo apt install -y ros-humble-desktop

Esto incluye rviz, simuladores básicos y muchas herramientas útiles.

🧠 5.4. Configurar el entorno automáticamente


Agregá la línea al final de tu ~/.bashrc:

echo "source /opt/ros/humble/[Link]" >> ~/.bashrc


source ~/.bashrc

🧰 5.5. Instalar herramientas adicionales


sudo apt install -y python3-colcon-common-extensions \
python3-pip python3-rosdep python3-argcomplete

Inicializar rosdep (una sola vez):

sudo rosdep init


rosdep update

📍Hasta acá ya tenemos ROS2 Humble operativo. En la siguiente sección entramos


de lleno con Stage para ROS2, incluyendo la opción de instalación con y sin GitHub.

🧩 6. Instalación de Stage para ROS2 (con


alternativa sin GitHub)
6.1. Crear el workspace de ROS2 si aún no existe
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

6.2. Clonar Stage y stage_ros2

✅ Opción 1: usando Git (requiere conexión a GitHub)


git clone [Link]
git clone [Link]

📦 Opción 2: sin GitHub, descargando archivos .zip


Ideal para entornos educativos sin autenticación.

cd ~/ros2_ws/src
# Descargar Stage
wget [Link] -O [Link]
unzip [Link]
mv Stage-master Stage
rm [Link]

# Descargar stage_ros2 alternativo


wget [Link]
-O stage_ros2.zip
unzip stage_ros2.zip
mv stage_ros2-master stage_ros2
rm stage_ros2.zip

6.3. Instalar dependencias del sistema


sudo apt install -y cmake g++ libpng-dev libjpeg-dev libfltk1.3-dev \
libx11-dev libxt-dev libxft-dev libxinerama-dev \
libltdl-dev libtool libboost-dev

6.4. Compilar Stage (motor gráfico)


cd ~/ros2_ws/src/Stage
mkdir build && cd build
cmake ..
make -j4
sudo make install

6.5. Compilar stage_ros2


cd ~/ros2_ws
source /opt/ros/humble/[Link]
colcon build --packages-select stage_ros2

6.6. Activar el entorno cada vez que abras una terminal


Agregá al final de ~/.bashrc:

source ~/ros2_ws/install/[Link]

Y aplicalo con:

source ~/.bashrc

🛠️ Script automatizado: instalar_stage.sh


Podés usar este instalador todo en uno:

cd ~/ros2_ws
nano instalar_stage.sh

Contenido:

📦
#!/bin/bash
echo " Instalando dependencias..."
sudo apt update && sudo apt install -y \
cmake g++ libpng-dev libjpeg-dev libfltk1.3-dev \
libx11-dev libxt-dev libxft-dev libxinerama-dev \
libltdl-dev libtool libboost-dev python3-colcon-common-extensions

echo "📁 Preparando directorios..."


mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

echo "⬇️ Clonando Stage y stage_ros2..."


git clone [Link]
git clone [Link]

echo "🔧 Compilando Stage..."


cd Stage && mkdir build && cd build
cmake .. && make -j4 && sudo make install

echo "⚙️ Compilando stage_ros2..."


cd ~/ros2_ws
source /opt/ros/humble/[Link]
colcon build --packages-select stage_ros2

echo "✅ Instalación completada. Agregá esto a tu ~/.bashrc:"


echo "source ~/ros2_ws/install/[Link]"

Luego:

chmod +x instalar_stage.sh
./instalar_stage.sh
Con esto, Stage y su paquete ROS2 estarán instalados y listos para usarse en
simulaciones 2D y 3D. En la próxima parte vamos a incluir los scripts de
automatización (lanzar_todo.sh) y ejemplos comentados como mover_robot.py
y esquiva_robot.py.

🔁 7. Automatización con scripts


7.1 Script para lanzar simulador y controlador: lanzar_todo.sh

Este script abre dos terminales: una lanza el simulador Stage, la otra ejecuta tu
programa en Python.

Para usuarios con entorno Xfce:

cd ~/ros2_ws
nano lanzar_todo.sh

Contenido:

#!/bin/bash
ROS_SETUP="/opt/ros/humble/[Link]"
WORKSPACE_SETUP="$HOME/ros2_ws/install/[Link]"

# Lanzar Stage en una terminal


xfce4-terminal --hold --title="Simulador Stage" --command="bash -c 'source
$ROS_SETUP && source $WORKSPACE_SETUP && ros2 launch stage_ros2
[Link]'"

# Ejecutar script del robot en otra terminal


xfce4-terminal --hold --title="Controlador del robot" --command="bash -c 'source
$ROS_SETUP && source $WORKSPACE_SETUP && cd
~/ros2_ws/simple_mover && python3 mover_robot.py'"

Guardar con Ctrl+O, salir con Ctrl+X, luego:

chmod +x lanzar_todo.sh

Podés ejecutarlo cada vez así:

./lanzar_todo.sh

🧠 8. Programas de ejemplo para controlar el robot


8.1 mover_robot.py: movimiento recto continuo

Ubicación sugerida: ~/ros2_ws/simple_mover/mover_robot.py


import rclpy
from [Link] import Node
from geometry_msgs.msg import Twist

class SimpleMover(Node):
def __init__(self):
super().__init__('simple_mover')
[Link] = self.create_publisher(Twist, '/cmd_vel', 10)
[Link] = self.create_timer(0.5, [Link])

def move(self):
msg = Twist()
[Link].x = 0.2 # Avanza recto
[Link](msg)

def main():
[Link]()
nodo = SimpleMover()
[Link](nodo)
nodo.destroy_node()
[Link]()

if __name__ == '__main__':
main()

8.2 esquiva_robot.py: evita obstáculos con láser

Ubicación sugerida: ~/ros2_ws/esquiva_robot/esquiva_robot.py

Este programa:

1.​ Publica comandos en /cmd_vel


2.​ Lee el láser /scan
3.​ Si detecta algo a < 0.5 m en frente, gira por 2 segundos

import rclpy
from [Link] import Node
from geometry_msgs.msg import Twist
from sensor_msgs.msg import LaserScan

class EsquivaRobot(Node):
def __init__(self):
super().__init__('esquiva_robot')
[Link] = self.create_publisher(Twist, '/cmd_vel', 10)
[Link] = self.create_subscription(LaserScan, '/scan', self.leer_laser, 10)
[Link] = 'AVANZANDO'
self.tiempo_giro = 0
[Link] = self.create_timer(0.1, [Link])
def leer_laser(self, msg):
centro = [Link][len([Link])//2 - 10 : len([Link])//2 + 10]
if min(centro) < 0.5 and [Link] != 'GIRANDO':
[Link] = 'GIRANDO'
self.tiempo_giro = 20

def controlar(self):
cmd = Twist()
if [Link] == 'AVANZANDO':
[Link].x = 0.2
elif [Link] == 'GIRANDO':
[Link].z = 0.7
self.tiempo_giro -= 1
if self.tiempo_giro <= 0:
[Link] = 'AVANZANDO'
[Link](cmd)

def main():
[Link]()
nodo = EsquivaRobot()
[Link](nodo)
nodo.destroy_node()
[Link]()

if __name__ == '__main__':
main()

⚡ 9. Overclocking seguro de Raspberry Pi 4 en


Ubuntu Server 22.04
> Advertencia: realizá esto solo si tenés buena refrigeración (disipador + ventilador).

1.​ Editar configuración del firmware:

sudo nano /boot/firmware/[Link]

2.​ Agregar al final del archivo:

# Overclock seguro
over_voltage=6
arm_freq=2100
gpu_freq=750

3.​ Asegurarse de usar el modo gráfico compatible:

dtoverlay=vc4-fkms-v3d
4.​ Guardar y reiniciar:

sudo reboot

5.​ Verificar frecuencia y temperatura:

watch -n1 vcgencmd measure_clock arm


watch -n2 vcgencmd measure_temp

> Si la temperatura supera 80 °C bajo carga, considerá bajar a arm_freq=2000.

🔐 10. Inicio automático sin login ni startx


10.1 Activar autologin en consola
sudo mkdir -p /etc/systemd/system/getty@[Link].d
sudo nano /etc/systemd/system/getty@[Link].d/[Link]

Agregar:

[Service]
ExecStart=
ExecStart=-/sbin/agetty --noissue --autologin sergio %I $TERM
Type=idle

> Cambiá “sergio” por tu usuario si es distinto.

10.2 Lanzar el entorno gráfico automáticamente


nano ~/.bash_profile

Agregar al final:

if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then


startx
fi

> Esto asegura que el entorno gráfico se cargue automáticamente al iniciar sesión.

🧾 11. Anexos: resumen de scripts


🔧 lanzar_todo.sh (con Xfce)
#!/bin/bash
ROS_SETUP="/opt/ros/humble/[Link]"
WORKSPACE_SETUP="$HOME/ros2_ws/install/[Link]"
xfce4-terminal --hold --title="Simulador Stage" --command="bash -c 'source
$ROS_SETUP && source $WORKSPACE_SETUP && ros2 launch stage_ros2
[Link]'"

xfce4-terminal --hold --title="Controlador del robot" --command="bash -c 'source


$ROS_SETUP && source $WORKSPACE_SETUP && cd
~/ros2_ws/simple_mover && python3 mover_robot.py'"

📜 esquiva_robot.py (comportamiento autónomo con sensores)


> Ver sección 8.2 del documento para el código completo y explicado.

🎉 ¡Felicitaciones! Completaste una instalación robusta de un entorno gráfico,


simulador de robótica, controladores personalizados y optimización del sistema en tu
Raspberry Pi 4. Todo con capacidad para enseñar, replicar y seguir creciendo.

📁 Estructura sugerida de carpetas y archivos


ros2_ws/

├── lanzar_todo.sh

├── instalar_stage.sh

├── simple_mover/

│ └── mover_robot.py

├── esquiva_robot/

│ └── esquiva_robot.py

🛠️ Cómo crearla y empaquetarla como .zip


1.​ Crear las carpetas y copiar los scripts

cd ~/ros2_ws

# Crear carpetas

mkdir -p simple_mover esquiva_robot

# Crear y copiar los archivos

nano lanzar_todo.sh # Pegar contenido de lanzar_todo.sh

nano instalar_stage.sh # Pegar contenido del instalador


cd simple_mover

nano mover_robot.py # Pegar código del robot que avanza

cd ../esquiva_robot

nano esquiva_robot.py # Pegar código del robot que esquiva

2.​ Dar permisos de ejecución a los scripts

cd ~/ros2_ws

chmod +x lanzar_todo.sh instalar_stage.sh

3.​ Empaquetar todo en un archivo ZIP

cd ~

zip -r proyecto_ros2_stage.zip ros2_ws

Esto creará el proyecto_ros2_stage.zip en tu carpeta personal (~/), listo para


copiar o compartir.

Gemelo digital o control simulado-real en paralelo


Es una de las experiencias más potentes para enseñar robótica, el robot diferencial
físico —con ESP32 y microservos de giro continuo— se mueve al mismo tiempo que
su versión simulada en Stage, recibiendo las mismas órdenes desde un nodo ROS2.

El esquema general sería:

+------------------------------+
| ROS2 en la Pi |
+------------------------------+
| |
| +--> Stage (robot simulado)
|
+--> ESP32 (robot real)
↳ recibe comandos vía UART / WiFi

El nodo en ROS2 publica un Twist en /cmd_vel. Ese mensaje:

●​ Es consumido por stage_ros2, que mueve el robot simulado.


●​ Es reenviado al ESP32, que lo interpreta y mueve a los servos.

🧩 Paso 1: comunicación Pi ↔ ESP32


Primero, decidimos cómo conectar tu ESP32:

●​ Opción A: Serial (UART) por USB Más simple, confiable y sin necesidad de
WiFi.
●​ Opción B: WiFi (ROS2 Micro-ROS o protocolo propio) Requiere más
configuración, ideal si querés usar microros_client.

Para empezar, se recomienda UART por simplicidad.

🔁 Paso 2: nodo ROS2 que reenvía /cmd_vel al


ESP32
Creamos un nodo ROS2 en Python que:

1.​ Se suscribe a /cmd_vel


2.​ Toma los valores linear.x y angular.z
3.​ Los traduce a una cadena compacta (ej: "0.2,0.0\n")
4.​ Los envía por puerto serie al ESP32

🔌 Paso 3: ESP32 que recibe y ejecuta


Tu ESP32:

●​ Escucha por [Link]('\n')


●​ Extrae los dos valores
●​ Aplica estos valores a los SG90 (uno para cada rueda)
○​ Calcula velocidad relativa para cada servo según giro diferencial

Esto permite que el ESP32 y el robot simulado reciban los mismos comandos al
mismo tiempo.

🛠️ Vamos a preparamos primero el nodo ROS2 que reenvía por serial /cmd_vel, y
luego el sketch Arduino para interpretar eso en el ESP32 y mover los SG90

📡 Parte 1: Conectar ROS2 con el ESP32 vía Serial


🎯 Objetivo
El nodo se suscribe a /cmd_vel, y cada vez que recibe un mensaje, lo traduce a texto
(por ejemplo: "0.2,0.0\n") y lo envía al ESP32 vía /dev/ttyUSB0.

🔧 Paso a paso para el nodo reenvia_cmdvel.py


1.​ 📂 Creamos una carpeta nueva:
cd ~/ros2_ws

mkdir -p enviar_serial

cd enviar_serial

2.​ ✍️ Creamos el script:


nano reenvia_cmdvel.py

3.​ 🔠 Pegar este código en python:


#!/usr/bin/env python3

import rclpy

from [Link] import Node

from geometry_msgs.msg import Twist

import serial

class CmdVelSerialBridge(Node):

def __init__(self):

super().__init__('cmdvel_serial_bridge')

self.serial_port = [Link]('/dev/ttyUSB0', 115200, timeout=1)

[Link] = self.create_subscription(

Twist,

'/cmd_vel',

self.cmd_vel_callback,

10

self.get_logger().info(' 🌐 Nodo puente ROS2 → ESP32 iniciado')


def cmd_vel_callback(self, msg):

lin = [Link].x

ang = [Link].z

texto = f"{lin:.2f},{ang:.2f}\n"
self.serial_port.write([Link]('utf-8'))

self.get_logger().info(f'↪ Enviado: {[Link]()}')

def main():

[Link]()

nodo = CmdVelSerialBridge()

[Link](nodo)

nodo.destroy_node()

[Link]()

if __name__ == '__main__':

main()

4.​ 💾 Guardá el archivo y salí. Luego asegurate de tener pyserial:


pip3 install pyserial

5.​ 🧪 Probá el nodo (con el ESP32 conectado):


source ~/ros2_ws/install/[Link]

cd ~/ros2_ws/enviar_serial

python3 reenvia_cmdvel.py

> Deberías ver en consola cada línea enviada al ESP32. Esos valores llegarán como
cadenas de texto al otro lado, listos para interpretar.

🔜 Próximo paso: el código del ESP32


Vamos a armar ahora el sketch Arduino para que:

●​ Lea del puerto serie la línea "0.2,0.0\n"


●​ Separe linear y angular
●​ Calcule la velocidad de cada SG90 (rueda izquierda y derecha)
●​ Controle los servos como robot diferencial

🤖 Parte 2: Sketch del ESP32 que interpreta


/cmd_vel y mueve los servos

🎯 Objetivo
●​ Leer datos del puerto serie en forma "lineal,angular\n"
●​ Convertir esos valores en velocidad para las ruedas izquierda y derecha
●​ Controlar los servos SG90 (uno por cada rueda)

🔧 Wiring sugerido
Componente Pin ESP32 Notas

SG90 Izquierdo GPIO 5 PWM, con ledc

SG90 Derecho GPIO 18 PWM, con ledc

GND Servo GND Mismo GND entre servos y ESP

VCC Servo 5V Ideal usar fuente externa si hay


ruido

💡 Calibración rápida de servos SG90 de giro continuo


●​ Tienen un rango de control en microsegundos: ~1300–1700 µs
●​ Velocidad 0 (parado) suele estar en 1500 µs
●​ Más bajo → gira a izquierda; más alto → a derecha

Vamos a traducir velocidades diferenciales a este lenguaje.

✍️ Código de ejemplo completo (Arduino para ESP32)


cpp

#include <Arduino.h>

#define SERVO_LEFT_CHANNEL 0

#define SERVO_RIGHT_CHANNEL 1

#define SERVO_LEFT_PIN 5

#define SERVO_RIGHT_PIN 18
// Rango PWM para SG90 (en microsegundos)

const int PWM_MIN = 1300;

const int PWM_NEUTRO = 1500;

const int PWM_MAX = 1700;

// Parámetro de velocidad máxima esperada (m/s)

const float MAX_SPEED = 0.3;

void setup() {

[Link](115200);

// Configurar PWM (ledc)

ledcSetup(SERVO_LEFT_CHANNEL, 50, 16); // 50 Hz, 16 bits

ledcAttachPin(SERVO_LEFT_PIN, SERVO_LEFT_CHANNEL);

ledcSetup(SERVO_RIGHT_CHANNEL, 50, 16);

ledcAttachPin(SERVO_RIGHT_PIN, SERVO_RIGHT_CHANNEL);

detener();

[Link](" 🤖 Esperando comandos desde ROS2...");


}

void loop() {

if ([Link]()) {

String linea = [Link]('\n');

[Link]();
float linear = 0.0, angular = 0.0;

int sep = [Link](',');

if (sep > 0) {

linear = [Link](0, sep).toFloat();

angular = [Link](sep + 1).toFloat();

float vL = linear - angular; // rueda izquierda

float vR = linear + angular; // rueda derecha

aplicarPWM(vL, vR);

void aplicarPWM(float vIzq, float vDer) {

int pwmL = PWM_NEUTRO + (int)(constrain(vIzq, -MAX_SPEED, MAX_SPEED) /


MAX_SPEED * (PWM_MAX - PWM_NEUTRO));

int pwmR = PWM_NEUTRO + (int)(constrain(vDer, -MAX_SPEED, MAX_SPEED) /


MAX_SPEED * (PWM_MAX - PWM_NEUTRO));

// Invertimos uno si el servo está montado al revés

pwmR = 2 * PWM_NEUTRO - pwmR;

ledcWrite(SERVO_LEFT_CHANNEL, map(pwmL, 1000, 2000, 3276, 6553));

ledcWrite(SERVO_RIGHT_CHANNEL, map(pwmR, 1000, 2000, 3276, 6553));


}

void detener() {

aplicarPWM(0.0, 0.0);

🧪 Pruebas y ajustes
●​ Si tus servos giran al revés, podés invertir pwmL o pwmR.
●​ Si avanzan aunque linear = 0.0, ajustá el PWM_NEUTRO.
●​ Si querés que el robot real y el simulado estén súper sincronizados, asegurate
de que los valores de MAX_SPEED coincidan con los del simulador.

🎬 Objetivo final: lanzamiento completo coordinado


Vamos a crear un script lanzar_real_y_virtual.sh que:

1.​ Lanza Stage con el mundo simulado.


2.​ Lanza tu script mover_robot.py o esquiva_robot.py.
3.​ Lanza el puente reenvia_cmdvel.py que manda los mismos comandos al
ESP32.
4.​ Opcional: ejecuta un comportamiento definido (por ejemplo, avanzar 1 s, girar
90°, avanzar 1 s más…).

🛠️ Paso 1: Script de control sincronizado


(giro_90.py)
Este programa manda comandos secuenciales por /cmd_vel durante tiempos
determinados.

python

import rclpy

from [Link] import Node

from geometry_msgs.msg import Twist

import time

class ScriptGiro(Node):
def __init__(self):

super().__init__('giro_90')

[Link] = self.create_publisher(Twist, '/cmd_vel', 10)

[Link](1.0) # Esperar conexiones

[Link]()

def secuencia(self):

cmd = Twist()

# Avanzar 1 segundo

[Link].x = 0.2

[Link](cmd)

[Link](1)

# Girar 90° durante 1.4 s aprox (ajustable)

[Link].x = 0.0

[Link].z = 1.0

[Link](cmd)

[Link](1.4)

# Avanzar nuevamente

[Link].z = 0.0

[Link].x = 0.2

[Link](cmd)

[Link](1)
# Detener

[Link].x = 0.0

[Link].z = 0.0

[Link](cmd)

self.get_logger().info('✅ Secuencia finalizada')


def main():

[Link]()

nodo = ScriptGiro()

nodo.destroy_node()

[Link]()

if __name__ == '__main__':

main()

📂 Guardalo en ~/ros2_ws/giro_90/giro_90.py
🧨 Paso 2: nuevo lanzador automatizado
bash

cd ~/ros2_ws

nano lanzar_real_y_virtual.sh

Pegá esto:

#!/bin/bash

ROS_SETUP="/opt/ros/humble/[Link]"

WORKSPACE_SETUP="$HOME/ros2_ws/install/[Link]"
xfce4-terminal --hold --title="Simulador Stage" --command="bash -c 'source
$ROS_SETUP && source $WORKSPACE_SETUP && ros2 launch stage_ros2
[Link]'"

sleep 3

xfce4-terminal --hold --title="Serial → ESP32" --command="bash -c 'source


$ROS_SETUP && source $WORKSPACE_SETUP && cd ~/ros2_ws/enviar_serial &&
python3 reenvia_cmdvel.py'"

sleep 2

xfce4-terminal --hold --title="Comando coordinado" --command="bash -c 'source


$ROS_SETUP && source $WORKSPACE_SETUP && cd ~/ros2_ws/giro_90 &&
python3 giro_90.py'"

Luego:

chmod +x lanzar_real_y_virtual.sh

🚀 Para usarlo:
1.​ Conectá el ESP32.

Asegurate de que tu usuario tenga acceso a /dev/ttyUSB0:​


bash​
sudo usermod -a -G dialout $USER

2.​ (y reiniciá)

Ejecutá:​
./lanzar_real_y_virtual.sh

3.​

🕺🤖📺
Y ahí los verás: robot rojo en pantalla y tu autito físico girando al mismo tiempo, con
precisión casi coreográfica

Continuará …

También podría gustarte