Livox Viewer 2 已经能出点云、SDK2 也能收到 C++ 回调后,这篇把 MID-360 数据接入 ROS 2。主流程同时覆盖 Ubuntu 22.04 + Humble 与 Ubuntu 24.04 + Jazzy:建立独立工作空间、修改官方 JSON 中的主机和雷达 IP、编译 Livox ROS Driver 2,再运行 rviz_MID360_launch.py。最终 /livox/lidar 持续发布,RViz 显示实时点云。SLAM、TF 外参和机器人导航暂不在本文范围内。

适用范围: 官方仓库当前列出的 Driver 2 型号包括 HAP、MID-360、MID-360S 与 Avia 2。本文只使用 MID-360 的配置和 Launch。第一代 Avia、Mid-70、Horizon、Tele-15、Mid-40/100 不直接套用本文文件名。

🎯 跑通后应该看到什么

本篇完成的是 LiDAR 接入 ROS 2 的最小链路:

MID-360 点云与 IMU 数据包
→ Livox SDK2 接收设备数据
→ Livox ROS Driver 2 封装 ROS 2 消息
→ /livox/lidar 与 /livox/imu Topic 发布
→ RViz 订阅 PointCloud2
→ livox_frame 下出现可旋转的实时点云

最后用四项现象验收:

  1. Driver 2 在 Humble 或 Jazzy 工作空间中编译完成;
  1. 启动日志显示配置文件已载入、LiDAR 初始化成功;
  1. ros2 topic list 能看到 /livox/lidar 和 /livox/imu;
  1. RViz 的 Fixed Frame 为 livox_frame,PointCloud2 订阅 /livox/lidar,画面出现环境轮廓。

Topic: ROS 2 节点之间传输连续数据的命名通道;驱动发布点云,RViz 通过 Topic 接收。 PointCloud2: ROS 中常用的点云消息容器;除了 x、y、z,还可以携带强度、线号和时间戳等字段。

🧭 选择 Humble 或 Jazzy,不混用构建参数

Livox ROS Driver 2 当前 README 明确列出 Ubuntu 22.04 + ROS 2 Humble,以及 Ubuntu 24.04 + ROS 2 Jazzy。两套流程使用同一仓库,但 source 路径和 build.sh 参数不同。

开始前建议已按 ROS 2 官方安装页完成 Desktop 环境。Driver 2 README 推荐完整桌面安装;如果终端中不存在 /opt/ros/humble 或 /opt/ros/jazzy,先完成对应 ROS 2 安装,再进入驱动编译。两份 ROS 2 安装入口列在文末 [O8]、[O9]。

🧰 检查雷达、网卡、SDK2 与 ROS 2

这组命令只检查当前环境,不修改系统:

ip -br addr
ls /usr/local/lib/liblivox_lidar_sdk_shared.so

Humble 环境再执行:

source /opt/ros/humble/setup.bash
echo $ROS_DISTRO

Jazzy 环境改为:

source /opt/ros/jazzy/setup.bash
echo $ROS_DISTRO

命令来源:操作补充。 ip 与 ls 用于确认网卡和 SDK2 库;source 是 ROS 2 环境的标准用法。Livox README 使用同一路径下的 setup.sh,正式构建命令见后文和文末 [O1]。

正常状态应满足:

  • 连接 MID-360 的有线网卡显示 192.168.1.50/24;
  • /usr/local/lib/liblivox_lidar_sdk_shared.so 存在;
  • echo $ROS_DISTRO 输出 humble 或 jazzy;
  • Viewer 2 已经验证过点云,启动 Driver 2 前退出 Viewer 2 和其他 SDK 示例。

如果 SDK2 库不存在,先按上一篇 SDK2 C++ 教程或官方 README 完成安装。官方命令为:

sudo apt install cmake
git clone https://github.com/Livox-SDK/Livox-SDK2.git
cd ./Livox-SDK2/
mkdir build
cd build
cmake .. && make -j
sudo make install

命令来源:Livox 官方原命令。 来自 Livox SDK2 README 的 Ubuntu 安装章节,见文末 [O2]。

📂 建立独立工作空间并克隆 Driver 2

Livox README 要求仓库位于 ROS 工作空间的 src 目录。先建立父目录:

mkdir -p ~/ws_livox/src
cd ~

命令来源:操作补充。 官方克隆命令假定 ws_livox/src 已存在;这两条先创建父目录,不编译软件。

随后执行官方克隆命令:

git clone https://github.com/Livox-SDK/livox_ros_driver2.git ws_livox/src/livox_ros_driver2
cd ~/ws_livox/src/livox_ros_driver2

命令来源:第一条为 Livox 官方原命令,第二条为定位目录的操作补充。 见文末 [O1]。

建议把这个仓库放在独立的 ws_livox 中。官方 build.sh 会在每次构建时清理工作空间的 build、devel 和 install 目录;如果把它放进已有的大型机器人工作空间,其他包的构建产物也会一起被清理。该行为可以在官方 build.sh 中直接看到,见文末 [O3]。

工作空间: ROS 2 用来组织源码、构建产物和安装结果的一组目录;src 放源码,build 与 install 由构建过程生成。

🌐 在构建前修改 MID-360 的主机和雷达 IP

MID-360 默认地址为 192.168.1.1XX,XX 是序列号最后两位。例如序列号最后两位为 10,雷达默认地址就是 192.168.1.110。电脑沿用上一篇 Viewer 2 教程的 192.168.1.50/24。

打开 Driver 2 官方配置:

nano ~/ws_livox/src/livox_ros_driver2/config/MID360_config.json

命令来源:操作补充。 文件本身来自 Livox 官方仓库;官方 README 明确说明 LiDAR IP、主机 IP、端口和数据类型由 JSON 配置,见文末 [O1]、[O4]。

把以下字段改成当前设备的实际值:

修改后的关键结构应类似下面这样。示例雷达 IP 192.168.1.110 只适用于序列号末两位为 10 的设备;其他设备应替换为自己的地址。

{
  "lidar_summary_info": {
    "lidar_type": 8
  },
  "MID360": {
    "lidar_net_info": {
      "cmd_data_port": 56100,
      "push_msg_port": 56200,
      "point_data_port": 56300,
      "imu_data_port": 56400,
      "log_data_port": 56500
    },
    "host_net_info": {
      "cmd_data_ip": "192.168.1.50",
      "cmd_data_port": 56101,
      "push_msg_ip": "192.168.1.50",
      "push_msg_port": 56201,
      "point_data_ip": "192.168.1.50",
      "point_data_port": 56301,
      "imu_data_ip": "192.168.1.50",
      "imu_data_port": 56401,
      "log_data_ip": "",
      "log_data_port": 56501
    }
  },
  "lidar_configs": [
    {
      "ip": "192.168.1.110",
      "pcl_data_type": 1,
      "pattern_mode": 0,
      "extrinsic_parameter": {
        "roll": 0.0,
        "pitch": 0.0,
        "yaw": 0.0,
        "x": 0,
        "y": 0,
        "z": 0
      }
    }
  ]
}

端口保持官方 MID360_config.json 原值。第一次验证只改 IP,减少变量。JSON 不支持 # 或 // 注释;从 README 示例复制内容时,应使用仓库中的实际 JSON 文件作为底稿,因为 README 为解释字段加入的注释不是严格 JSON。

保存后检查语法:

python3 -m json.tool ~/ws_livox/src/livox_ros_driver2/config/MID360_config.json >/dev/null

命令来源:操作补充。 没有输出表示 JSON 语法可解析;它不验证雷达 IP 是否真实可达。

配置应在构建前修改。Driver 2 的 CMake 安装规则会把 config 与 launch_ROS2 复制到工作空间的安装目录,运行 ros2 launch 时使用安装后的文件。若构建完成后才改源码配置,需要重新执行对应的 build.sh,让安装目录同步更新。

🏗️ 编译 Humble 或 Jazzy 版本

先确认当前目录是:

~/ws_livox/src/livox_ros_driver2

Ubuntu 22.04 + Humble 执行:

source /opt/ros/humble/setup.sh
./build.sh humble

命令来源:Livox 官方原命令。 来自 Driver 2 README,见文末 [O1]。

Ubuntu 24.04 + Jazzy 执行:

source /opt/ros/jazzy/setup.sh
./build.sh jazzy

命令来源:Livox 官方原命令。 来自 Driver 2 README,见文末 [O1]。

两组命令只选与当前系统匹配的一组。build.sh 会切换 ROS 2 的 package.xml 与 Launch 目录,然后在 ~/ws_livox 调用 colcon build。正常完成时,工作空间出现 build、install 和 log,终端最后没有 Failed 包。

如果构建提示找不到 liblivox_lidar_sdk_shared.so,说明 SDK2 尚未正确安装到 /usr/local/lib;如果提示找不到 PCL、APR 或 ROS 包,应根据第一条缺失依赖定位,而不是先修改 LiDAR IP。网络配置不会影响 CMake 编译。

colcon: ROS 2 常用的工作空间构建工具;它读取包描述与 CMake 配置,生成工作空间级的安装结果。

▶️ 启动 MID-360 驱动和 RViz

构建完成后保持在 ~/ws_livox/src/livox_ros_driver2,加载工作空间并启动官方 RViz Launch:

source ../../install/setup.sh
ros2 launch livox_ros_driver2 rviz_MID360_launch.py

命令来源:Livox 官方命令与官方 Launch 文件。 README 给出 source ../../install/setup.sh 和通用 ros2 launch 格式;仓库提供 rviz_MID360_launch.py,见文末 [O1]、[O5]。

这个 Launch 同时启动 livox_ros_driver2_node 与 RViz 2。官方文件的默认参数是:

终端出现设备初始化日志后,RViz 应自动打开。第一次出点云可能需要短暂等待设备连接和开始采样;持续没有数据时,进入后面的故障分支检查。

🔎 用 ROS 2 命令确认 Topic 确实在发布

另开一个终端,加载与当前系统对应的 ROS 2 和工作空间。Humble 使用:

source /opt/ros/humble/setup.bash
source ~/ws_livox/install/setup.bash

Jazzy 使用:

source /opt/ros/jazzy/setup.bash
source ~/ws_livox/install/setup.bash

命令来源:ROS 2 通用操作补充。 Livox README 使用包目录下的相对 setup.sh;这里改用工作空间绝对路径,便于在新终端执行。

检查 Livox Topic:

ros2 topic list | grep livox
ros2 topic info /livox/lidar
ros2 topic hz /livox/lidar

命令来源:ROS 2 官方通用命令,不是 Livox 专用命令。 ROS 2 Topics 教程见文末 [O10]。

默认 multi_topic=0 时,正常列表通常包含:

/livox/imu
/livox/lidar

ros2 topic info /livox/lidar 应显示消息类型和至少一个发布者;ros2 topic hz /livox/lidar 应在收到若干消息后输出频率统计。Launch 默认 publish_freq=10.0,实际测得值会受数据到达、系统调度和统计窗口影响,不要求每次都精确等于 10.000。

这里只看到 Topic 名称,说明发布器已经建立;继续看到 hz 统计,才能证明消息正在连续发布。若 /livox/lidar 存在但频率命令一直等待,说明节点已经启动,点云数据链仍未真正进入发布阶段。

🖥️ 在 RViz 中确认第一帧实时点云

官方 display_point_cloud_ROS2.rviz 已预设:

  • Global Options → Fixed Frame:livox_frame;
  • PointCloud2 → Topic:/livox/lidar;
  • Position Transformer:XYZ;
  • Color Transformer:Intensity。

正常时,主视图会出现墙面、门框、桌腿等三维轮廓。用鼠标拖动旋转、滚轮缩放,确认点云不是只落在某个视角之外。随后在雷达附近缓慢移动纸箱或标定板;相应点云区域应同步变化,这比“RViz 没报错”更能证明实时链路已经跑通。

Fixed Frame: RViz 用来统一显示数据的参考坐标系。本文点云消息本身写入 livox_frame,因此不需要额外 TF 就能在同名 Fixed Frame 下显示。 Intensity: 点的反射强度字段;RViz 可以用它给点云着色,但它不等同于 RGB 颜色图像。

🧩 rviz_MID360 与 msg_MID360 的区别

Driver 2 为 MID-360 提供两条常用 ROS 2 路径:

本文默认选择 rviz_MID360_launch.py,因为 PointCloud2 能直接被 RViz 和多数 ROS 点云工具消费。CustomMsg 不是“更高级的点云”,而是字段组织方式不同;切换前应先确认下游算法实际订阅哪种消息。

官方 README 还说明,xfer_format=2 的 PCL PointXYZI 只供 ROS 1 使用,ROS 2 不支持这一输出格式。ROS 2 中第一次验证保持 0,能减少消息类型不匹配。

🧯 RViz 空白或 Topic 不发布时先查这五处

共享库错误可按 Driver 2 官方 FAQ 在当前终端执行:

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib

命令来源:Livox 官方 FAQ 原命令。 见文末 [O1]。这条只影响当前终端;需要长期生效时,官方 README 还给出了写入 ~/.bashrc 的方式。

如果 Topic 有频率但画面看起来点很少,先旋转视角、重置视图,并让雷达面对墙面、门框等稳定目标。点云稀疏不应直接归因于驱动;扫描模式、目标反射率、遮挡和 RViz 点大小都会影响视觉密度。

官方仓库 Issue 中存在 bind failed、Fixed Frame 缺失以及“初始化成功但无 Topic”的社区记录。它们用于补充症状样本,不代表所有设备都由同一原因造成;文末 [C1]–[C3] 单独标注为社区故障记录。

✅ 当前结果完成到哪一层

当前结果说明“传感器 → SDK2 → ROS Driver 2 → Topic → RViz”已经跑通。livox_frame 仍是雷达自身参考系;接入移动机器人时,还需要把它与 base_link 建立正确的外参或 TF。看到点云也不表示 SLAM、定位、路径规划或避障已经完成。

Driver 2 README 将该驱动定位为调试工具,并说明量产场景应根据项目需求优化源码。本文适合设备接入、教学和原型验证,不把官方示例的默认参数直接视为生产部署方案。

🔗 官方教程、源码与配置链接

📘 Livox 与 ROS 2 官方资料

🧩 社区故障记录

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注