【ROS2 实战】基于激光雷达 (Lidar) 的 ROS2 小车避障功能实现(Python 完整源码 + 详细解析)

前言

在移动机器人开发中,避障是最基础也是最核心的功能之一。激光雷达(Lidar)凭借测距精度高、响应速度快、不受光线影响的优势,成为机器人避障的首选传感器。本文将基于 ROS2 Humble 框架,使用 Python 语言从零实现一套完整的、可直接运行的激光雷达避障程序,功能逻辑通用,适配绝大多数带激光雷达的 ROS2 移动小车,代码可直接复用、二次开发。

本文知识点:

  • ROS2 话题订阅(激光雷达/scan数据)与发布(速度控制/cmd_vel数据)
  • 激光雷达LaserScan数据解析与有效数据过滤
  • 机器人前方扇形区域障碍物检测算法
  • 前进 / 避障旋转的运动逻辑闭环控制
  • ROS2 节点优雅启停与异常处理

一、实现功能说明

本次实现的激光雷达避障功能,核心逻辑简洁且实用,符合移动机器人避障的基础设计思路:

  1. 机器人默认以恒定线速度向前匀速行驶
  2. 实时采集激光雷达数据,只检测车头前方指定角度的扇形区域(可自定义角度);
  3. 当检测到前方扇形区域内出现障碍物,且障碍物距离小于设定的安全阈值时,立即停止前进,执行原地逆时针旋转(左转) 避障;
  4. 当旋转至前方无障碍物后,自动恢复向前行驶;
  5. 程序支持手动终止(Ctrl+C),终止时自动发布停车指令,保证小车安全停止;
  6. 完善的日志打印,实时查看运行状态、障碍物距离等关键信息。

二、核心依赖与话题说明

✅ 依赖的 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

Read more

Flutter 三方库 shelf_web_socket 的鸿蒙化适配指南 - 实现具备高性能全双工长连接与协议协商能力的端侧服务端架构、支持分布式实时信令与多端协同实战

Flutter 三方库 shelf_web_socket 的鸿蒙化适配指南 - 实现具备高性能全双工长连接与协议协商能力的端侧服务端架构、支持分布式实时信令与多端协同实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 shelf_web_socket 的鸿蒙化适配指南 - 实现具备高性能全双工长连接与协议协商能力的端侧服务端架构、支持分布式实时信令与多端协同实战 前言 在进行 Flutter for OpenHarmony 开发时,当我们的鸿蒙应用需要充当“控制中心”角色(如控制智能家居、开启本地调试服务或实现 P2P 实时对抗脚本时),如何在端侧直接拉起一个支持 WebSocket 协议的高性能微服务端?shelf_web_socket 是针对 shelf 后端框架封装的一款官方级 WebSocket 处理器。本文将探讨如何在鸿蒙端构建极致、透明的长连接交互引擎。 一、原直观解析 / 概念介绍 1.1 基础原理 该库本质上是一个 shelf 处理函数(Handler)

By Ne0inhk

我用Claude Code + GLM4.7修前端Bug的翻车现场,1小时烧光5小时限额

本来想体验一把“vibe coding 省时间”,结果变成“vibe coding 省不了、还很贵”:折腾将近一小时,GLM 额度直接打满,Bug 还在。 背景:事情是怎么开始的 最近遇到一个前端 Bug,属于那种看起来不大、但很烦的类型:页面运行时报错,提示动态导入某个模块失败(报错里能看到类似 Failed to fetch dynamically imported module .../router/index.ts 这种信息)。 我想着正好试试工具链:Claude Code + GLM4.7。理想情况是:它读代码、跑命令、给修改方案,我负责点确认就行。 现实是另一回事。 结果:时间花了,额度没了,Bug 还没修好 简单总结一下这次的“

By Ne0inhk

参数验证 @Validated 和 @Valid 的区别:Java Web 开发必备详解

1. 引言:参数验证的重要性与 Java Bean Validation 规范 在 Java Web 开发中,参数验证是保障系统安全与数据完整性的重要防线。无论是前端传递的用户输入、第三方接口的调用参数,还是服务层内部方法的参数,都需要经过严格的校验,避免脏数据进入核心业务逻辑,甚至引发 SQL 注入、XSS 攻击等安全漏洞。 传统的参数验证方式是在业务代码中手动编写 if-else 判断逻辑,这不仅繁琐、重复,而且难以维护。为了解决这一痛点,Java 社区制定了 Bean Validation 规范(JSR 303,JSR 349,JSR 380),提供了一套基于注解的声明式验证框架。开发者只需在 JavaBean 的属性上添加 @NotNull、@Size、@Min 等约束注解,然后在验证点触发校验即可。 在

By Ne0inhk
AI Skills:前端新的效率神器

AI Skills:前端新的效率神器

近来,AI 领域有个火爆的话题:Skills。 Github 上被疯狂 star 的仓库,很多都是和 skills 有关的。 有的仓库仅仅上线三个月就获得了快 50K 的 star,Skills 的火热可见一斑。 不管是大模型,还是 Cursor、Codex、Claude、Trae、Copilot 等编程 IDE 都在争先支持 Skills。 围绕 Skills,它们在做的就是为了完成一件事情:技能是通过学习和反复练习获得的,而 Skills 是把经验和最佳实践沉淀为 AI 能力,将“知道”转化为“做到”的本领。 详解什么是 Skills 要说清楚什么是 Skills,先来了解一下关于 AI 的 2

By Ne0inhk