简介:面向Livox-mid360激光雷达与PX4、XTDrone、Faster-lio的仿真集成,这份代码包以极简形式提供了从环境准备、无人机模型修改到雷达驱动安装、Faster-lio依赖编译与最终验证的完整配置指南,适合正在搭建无人机与激光雷达仿真环境的开发者、研究生或毕设学生参考。包内共3个文件,以inscode可运行配置、html说明页和gitignore版本控制文件为主,整体仅7KB,属于轻量级资料,但涵盖了仿真链路中的关键配置与排错要点,便于快速定位所需内容。作者基于毕设实践,将雷达驱动兼容性、仿真库配置、Faster-lio编译错误等高频问题整理为可复用的解决思路,并附有GitHub参考资源和配置过程索引,能帮助读者有效规避环境搭建中的典型陷阱。资源已有531人学习下载,对需要快速复现Livox-mid360仿真链路、缩短开发周期的研究人员具有直接参考价值。
1. 为什么要在仿真里折腾Livox Mid-360
做机器人导航和感知的朋友,这几年应该没少被Livox Mid-360刷屏。这个雷达最吸引人的点在于非重复扫描 Pattern,配合视场角 360° 水平、59° 垂直,能在一个相当小的体积里拿到很密的点云,尤其适合用在机器人、无人车、无人机这类对体积和重量敏感的平台上。但问题也随之而来:真机一套下来小两万,炸机撞墙一次维修成本够喝一壶,更别提在算法调试阶段,你根本不需要真实硬件就能完成大部分验证工作。
仿真配置这块儿,网上的资料其实不少,但大多比较零散,要么只讲了SDK编译,要么只给了个Gazebo模型,真正能从零开始把Livox Mid-360在仿真环境里完整跑起来、能出点云、能接进自己的SLAM或感知管线的教程,确实不多。我这次把个人踩坑整理成一份可以直接照着做的配置指南,覆盖驱动编译、Gazebo集成、点云显示、坐标系对齐这几个核心环节,目标是让你在没拿到真机之前,就能把基于Mid-360的下游算法全部跑通。
这套配置适合谁?适合正在做机器人感知、导航、三维重建方向的学生和工程师,尤其是手里暂时没有Livox设备、或者设备数量不够需要多雷达仿真环境的团队。对已经买了真机的朋友也有参考价值,因为仿真和真机在驱动层面的接口是统一的,提前在仿真里把配置流程摸透,真机上手会顺畅很多。
2. 环境准备与核心依赖选型
2.1 系统与ROS版本怎么选
先说结论:我用的组合是 Ubuntu 20.04 + ROS Noetic + Gazebo 11,这套组合最稳。如果你用的是 Ubuntu 18.04 + ROS Melodic,也可以跑通,但Livox官方驱动对Noetic的支持更积极一些,遇到编译问题的概率会小不少。
可能有朋友会问,为什么不用 ROS2?实际上 Livox 官方驱动 livox_ros_driver2 已经支持 ROS2 Foxy/Humble 了,但我个人建议如果你只是做仿真验证,优先选 ROS1 方案。原因很简单:ROS1 生态下 Gazebo 和 RVIZ 的配合太成熟了,各种教程少踩一半的坑。ROS2 不是不行,只是你在仿真这条路上遇到的很多所谓的“小问题”,大概率是 ROS2 自身机制带来的,而不是 Livox 相关配置导致的,这会干扰你对仿真环境的判断。
2.2 Livox SDK 和驱动的关系
这是新手最容易绕晕的地方。Livox 的软件栈分两层:
- Livox SDK:底层通信库,负责和雷达硬件交互,解析点云数据。
- livox_ros_driver2:基于 SDK 封装的 ROS 驱动,把点云数据转成 ROS 消息发布出来。
在仿真环境里,你实际上需要的是驱动,SDK 会作为依赖被自动拉取编译。但注意,编译 livox_ros_driver2 时它会去找 SDK,如果你之前装过旧版 SDK,可能会因为版本冲突导致编译报错。我建议在干净环境里,先不装任何 Livox 相关的包,直接编译驱动,让它自己把 SDK 带上。
2.3 编译步骤与关键参数
cd ~/catkin_ws/src git clone https://github.com/Livox-SDK/livox_ros_driver2.git cd ~/catkin_ws catkin_make编译过程本身不复杂,但有几处坑。
第一,如果catkin_make报错找不到livox_sdk,不要慌,进到livox_ros_driver2目录下看有没有third_party文件夹,如果没有,手动拉取子模块:
cd ~/catkin_ws/src/livox_ros_driver2 git submodule update --init --recursive这个是官方仓库里最容易忽略的步骤,很多人编译失败就是卡在这里。
第二,编译完成后,source 一下环境变量,然后立刻验证驱动是否正常:
source ~/catkin_ws/devel/setup.bash roslaunch livox_ros_driver2 msg_Mid360.launch正常的话你会看到驱动起来,并提示等待连接设备。在仿真里,这个 launch 后面你会被 Gazebo 的节点直接调用,但现在至少能证明驱动本身没毛病。
3. Gazebo 仿真模型与控制器搭建
3.1 去哪里找现成的模型
Gazebo 里用 Mid-360,最大的便利是 Livox 官方提供了模拟插件。在你刚克隆的livox_ros_driver2仓库里,有一个demo_gazebo目录,里面包含了:
- Mid-360 的 mesh 模型文件(用于可视化)
- gazebo 插件配置(用于模拟雷达扫描)
- 示例 launch 文件(用于快速启动)
这个模型不是简单画了个盒子,而是真的会在 Gazebo 里执行射线检测,模拟出接近真实 Mid-360 的非重复扫描效果。很多人的误区是随便拿个二维雷达模型改改参数就冒充 Mid-360,扫出来的点云结构和真机完全不是一回事,下游算法验证自然会翻车。
3.2 把模型挂到你的机器人上
假设你已经有了自己的机器人模型,需要把 Mid-360 挂上去。先在 URDF 里加入雷达的 link 和 joint:
<link name="livox_frame"> <visual> <geometry> <mesh filename="package://livox_ros_driver2/demo_gazebo/mid360.dae"/> </geometry> <origin xyz="0 0 0" rpy="0 0 0"/> </visual> <inertial> <mass value="0.265"/> <origin xyz="0 0 0"/> <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/> </inertial> </link> <joint name="livox_joint" type="fixed"> <parent link="base_link"/> <child link="livox_frame"/> <origin xyz="0.2 0 0.1" rpy="0 0 0"/> </joint>origin里的 xyz 是雷达在你机器人上的安装位置,这个要根据实际设计改。rpy是姿态,Mid-360 默认是水平放置,如果你要斜装(比如某些机器人为了看到更近的地面会仰角安装),这里要写清楚。
这里有个细节:inertia的质量虽然写的是 0.265kg(真机重量),但 Gazebo 仿真里这个值不是特别关键,如果你懒得查真机参数,随便给个合理的也可以,不会对仿真结果产生实质影响。
3.3 Gazebo 插件参数配置解析
驱动仓库里的mid360.gazebo.xacro文件是核心,做了自适应插件配置。关键参数如下:
<gazebo reference="livox_frame"> <sensor type="ray" name="livox_mid360"> <pose>0 0 0 0 0 0</pose> <always_on>true</always_on> <update_rate>10</update_rate> <visualize>true</visualize> <ray> <scan> <horizontal> <samples>360</samples> <resolution>1</resolution> <min_angle>0</min_angle> <max_angle>6.28319</max_angle> </horizontal> <vertical> <samples>59</samples> <resolution>1</resolution> <min_angle>-0.515</min_angle> <max_angle>0.515</max_angle> </vertical> </scan> <range> <min>0.1</min> <max>40.0</max> <resolution>0.01</resolution> </range> </ray> <plugin name="gazebo_ros_livox_controller" filename="libgazebo_ros_livox_controller.so"/> </sensor> </gazebo>几个参数的意义和坑:
samples是采样点数。水平 360,垂直 59,这对应的是 Mid-360 的标称角分辨率。但注意,Gazebo 这是规则网格采样,而真实 Mid-360 是非重复扫描,点云模式会更复杂。好在对于大多数 SLAM 算法验证,这种模拟精度已经够用。min_angle/max_angle是扫描范围。水平方向 0 到 2π 是完整的 360°,垂直方向 ±0.515 弧度(约 ±29.5°),对应官方标称的 59° 垂直视场角。update_rate是扫描频率。Mid-360 支持 10Hz 和 20Hz 两种模式,默认 10Hz。我之前调过一次 20Hz,下游算法在仿真里跑得挺顺,但如果你的电脑性能一般,建议还是 10Hz,省点 CPU。
3.4 启动仿真并发布点云
官方仓库里提供了 launch 文件,直接跑:
roslaunch livox_ros_driver2 gazebo_mid360.launch这个 launch 会启动 Gazebo 世界、加载 Mid-360 模型、运行控制器插件,并把点云发布到/livox/lidar话题。你可以在另一个终端用 RVIZ 订阅看看效果:
rviz添加 PointCloud2 显示,话题选/livox/lidar,固定坐标系选livox_frame。
如果看不到点云,先别急着怀疑配置,很可能是 RVIZ 的 Fixed Frame 没设置对。你机器人的其他坐标系如果和livox_frame没有连接关系,RVIZ 会直接在左上角报 Frame 错误,把 Fixed Frame 改到livox_frame本身就能看到点云。
4. 点云畸变、时间戳与坐标系对齐
4.1 时间戳问题的隐蔽坑
仿真环境里跑点云,最常见的问题是点云的时间戳是乱的。这个现象在真机上也会出现,但仿真里更容易触发。
Livox 驱动发布的消息类型是livox_ros_driver2/CustomMsg,里面带了每个点的偏移时间(offset time)。当你在做点云畸变校正或者激光惯性里程计时,这个偏移量很关键。
在仿真里,Gazebo 插件默认会给每个点一个递增的时间偏移,但如果你同时开了多个雷达,或者把雷达挂在了一个移动的机器人上,时间戳不同步会导致点云严重畸变。我遇到过一次,明明机器人是直行的,点云却扫出来一个弯的,排查了半天才发现是 Gazebo 插件的时钟没有和 ROS 时钟同步。
解决办法是在 Gazebo 的 launch 里强制设置 use_sim_time:
<param name="/use_sim_time" value="true"/>这个参数必须放在最外层 node 标签之前,否则 Gazebo 的时钟不会发布到/clock话题,所有传感器的时间戳都会乱套。
4.2 点云坐标系与 TF 树
另一个经常让人头疼的问题是坐标系对不齐。在仿真里,URDF 里定义的livox_frame、Gazebo sensor 的 reference 参数、以及发布点云消息的 frame_id,这三者必须完全一致,否则 RVIZ 里会出现点云和机器人模型错位。
我习惯的做法是统一用livox_frame作为所有地方的坐标系名称:
- URDF link 名称:
livox_frame - Gazebo sensor 的 reference:
livox_frame - 驱动发布点云消息的 frame_id:
livox_frame
如果你改了坐标系名字,记得同步修改 xacro 文件里插件的位置,不然就会出现一个怪现象:TF 树是通的,但点云就是不在雷达该在的位置。
4.3 让雷达跟随机器人运动
仿真里测 SLAM 时,雷达必须跟着机器人动。这看起来是理所当然的,但实际配置时如果 joint 没设对,雷达会在原地不动,或者运动方向不对。
确保你 URDF 里的livox_joint是type="fixed",并且把父 link 从base_link挂到实际安装的位置。如果你的机器人还有底盘、云台这类中间结构,需要把雷达挂在对应的子 link 上。
另外,Gazebo 里做轮式机器人时,很多人用libgazebo_ros_diff_drive.so插件驱动轮子。这时候有一个常见问题:差速驱动插件发布的 TF 是odom到base_footprint,但你的雷达可能在base_link上面更高一层。如果这中间缺少 TF 关系,用robot_state_publisher发布 URDF 里的 TF 就能解决,不需要额外写代码。
5. 常见问题与排查技巧实录
5.1 编译报错找不到 livox_sdk
这是问得最多的一个问题。症状很典型:catkin_make 时在配置阶段提示找不到livox_sdk。
排查思路:
- 确认 git clone 时有没有加
--recursive,没加的话third_party目录是空的。 - 执行
git submodule update --init --recursive拉取子模块。 - 如果还是不行,删掉
build和devel目录重新编译。
cd ~/catkin_ws rm -rf build devel catkin_make这个操作看起来很简单,但很多人卡了半天没想到是缓存的问题。CMake 的缓存有时候非常顽固,你明明加了新文件它也不知道。
5.2 Gazebo 启动时闪退或黑屏
Gazebo 闪退通常和显卡驱动或 OpenGL 版本有关。我在这上面浪费过很多时间,后面整理出一个解决顺序:
- 先试
export LIBGL_ALWAYS_SOFTWARE=1强制软件渲染,如果这样能起来,基本能确定是显卡驱动问题。 - 检查
.gazebo目录下的日志,路径是~/.gazebo/server-<hostname>/default.log,重点看有没有关于 GPU 的报错。 - 如果 GTK 窗口打不开,装一下
libgazebo11-dev的对应依赖。
有一个容易被忽略的点:在 VMWare 或远程虚拟环境里跑 Gazebo,经常会因为 GPU 直通问题黑屏。这种场景我建议直接用软渲染,虽然帧率低一点,但至少能稳定跑完实验。
5.3 点云断断续续或者完全没有
点云话题/livox/lidar时有时无,一般不是硬件或驱动问题,而是 CPU 性能不足。Gazebo 的射线检测本身就比较吃资源,如果你在仿真里同时开了多个传感器、跑了地形生成,点云更新率会肉眼可见地下降。
优化方案:
- 降低
samples参数,比如水平从 360 降到 180,垂直从 59 降到 30。SLAM 算法验证一般够用。 - 降低
update_rate,从 10Hz 降到 5Hz,前提是你下游算法能接受。 - 关掉传感器的
visualize参数,这个选项会把点云可视化出来,很耗 GPU。
5.4 点云坐标系发生偏移
如果你发现点云和机器人模型在 RVIZ 里有偏移,重点检查两件事:
- URDF 里
livox_joint的origin是否设置正确。 - Gazebo 插件里 sensor 的
<pose>是否和 URDF 对齐。
特别注意,URDF 里的坐标系用xyz和rpy表示,Gazebo sensor 里的<pose>也用这两个值,但如果你同时设置了这两个地方,最终的 transform 是叠加的。也就是说,如果你在 URDF 里已经把雷达放在了base_link前方 0.2 米处,又在 Gazebo sensor 的 pose 里加了同样的偏移,那实际效果就是偏移了两倍。我一般在 URDF 里定义好位置,Gazebo 插件里的 pose 就保持全零。
6. 进阶:把仿真点云接入自己的SLAM管线
6.1 点云格式转换
Livox 驱动默认发布的是livox_ros_driver2/CustomMsg,不是标准的sensor_msgs/PointCloud2。很多 SLAM 算法(比如 LIO-SAM、FAST-LIO)输入要求是 PointCloud2,如果直接订阅会一直等不到数据。
这时候需要用一个转换节点。官方仓库里提供了livox_to_pointcloud2的转换工具,可以直接用。但更省事的方案是在 launch 文件里加pointcloud_to_laserscan节点(如果你打算把 Mid-360 当二维雷达用的话)。
我的习惯是直接把 CustomMsg 转成 PointCloud2 再往下游丢,这样后续的算法处理会方便很多:
rosrun livox_ros_driver2 livox_to_pointcloud2它会订阅/livox/lidar,发布/livox/lidar/pointcloud2。在 RVIZ 里订阅这个新话题,效果和原始点云几乎没区别。
6.2 在RVIZ里同时看点云和机器人模型
做 SLAM 调试时,最好的观测配置是 RVIZ 里同时显示机器人模型(RobotModel)、点云(PointCloud2)、以及 TF 树(TF)。
一个实用技巧:把 RVIZ 的 Fixed Frame 设置成map或者odom,然后通过 TF 关系让雷达坐标系跟着机器人模型一起运动。如果你只设置成livox_frame,只能看到“雷达自己眼中的世界”,看不到机器人本体,这对判断雷达安装位置和扫描范围非常不友好。
我给自己的 RVIZ 配置保存了一个mid360_sim.rviz文件,每次调试直接加载,省得每次重新配置。从零开始的朋友可以在~/.rviz/下找到默认配置,改完另存一份就行。
6.3 多雷达仿真的扩展
有些项目需要装多个 Mid-360(比如前后各一个覆盖盲区)。Gazebo 仿真里做多雷达扩展很简单:在 URDF 里加两个livox_frame(可以用livox_front和livox_back区分),每个都挂一个 ray sensor 插件。
但要注意:多个雷达的点云话题不能都叫/livox/lidar,否则会互相覆盖。在 xacro 文件里给每个 sensor 命名不同的话题:
<plugin name="gazebo_ros_livox_controller" filename="libgazebo_ros_livox_controller.so"> <ros> <remapping> <from>livox/lidar</from> <to>livox/front/lidar</to> </remapping> </ros> </plugin>多雷达点云在时间戳同步上的坑会更大。建议在每个雷达的控制器节点上单独设置use_sim_time=true,确保所有传感器使用同一个仿真时钟。
7. 扩展玩法与我的个人体会
这套仿真配置跑通之后,能做的事情其实比预想的多。我后来在项目里做了一件事:把手头的 FAST-LIO 和 LIO-SAM 直接接到仿真点云上跑,在 Gazebo 里搭了一个带障碍物的室内场景,验证定位精度。结果还挺有意思——仿真点云太“干净”了,没有真实环境里的运动畸变和噪声,导致算法在仿真里表现极好,换到真机上就掉链子。所以我后来在仿真里故意加了高斯噪声和随机丢点,才让仿真的结果更接近真实。
如果你打算用这套配置来做算法验证,我个人建议在 RVIZ 里加一个 DepthCloud 显示,把仿真点云投影成深度图,这样对 Mid-360 的扫描范围会有一个更直观的感受,尤其是垂直视场角 59° 带来的“近处盲区”问题,在仿真里就能提前发现,不用等到真机测试才发现机器人脚底下是一片盲区。
最后分享一个小技巧:每次改完 xacro 文件,先roslaunch livox_ros_driver2 gazebo_mid360.launch起一次,确认 Gazebo 能正常加载、RVIZ 能看到点云,再去集成自己的算法。不要一次性改一堆东西,不然出问题你根本不知道是哪一步引入的。这个习惯帮我节省了大量调试时间,也推荐给你。
本文还有配套的精品资源,点击获取