# Nav2 Collision Monitor拒绝range=inf的Range消息导致避障失效

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-10-16-navigation2-6669
> 频道：pitfalls | 更新日期：2026-10-16 | 标签：auto, github-issue, navigation2
> 核心摘要：Collision Monitor因校验逻辑不支持INF值而丢弃有效Range消息，需修改validateMsg函数以允许浮点INF。

# Nav2 Collision Monitor拒绝range=inf的Range消息导致避障失效

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[Collision Monitor rejects "sensor_msgs/msg/Range" messages with range=.inf](https://github.com/ros-navigation/navigation2/issues/6669)（GitHub ros-navigation/navigation2 #6669）

**状态**：有绕过办法

## 问题

在ROS2 Lyrical版Nav2中，Collision Monitor节点接收sensor_msgs/msg/Range消息时，若range字段值为float('inf')，会被内部消息校验机制判定为无效并丢弃，导致超声波等传感器在探测不到障碍物时无法正确更新状态，进而影响StopZone等安全策略的执行。

## 环境

Ubuntu 26.04.1, ROS2 Lyrical, nav2_collision_monitor 1.5.2-2resolute.20260921.014704, Intel/AMD64或Raspberry Pi 5

## 解决办法

1. 定位nav2_ros_common/include/nav2_ros_common/validate_messages.hpp中针对float/double的validateMsg函数
2. 新增validateMsgInfValid模板函数，在原有数值范围检查基础上显式允许std::isinf()为true的情况
3. 修改nav2_collision_monitor/src/range.cpp第169行附近的校验调用，将Range类型传感器的range字段验证替换为validateMsgInfValid
4. 确保该修改仅作用于type: range的观测源，不影响其他传感器类型的校验逻辑
5. 向navigation2仓库main分支提交PR，维护者确认后将自动反向移植至lyrical分支

讨论原作者：@slgrobotics 等，版权归原作者所有。
:::

## 原始参考来源 (Sources)

- [GitHub ros-navigation/navigation2 #6669：Collision Monitor rejects "sensor_msgs/msg/Range" messages with range=.inf](https://github.com/ros-navigation/navigation2/issues/6669)