Rover de 4 ruedas directrices con dos cámaras de profundidad en las esquinas
delanteras, y visualización en RViz de las dos nubes de puntos referidas al
mismo base_link del rover.
- Intel RealSense D435 (sin IMU), esquina delantera izquierda → nube a
color en
/camera/camera/depth/color/points - Intel RealSense D415, esquina delantera derecha → nube a color en
/d415/d415/depth/color/points
ROS 2 Jazzy · Ubuntu 24.04.
base_footprint (proyección en el suelo, raíz)
└── base_link (chasis del rover, 0.44 m sobre el suelo)
├── camera_link RealSense D435 (joint fijo del URDF)
│ └── camera_depth_optical_frame → /camera/camera/depth/color/points
├── d415_link RealSense D415 (joint fijo del URDF)
│ └── d415_depth_optical_frame → /d415/d415/depth/color/points
└── fl/fr/rl/rr_steering_link → *_wheel_link
El rover se describe en urdf/rover.urdf.xacro (mallas STL en urdf/assets/),
que publica su modelo y su TF en /robot_description con robot_state_publisher.
Las ruedas y la dirección son joints móviles, así que un joint_state_publisher
los publica a cero (rover parado, ruedas rectas).
# Las dos cámaras + modelo del rover + RViz
ros2 launch robot_pointcloud robot_pointcloud.launch.py
# Sin la D415 derecha (por ejemplo, si no está conectada)
ros2 launch robot_pointcloud robot_pointcloud.launch.py d415:=false
# Sin la D435 izquierda
ros2 launch robot_pointcloud robot_pointcloud.launch.py d435:=false
# Sin RViz (solo drivers + TF)
ros2 launch robot_pointcloud robot_pointcloud.launch.py rviz:=false| Argumento | Default | Descripción |
|---|---|---|
d435 |
true |
Arrancar la D435 (esquina delantera izquierda). |
d415 |
true |
Arrancar la D415 (esquina delantera derecha). |
rviz |
true |
Abrir RViz con el rover y las dos nubes precargados. |
align_depth |
false |
Alinear profundidad al color (caro en CPU; la nube a color no lo necesita). |
rs_depth_profile |
640x480x15 |
Perfil de profundidad de la D435 (WxHxFPS). |
rs_color_profile |
640x480x15 |
Perfil de color de la D435 (WxHxFPS). |
d415_depth_profile |
640x480x15 |
Perfil de profundidad de la D415 (WxHxFPS). |
d415_color_profile |
640x480x15 |
Perfil de color de la D415 (WxHxFPS). |
rs_device_type |
d435 |
Modelo que debe abrir el driver izquierdo (regex). |
d415_device_type |
d415 |
Modelo que debe abrir el driver derecho (regex). |
rs_serial_no |
(vacío) | Serial de la D435 (vacío = cualquiera del modelo). |
d415_serial_no |
(vacío) | Serial de la D415 (vacío = cualquiera del modelo). |
En el URDF, no en el launch. Los links de las cámaras se llaman igual que el
frame raíz que publica cada driver (camera_link, d415_link), así que el
robot_state_publisher del rover ya les da padre: no hay
static_transform_publisher en ningún sitio. Para re-apuntarlas, edita solo
estas propiedades en urdf/rover.urdf.xacro:
| Propiedad | Valor | Qué es |
|---|---|---|
mount_x |
0.27 |
Media anchura del chasis: ±X de las esquinas delanteras. |
mount_y |
-0.62 |
Y de la cara delantera (adelante es −Y en base_link). |
mount_z |
0.08 |
Altura sobre base_link (≈0.52 m del suelo, libra ruedas). |
cam_pitch |
30° |
Cabeceo hacia abajo, para ver el camino cercano. |
cam_splay |
15° |
Cuánto abre cada cámara hacia su lado respecto del frente. |
El eje óptico es el +X del frame *_link, y en base_link (que viene del
CAD) adelante es −Y, por eso el yaw de referencia es −90°: cada cámara queda
en yaw = −90° ∓ cam_splay (D435 −105°, D415 −75°).
El par es simétrico: mismo cam_splay para las dos, así que la escena queda
espejada respecto del eje longitudinal del rover. Con 15° las dos se solapan
bastante al frente (sin punto ciego delante) a costa de menos cobertura lateral;
subir cam_splay abre el abanico y reduce el solape.
Las posiciones (
mount_*) y el cabeceo salen deurdf/my_robot.urdf(el URDF de simulación del rover, con inercias, sensores de Gazebo,ros2_control, lidar/IMU/GPS). Ahí el par no era simétrico: 37.5° la #1 y 15° la #2.
Ambas usan el mismo driver (realsense2_camera), así que hay dos cosas que
separarlas:
- Qué cámara abre cada nodo →
device_type, una regex sin distinguir mayúsculas contra el nombre del dispositivo (Intel RealSense D435). Por eso los defaults sond435yd415. Si algún día montas dos cámaras del mismo modelo, esto ya no basta: mira los seriales conrs-enumerate-devices -sy pásalos enrs_serial_no/d415_serial_no. - Que no se pisen topics ni frames → la derecha corre con
camera_name/camera_namespace=d415. El driver prefija los frames con ese nombre, de ahíd415_linkyd415_depth_optical_frame, y los topics quedan bajo/d415/d415/.... La izquierda conserva el nombre por defecto (camera).
- Necesita las dos cámaras conectadas por USB (o
d435:=false/d415:=falsesi falta alguna). - Ancho de banda USB: repártelas en controladores USB distintos (
lsusb -t) y, si ves tirones, baja los perfiles (*_depth_profile/*_color_profile) antes que cualquier otra cosa. urdf/my_robot.urdfyurdf/venture_robot.urdfson los URDF de simulación del rover y no los usa este paquete; quedan como referencia de la geometría y de las poses de montaje.