Robocar · TFM · Arquitectura
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.
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.
Nodos que leen el hardware (I2C, GPIO, serie) y lo publican como topics. No consumen nada: son las fuentes.
| Nodo | Publica | Fuente HW |
|---|---|---|
| rplidar_node | /scan LaserScan | RPLidar C1 (serie /dev/ttyS0) |
| encoder_node | /wheel_speed TwistStamped | Arduino I2C 0x08 (rueda dentada) |
| accelerometer_node | /imu Imu | MPU6050 I2C 0x68 |
| distance_node | /ultrasound_data Distance | HC-SR04 ×3 (GPIO) |
| energy_node | /energy Energy | INA3221/INA226 I2C |
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.
| Nodo | Consume ◀ / 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 |
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.
| Nodo | Consume ◀ / 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 |
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.
| Nodo | Consume ◀ / 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 |
| Nodo | Consume ◀ / 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 |
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.