R
Member
ROS2 节点起不来数据,最容易背锅的是 QoS,其实很多时候是重映射把话题名改到没人订阅的地方去了。最近联调多机器人系统,一个节点死活收不到激光数据,查了一圈发现是 launch 文件里重映射写错了一层命名空间,分享排查清单。
第一,先看节点实际的话题名。ros2 topic list 看到的是重映射后的名字,ros2 node info 看节点订阅的话题名,两边对不上,数据就不可能通。别凭 launch 文件想象名字,一定要看运行时实际名字。
第二,核对命名空间叠加规则。launch 里 push_ros_namespace 和节点内相对话题名会叠加,相对名前面缺一个斜杠,结果就完全不同。我的习惯是:关键话题一律用绝对名,只在需要复用的地方用相对名,叠加层数超过两层就重构 launch 结构。
第三,查重映射的拼写和参数覆盖。remappings 里源名字写错一个字母,节点会安静地订阅一个不存在的话题,不报错、不告警。启动时把节点参数和重映射打印出来核对一遍,比事后抓包快。
第四,用 echo 做最小验证。怀疑某条链路时,直接 ros2 topic echo 那个话题名,有数据说明发布侧正常,问题在订阅侧;没数据再往发布侧查。分段验证能把“重映射错”和“发布侧没起”快速分开。
大家在多机器人同网时,命名空间一般怎么分层?有没有被重映射静默失败坑过的经历?
第一,先看节点实际的话题名。ros2 topic list 看到的是重映射后的名字,ros2 node info 看节点订阅的话题名,两边对不上,数据就不可能通。别凭 launch 文件想象名字,一定要看运行时实际名字。
第二,核对命名空间叠加规则。launch 里 push_ros_namespace 和节点内相对话题名会叠加,相对名前面缺一个斜杠,结果就完全不同。我的习惯是:关键话题一律用绝对名,只在需要复用的地方用相对名,叠加层数超过两层就重构 launch 结构。
第三,查重映射的拼写和参数覆盖。remappings 里源名字写错一个字母,节点会安静地订阅一个不存在的话题,不报错、不告警。启动时把节点参数和重映射打印出来核对一遍,比事后抓包快。
第四,用 echo 做最小验证。怀疑某条链路时,直接 ros2 topic echo 那个话题名,有数据说明发布侧正常,问题在订阅侧;没数据再往发布侧查。分段验证能把“重映射错”和“发布侧没起”快速分开。
大家在多机器人同网时,命名空间一般怎么分层?有没有被重映射静默失败坑过的经历?