Robocar · TFM · Arquitectura

Mapa de nodos ROS2

Qué nodos corren en el robocar, qué información publica y consume cada uno, y cómo se encadenan: de los sensores a la odometría, el SLAM, la navegación y la observación. Capturado del grafo real en marcha.

Flujo de datos, de un vistazo

Sensores
rplidar_nodeencoder_nodeaccelerometer_nodedistance_nodeenergy_node
/scan▼/wheel_speed▼/imu▼
Odometría
wheel_twistcov_node▶/wheel_speed_cov rf2o_laser_odometry▶/odom_rf2o ekf_filter_node
/odometry/filtered + TF odom→base_link ▼
SLAM
cartographer_node▶/submap_listoccupancy_grid_node▶/map + TF map→odom
Teleop
joy_node▶/joyteleop_twist_joy_node▶/cmd_velcar_control_node▶ PCA9685 (I2C)
Web
rosbridge_websocket◀ suscribe todo ▶ ws:9090→ panel robocar.local:8080
Modelo
robot_state_publisher▶ /robot_description + TF *_static (URDF)
▼ = publica · ◀/▶ = consume/produce · las etiquetas son los topics

Diagrama del grafo: nodos y topics

Versión interactivaEste esquema es una foto fija. Para explorar todos los nodos (arrastrables), ver la ficha de cada uno y sus topics de publicación/suscripción, abre el grafo interactivo.

Cada caja es un nodo (color = categoría); cada flecha es un topic en sentido publica → consume. Las líneas continuas azules/naranjas son el flujo principal (odometría y control); las punteadas grises son las tomas de telemetría que consume el puente web.

/scan/scan/wheel_speed/wheel_speed_cov/imu/odom_rf2o (desactivado)/odometry/filtered/submap_list/joy/joy/cmd_velservo + ESC/ultrasound_data/energy/map rplidar_nodeencoder_nodeaccelerometer_nodedistance_nodeenergy_nodejoy_noderf2o_laser_odometrywheel_twistcov_nodeteleop_twist_joy_nodeekf_filter_nodeTF odom→base_linkcar_control_nodecartographer_nodeTF map→odomPCA9685 (I2C)occupancy_grid_noderosbridge_websocket
— flujo odometría/SLAM — teleop/control ··· telemetría → web ·· /odom_rf2o (fusión desactivada)

Sensores Drivers de hardware → ROS

Nodos que leen el hardware (I2C, GPIO, serie) y lo publican como topics. No consumen nada: son las fuentes.

NodoPublicaFuente HW
rplidar_node/scan LaserScanRPLidar C1 (serie /dev/ttyS0)
encoder_node/wheel_speed TwistStampedArduino I2C 0x08 (rueda dentada)
accelerometer_node/imu ImuMPU6050 I2C 0x68
distance_node/ultrasound_data DistanceHC-SR04 ×3 (GPIO)
energy_node/energy EnergyINA3221/INA226 I2C

Odometría Fusión de sensores (EKF)

Convierten y fusionan las fuentes en una pose. El ekf_filter_node es el corazón: escucha tres fuentes y produce la pose + el TF odom→base_link.

NodoConsume ◀ / Publica ▶
wheel_twistcov_nodeadaptador: añade covarianza/wheel_speed TwistStamped/wheel_speed_cov TwistWithCovarianceStamped
rf2o_laser_odometryodometría láser (scan-matching)/scan/odom_rf2o Odometry
ekf_filter_noderobot_localization/wheel_speed_cov · /imu · /odom_rf2o · /set_pose/odometry/filtered Odometry · TF odom→base_link · /diagnostics
Matiz TFrf2o anuncia un publisher de /tf pero no emite transformaciones (arranca con publish_tf=false): el dueño de odom→base_link es el EKF, sin conflicto.

SLAM Mapa y localización

Cartographer casa el /scan con el mapa usando la odometría del EKF como apoyo, y publica la corrección global map→odom. El grid node convierte los submaps en un mapa navegable.

NodoConsume ◀ / Publica ▶
cartographer_node/scan · /odometry/filteredTF map→odom · /submap_list · /scan_matched_points2 · /trajectory_node_list · /constraint_list
occupancy_grid_node/submap_list/map OccupancyGrid

Teleop / control Del mando a los motores

El mando produce /joy; teleop lo traduce a /cmd_vel; car_control_node convierte todo en señales al PCA9685 (dirección + tracción). No publica topics de salida: actúa sobre el hardware.

NodoConsume ◀ / Publica ▶
joy_node/joy Joy/joy/set_feedback
teleop_twist_joy_node/joy/cmd_vel Twist
car_control_nodepuente Ackermann/joy · /cmd_vel · /lane_infoPCA9685 (I2C): servo dirección + ESC tracción

Observabilidad + modelo del robot

NodoConsume ◀ / Publica ▶
robot_state_publisherURDF → árbol TF/joint_states/robot_description · TF *_static (base_link→laser/imu/us…)
rosbridge_websocket + rosapipuente web (panel)se suscribe a los topics del panel (imu, scan, odom, map, energía…)ws://…:9090 → panel robocar.local:8080

El árbol TF: quién publica cada tramo

map ──▶ odom · lo publica cartographer_node (corrige la deriva)
odom ──▶ base_link · lo publica ekf_filter_node (encoder+IMU+láser)
base_link ──▶ laser / imu_link / us_* · fijo, robot_state_publisher (URDF)
Nodos opcionales (no siempre activos)camera_node y processing_node (detección de carril → /lane_info) son del pipeline de lane-following y no corren en el arranque estándar. car_control_node se lanza aparte del panel (mueve motores).

Mantener este mapa al día. Es una foto del grafo real. Cuando cambien los nodos o los topics, se refresca ejecutando el generador tools/gen-node-map.sh (con el stack en marcha), que introspecciona el grafo vivo (ros2 node info) y vuelca un snapshot para actualizar este documento.