Código básico para leer el LiDAR
Dos caminos: Python, para entender los datos y hacer pruebas rápidas, y ROS 2, para usarlo dentro de un robot como el Rover.
Con Python
Instalar la librería
pip install rplidar-roboticia matplotlib
1. Leer una vuelta
from rplidar import RPLidar
lidar = RPLidar('/dev/ttyUSB0')
print(lidar.get_info()) # modelo, firmware y número de serie
print(lidar.get_health()) # ('Good', 0) si todo va bien
try:
for i, vuelta in enumerate(lidar.iter_scans()):
print(f'Vuelta {i}: {len(vuelta)} puntos')
for calidad, angulo, distancia in vuelta[:5]:
print(f' {angulo:6.1f}° {distancia:7.1f} mm')
if i >= 4:
break
finally:
lidar.stop()
lidar.stop_motor()
lidar.disconnect()
iter_scans()va devolviendo vueltas completas, cada una como una lista de(calidad, ángulo, distancia)- El bloque
finallypara el motor y libera el puerto aunque el programa falle
2. Ver el entorno en directo
import math
import matplotlib.pyplot as plt
from rplidar import RPLidar
lidar = RPLidar('/dev/ttyUSB0')
plt.ion()
fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
try:
for vuelta in lidar.iter_scans():
angulos = [math.radians(a) for _, a, _ in vuelta]
distancias = [d / 1000 for _, _, d in vuelta] # a metros
ax.clear()
ax.scatter(angulos, distancias, s=2)
ax.set_rmax(4)
plt.pause(0.01)
finally:
lidar.stop()
lidar.stop_motor()
lidar.disconnect()
Verás el contorno de la habitación desde el punto de vista del LiDAR. Muévete a su alrededor y aparecerás como un pequeño arco que se desplaza.
3. ¿Hay algo cerca?
for vuelta in lidar.iter_scans():
delante = [d for _, a, d in vuelta if (a < 20 or a > 340) and d > 0]
if delante and min(delante) < 400:
print(f'Obstáculo delante a {min(delante):.0f} mm')
Filtra los puntos de los ±20° de delante y mira el más cercano: es la base para esquivar obstáculos con un LiDAR.
Con ROS 2
En ROS 2, un nodo se encarga del LiDAR y publica cada vuelta en el topic /scan (mensaje sensor_msgs/LaserScan). Cualquier otro nodo del robot (mapas, navegación) la recibe de ahí.
Instalar el driver
sudo apt install ros-humble-rplidar-ros
Lanzarlo y verlo
ros2 launch rplidar_ros view_rplidar_a1_launch.py serial_port:=/dev/ttyUSB0
Se abre RViz con los puntos del LiDAR. Para lanzar solo el nodo, sin RViz, usa rplidar_a1_launch.py.
Comprobar el topic
ros2 topic hz /scan # vueltas por segundo
ros2 topic echo /scan --once
El mensaje trae los ángulos de inicio y fin, el incremento entre medidas y la lista ranges con las distancias en metros.
¿Y ahora qué?
Así es como el Rover lee su LiDAR. Con el topic /scan funcionando, el siguiente paso en ROS 2 es construir un mapa con slam_toolbox y navegar por él con Nav2.