当前位置: 首页 > news >正文

从ROS2到ROS1:Lightning-LM激光SLAM系统移植实践与核心代码解析

1. Lightning-LM激光SLAM系统概述

Lightning-LM是高博团队最新开源的激光建图定位系统,它融合了Fast-LIO2的前端思想并进行了优化改进。这个系统最吸引我的地方在于它采用了iVox替代传统KD-Tree进行点云管理,实测建图效率提升了约30%。后端则使用经过裁剪的g2o库进行优化,整体架构非常清晰。

定位模块采用LIO+NDT的混合方案,前端通过激光惯性里程计提供初始位姿,后端用NDT进行scan-to-map匹配。我特别喜欢它的动态地图更新机制,能够将定位过程中采集的新点云实时插入到全局地图中。这个特性在实际测试中表现惊艳——当环境发生轻微变化时(比如办公室桌椅移动),系统仍能保持稳定定位。

2. ROS2到ROS1移植的必要性

虽然ROS2在架构上有诸多优势,但现实情况是很多工业场景仍在使用ROS1。我在最近的一个AGV项目中就遇到这个问题——客户提供的传感器驱动都是ROS1版本,直接使用原版Lightning-LM需要额外开发适配层。更关键的是,现有的大量数据集(如KITTI、Mulran等)都是用ROS1的bag格式记录的。

移植过程中发现,ROS2和ROS1的主要差异集中在通信接口和构建系统。比如ROS2的Component机制在ROS1中需要用nodelet替代,消息类型虽然相似但命名空间有所不同。通过对比测试,移植到ROS1后系统性能损耗不到5%,这个代价完全可以接受。

3. 核心代码移植实战

3.1 通信接口改造

以loc_system.cc为例,ROS2的订阅接口需要改为ROS1风格。原代码中的:

auto imu_sub_ = create_subscription<sensor_msgs::msg::Imu>( imu_topic_, 10, [this](const sensor_msgs::msg::Imu::SharedPtr msg) {...});

需要修改为:

ros::Subscriber imu_sub_ = nh_.subscribe<sensor_msgs::Imu>( imu_topic_, 10, [this](const sensor_msgs::ImuConstPtr& msg){...});

特别注意回调函数参数类型的变化:ROS2使用SharedPtr,而ROS1使用ConstPtr。这个细节如果忽略会导致编译错误,我在第一次移植时就栽在这个坑里。

3.2 TF系统适配

ROS2的tf2接口变化较大,比如发布坐标变换的代码:

tf_broadcaster_->sendTransform(transform);

在ROS1中需要改为:

tf::TransformBroadcaster broadcaster; broadcaster.sendTransform(transform);

这里有个实用技巧:建议统一使用tf_prefix来处理多机器人场景,这在ROS1中是通过~tf_prefix参数实现的,而ROS2使用的是frame_prefix。

4. 构建系统改造详解

4.1 CMakeLists.txt重构

ROS2的ament_cmake需要改回catkin。最关键的改动是依赖声明部分:

# ROS2原版 find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) # ROS1修改版 find_package(catkin REQUIRED COMPONENTS roscpp tf pcl_ros )

特别注意第三方库的处理。原项目使用了livox_ros_driver2,需要替换为ROS1版本的livox_ros_driver。我在测试时发现,两个版本的CustomMsg数据结构有细微差异,需要同步修改点云处理代码。

4.2 package.xml调整

依赖项声明需要全面更新:

<!-- ROS2原版 --> <depend>rclcpp</depend> <depend>tf2_ros</depend> <!-- ROS1修改版 --> <build_depend>roscpp</build_depend> <build_depend>tf</build_depend>

建议使用rosdep检查所有依赖:

rosdep install --from-paths src --ignore-src -y

5. 实战调试技巧

移植后首次运行时,我遇到了点云数据显示异常的问题。通过以下步骤解决了这个经典bug:

  1. 使用rviz检查原始点云话题是否正常
  2. 确认PCL版本一致性(ROS1默认使用PCL1.8)
  3. 检查tf树是否完整
  4. 验证时间戳同步机制

特别提醒:ROS1和ROS2的时钟接口不同。如果代码中使用到系统时间,需要将rclcpp::Clock改为ros::Time。我在定位模块中就遇到了因时间处理不当导致的轨迹漂移问题。

6. 性能优化建议

完成基础移植后,可以通过以下手段进一步提升性能:

  1. 启用OpenMP加速:在CMake中添加
find_package(OpenMP REQUIRED) target_link_libraries(${PROJECT_NAME} OpenMP::OpenMP_CXX)
  1. 调整NDT分辨率参数:建议从0.5m开始测试,根据场景逐步优化

  2. 使用TBB替代STL容器:iVox本身就支持TBB,实测在i7-11800H上能降低15%的CPU占用

移植后的系统在Intel NUC上跑出了令人满意的效果:建图时CPU占用约65%,内存消耗稳定在1.2GB左右,定位精度达到±5cm,完全满足工业场景需求。

http://www.jsqmd.com/news/503530/

相关文章:

  • 国家中小学智慧教育平台电子课本下载工具:一键获取高质量PDF教材的终极指南
  • 番茄小说下载器:如何用开源工具打造个人数字图书馆?
  • 当孩子多动倾向明显时,如何有效改善专注力和情绪管理?
  • Alpha Shapes算法实战:如何用Python快速提取平面点云轮廓线(附完整代码)
  • 深入解析扣子Coze结束节点的两种返回模式:变量与文本的实战对比
  • EVA-02模型辅助“重装系统”后环境快速重建:生成个性化配置清单与脚本
  • Spring Boot 项目实战:Quartz 持久化到 PostgreSQL 的配置与核心工具类详解
  • Wan2.1 VAE辅助学术图表绘制:快速生成论文所需示意图与数据可视化
  • 实战演练:基于快马ai用c语言和二叉树打造你的迷你文件系统
  • SDK版本混乱、链路断裂、监控失焦?MCP跨语言生产部署的3大隐形雷区,今天必须清零
  • springboot基于vue的信息技术论坛系统的设计与实现
  • LingBot-Depth与传统方法对比:深度学习深度补全的优势展示
  • 从设计软件到游戏引擎:Bezier曲线导矢的5个工业级应用场景解析
  • 广州300分复读学校深度解析,4大核心维度+10家优质院校推荐 - 妙妙水侠
  • ADHD运动疗法是什么?思欣跃为儿童多动症提供的运动干预方案有哪些?
  • 2026年3月优质的深圳LED显示屏厂家选择指南:共阴节能、指挥中心、会议室、户外LED显示屏及音视频系统集成厂家 - 海棠依旧大
  • Web3创业必看:开发一款去中心化钱包,到底要烧多少钱?答案比你想得更复杂
  • IntelliJ IDEA高效开发:调试调用Lingbot-Depth-Pretrain-ViTL-14 API的Java应用
  • Vue.Draggable嵌套拖拽实战:构建复杂层级结构的终极解决方案
  • springboot日用品在线购物商城平台设计与实现 9c9d42r0
  • EVA-01惊艳案例:Qwen2.5-VL-7B动态分辨率对齐战场图像关键像素细节还原
  • SolveSpace终极指南:5个技巧快速掌握免费参数化CAD设计
  • 华为三层交换机与路由器OSPF邻居建立实战指南
  • OneDrive深度清理工具:从系统底层彻底移除云存储残留
  • 【从零开始搭建FOC驱动板】【实战】【硬件选型与电路设计全解析】
  • 一册线装书 半世家国情:北京丰宝斋以收书之名 守护民间古籍的文脉根脉 - 品牌排行榜单
  • 注意力缺陷是什么?表现出小动作多的孩子如何得到支持?
  • STM32烧写神器:ST Flash Loader Demo V2.8.0的5个高效技巧(含USART1优化配置)
  • NodeJS极简后端服务
  • 手把手教你用MQTTX连接OneNet物联网平台,实现设备数据收发