【ROS2 实战】基于激光雷达 (Lidar) 的 ROS2 小车避障功能实现(Python 完整源码 + 详细解析)
前言
在移动机器人开发中,避障是最基础也是最核心的功能之一。激光雷达(Lidar)凭借测距精度高、响应速度快、不受光线影响的优势,成为机器人避障的首选传感器。本文将基于 ROS2 Humble 框架,使用 Python 语言从零实现一套完整的、可直接运行的激光雷达避障程序,功能逻辑通用,适配绝大多数带激光雷达的 ROS2 移动小车,代码可直接复用、二次开发。
本文知识点:
- ROS2 话题订阅(激光雷达
/scan数据)与发布(速度控制/cmd_vel数据) - 激光雷达
LaserScan数据解析与有效数据过滤 - 机器人前方扇形区域障碍物检测算法
- 前进 / 避障旋转的运动逻辑闭环控制
- ROS2 节点优雅启停与异常处理
一、实现功能说明
本次实现的激光雷达避障功能,核心逻辑简洁且实用,符合移动机器人避障的基础设计思路:
- 机器人默认以恒定线速度向前匀速行驶;
- 实时采集激光雷达数据,只检测车头前方指定角度的扇形区域(可自定义角度);
- 当检测到前方扇形区域内出现障碍物,且障碍物距离小于设定的安全阈值时,立即停止前进,执行原地逆时针旋转(左转) 避障;
- 当旋转至前方无障碍物后,自动恢复向前行驶;
- 程序支持手动终止(Ctrl+C),终止时自动发布停车指令,保证小车安全停止;
- 完善的日志打印,实时查看运行状态、障碍物距离等关键信息。
二、核心依赖与话题说明
✅ 依赖的 ROS2 功能包 / 消息类型
本次开发仅使用 ROS2 原生的基础功能包,无需额外安装依赖,所有导入均可直接使用:
import rclpy # ROS2 Python核心库 from rclpy.node import Node # ROS2节点基类 from geometry_msgs.msg import Twist # 速度控制消息类型 from sensor_msgs.msg import LaserScan # 激光雷达消息类型 import math # 数学工具库,用于数据过滤✅ 核心话题说明
- 订阅话题:
/scan→ 激光雷达的扫描数据,消息类型sensor_msgs/msg/LaserScan,包含雷达的所有测距点、测距范围、角度分辨率等核心信息 - 发布话题:
/cmd_vel→ 小车的速度控制指令,消息类型geometry_msgs/msg/Twist,包含线速度 (linear) 和角速度 (angular),是 ROS2 移动小车的通用速度控制话题
三、完整可运行源码
所有代码经过实测验证,可直接复制到.py文件中运行,代码中添加了详尽注释,关键逻辑一目了然。可自定义参数全部集中置顶,无需深入代码逻辑,直接修改参数即可适配自己的小车。
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- i