尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

livox_ros_driver2的CMake双分支设计解析:ROS1 catkin与ROS2 ament共存之道

livox_ros_driver2的CMake双分支设计解析:ROS1 catkin与ROS2 ament共存之道 livox_ros_driver2的CMake双分支设计解析ROS1 catkin与ROS2 ament共存之道【免费下载链接】livox_ros_driver2Livox device driver under Ros(Compatible with ros and ros2), support Lidar HAP and Mid-360.项目地址: https://gitcode.com/GitHub_Trending/li/livox_ros_driver2livox_ros_driver2 是 Livox 3D 激光雷达HAP、Mid-360 等机型的 ROS 驱动同时兼容ROS1Noetic和ROS2Foxy/Humble/Jazzy。它的核心难题在于两套 ROS 的构建系统catkin 与 ament完全不同消息生成方式也天差地别。本文将带你快速看懂它如何用一套源码 一个 CMakeLists.txt 双分支的设计优雅地实现双版本共存。 为什么需要双分支设计ROS1 和 ROS2 的构建生态几乎是两套世界对比项ROS1ROS2构建系统catkincatkin_makeamentcolconCMake 版本要求3.0 即可至少 3.14消息生成generate_messagesrosidl_generate_interfaces节点形态可执行文件add_executable共享库 组件注册日志接口ROS_INFO全局宏RCLCPP_INFO节点级宏依赖声明package.xmlcatkin 格式package.xmlament 格式如果为两个版本各写一套代码维护成本会翻倍。livox_ros_driver2 的解法是构建层面用 CMake 条件分支隔离源码层面用预处理宏抹平差异。 入口开关build.sh 如何一键切换整个双版本体系的总开关是 build.sh。你在 README 中看到的./build.sh ROS1或./build.sh humble脚本内部其实做了三件事传参向构建工具注入-DROS_EDITIONROS1或-DROS_EDITIONROS2humble/jazzy 都归入 ROS2额外传-DDISTRO_ROS区分发行版换皮把 package_ROS1.xml 或 package_ROS2.xml 复制为构建时真正读取的package.xmlcatkin 与 ament 的 package.xml 格式不同构建ROS1 走catkin_makeROS2 走colcon build --cmake-args ...。 关键洞察ROS_EDITION就是后面 CMake 分支判定的依据一条变量贯穿整个构建流程。️ CMakeLists.txtif-else 撑起整个工程项目的 CMakeLists.txt 结构非常直白——顶层就一个巨大的条件判断if(ROS_EDITION STREQUAL ROS1) # ... catkin 分支 ... else(ROS_EDITION STREQUAL ROS2) # ... ament 分支 ... endif()两个分支各自为政互不干扰。下面拆解各自的关键点。 ROS1 分支catkin要点依赖查找find_package(catkin REQUIRED ...)声明 roscpp、sensor_msgs、pcl_ros 等依赖见 CMakeLists.txt消息生成用add_message_filesgenerate_messages生成 CustomMsg.msg 和 CustomPoint.msg见 CMakeLists.txt产物形态直接add_executable生成节点可执行文件SDK 链接寻找静态库liblivox_lidar_sdk_static.a安装规则按 CATKIN 的约定路径安装并安装launch_ROS1/启动目录。 ROS2 分支ament要点依赖查找采用ament_cmake_auto自动发现 package.xml 中的依赖一行ament_auto_find_build_dependencies()搞定见 CMakeLists.txt消息生成改用rosidl_generate_interfaces把两个 .msg 编译成独立的livox_interfaces2接口包见 CMakeLists.txt发行版适配Humble 和 Jazzy 的 typesupport 目标获取方式不同CMake 里专门做了if(DISTRO_ROS STREQUAL humble OR ...)的分支处理见 CMakeLists.txt——这就是 build.sh 传-DDISTRO_ROS的原因产物形态编译成共享库再通过rclcpp_components_register_node注册为 ROS2 组件自动生成_node启动入口SDK 链接寻找动态库liblivox_lidar_sdk_shared.so安装规则ament_auto_package一键安装 config 与 launch_ROS2 目录。️ 版本号单一事实来源cmake/version.cmake一个容易被忽略的细节版本号并没有硬编码在 CMake 里。cmake/version.cmake 会读取头文件livox_ros_driver2.h用正则提取VER_MAJOR / VER_MINOR / VER_PATCH三个宏拼出如1.2.6的版本号。好处改版本号只需改头文件一处CMake 打印信息、安装信息等全部自动同步杜绝改了 CMake 忘了改头文件的低级错误。 源码层BUILDING_ROS1 / BUILDING_ROS2 宏抹平差异CMake 分支只解决了怎么编译怎么编译同一份源码则靠预处理宏。两个分支分别在 CMake 中定义了-DBUILDING_ROS1或-DBUILDING_ROS2源码通过 ros_headers.h 做统一入口#ifdef BUILDING_ROS1 #include ros1_headers.h #elif defined BUILDING_ROS2 #include ros2_headers.h #endifros1_headers.h引入ros/ros.h、pcl_ros等并把DRIVER_INFO映射到ROS_INFOros2_headers.h引入rclcpp/rclcpp.hpp、pcl_conversions等把DRIVER_INFO映射到节点级RCLCPP_INFO。这样业务代码里写DRIVER_INFO(node, ...)就够了日志接口差异被完全封装。入口文件 livox_ros_driver2.cpp 则是最重的条件编译ROS1 是传统的main()ros::initROS2 是继承rclcpp::Node的DriverNode组件类——同一份雷达数据链路逻辑lds_lidar.cpp、lddc.cpp 等在两个分支下完全复用。 快速上手两种版本怎么构建克隆源码到工作空间的src目录注意必须在 src 下否则构建工具会报错git clone https://gitcode.com/GitHub_Trending/li/livox_ros_driver2 ws_livox/src/livox_ros_driver2然后按目标版本选择构建命令前置条件已安装 Livox-SDK2 到 /usr/local# ROS1 Noetic source /opt/ros/noetic/setup.sh ./build.sh ROS1 # ROS2 Humble source /opt/ros/humble/setup.sh ./build.sh humble # ROS2 Jazzy source /opt/ros/jazzy/setup.sh ./build.sh jazzy运行示例ROS2 下用 rviz 查看 HAP 点云ros2 launch livox_ros_driver2 rviz_HAP_launch.py雷达参数文件位于 config/HAP_config.json。 总结这套设计的三条经验顶层一个变量统领全局ROS_EDITION从命令行一路贯穿到 CMake 分支简单、显式、不易出错构建产物按各自生态各走各的路catkin 分支出可执行文件、ament 分支出组件库不强求统一形态尊重两代 ROS 的设计哲学源码差异收敛到最少靠#ifdef 头文件抽象层把双版本差异压缩到入口和头文件两个层面核心业务代码零修改。对于需要同时维护 ROS1/ROS2 的传感器驱动、机器人中间件项目来说livox_ros_driver2 的这套双分支 宏隔离方案是一个值得直接抄作业的工程范本。【免费下载链接】livox_ros_driver2Livox device driver under Ros(Compatible with ros and ros2), support Lidar HAP and Mid-360.项目地址: https://gitcode.com/GitHub_Trending/li/livox_ros_driver2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表