【仿仿又真真】FASTLIO2 集成与 Gazebo 仿真调试记录1 FASTLIO2 集成与 Gazebo 仿真调试记录最近在把 FASTLIO2_ROS2liangheming 完整版往自己的仿真环境里集成顺手也把 Gazebo ArduPilot SITL 的环境修了一遍。过程比预想中折腾不少记录一下。一、背景手头有一个基于 Gazebo 的无人机仿真环境传感器配置了 Livox Mid360 激光雷达和 IMU。之前用的是北航移植版的 FASTLIO2能正常工作。这次想换成 liangheming 的完整版包含 fastlio2、pgo、localizer、hba、interface 五个包结果点云怎么也出不来。二、编译与环境准备编译过程倒是顺利五个包一次过。为了调试方便写了几个辅助脚本启动Gazebo.sh自动设GAZEBO_PLUGIN_PATH环境变量启动FASTLIO2.sh启动前自动检测传感器话题状态诊断FASTLIO2.sh检查节点订阅/发布情况测试传感器.sh确认传感器话题是否在发数据配置方面只改了一处把lio_platform.yaml里的imu_init_num从 20 降到 10降低 IMU 初始化门槛。三、问题现象启动 Gazebo FASTLIO2 后FASTLIO2 节点正常启动配置文件正确加载RViz2 打开但没有任何点云显示话题列表能看到/livox/lidar和/livox/imu看起来一切正常但没有数据。四、排查过程按步骤做了以下检查步骤操作结果1检查传感器话题/livox/imu约 120Hz 正常输出/livox/lidar有发布者2ros2 topic echo /livox/lidar无数据超时3检查 ROS2 节点列表Gazebo、livox_plugin、imu_plugin 都在运行4查看话题详情Publisher count: 1Subscription count: 05换回北航版本验证点云正常显示第 5 步基本排除了传感器配置本身的问题。对比确认两个版本使用完全相同的传感器 URDF 和 CSV 文件区别仅在于 FASTLIO2 代码实现不同。北航版是基于港大原版做的 ROS2 移植新版本是 liangheming 重构版。关键在于Livox 仿真插件libros2_livox.so虽然创建了话题发布者但OnNewLaserScans()回调没有被触发或者触发了但rayShape未正确初始化导致数据没有实际发布出来。日志中有这样一个细节[gzserver-1] [INFO] [LivoxPointsPlugin]: ros topic name: /livox/lidar [gzserver-1] [INFO] [LivoxPointsPlugin]: scan info size: 800000 [gzserver-1] [INFO] [LivoxPointsPlugin]: sample: 24000 [gzserver-1] [INFO] [LivoxPointsPlugin]: downsample: 1 [gzserver-1] cannot convert str: ← 这里 [gzserver-1] data size:800000cannot convert str提示 CSV 文件尾部可能有个空行导致转换异常但这应该不影响回调触发。真正的问题还是出在插件内部的更新循环上。五、Gazebo SITL 环境修复在解决点云问题的同时顺便把仿真环境本身的一些问题也修了。5.1 Gazebo GUI 不显示Gazebo 日志正常但没有窗口弹出来。排查下来是 Wayland/X11 兼容性问题加上 dconf 文件系统只读错误。配置QT_QPA_PLATFORMxcb和GDK_BACKENDx11后解决。5.2 启动极慢50秒启动时卡在 “Getting models from http://models.gazebosim.org/” 超时。虚拟机无法访问外网Gazebo 尝试从在线模型库下载模型被拒。设置GAZEBO_MODEL_DATABASE_URI禁用在线下载启动时间降到 5-10 秒。5.3 ArduPilot 插件加载失败日志报错imu_sensor [iris_demo::iris::iris/imu_link::imu_sensor] not found, abort ArduPilot plugin原因是世界文件中把模型命名成了iris_uav1自定义名称但插件硬编码了iris_demo这个命名空间来查找传感器。把自定义名称去掉使用模型默认名称iris_demo保持命名一致即可。六、飞行测试脚本环境修好后写了一个飞行测试脚本用来验证整套仿真链路是否正常。迭代过程中踩了几个坑版本问题修复v1TCP 5762 不支持多客户端改用 UDP 14550/14551v2起飞 2m 撞天花板先降到 1m后确认空间够恢复 2mv3LOCAL_OFFSET_NED导致突升改用MAV_FRAME_LOCAL_NED绝对坐标系v4飞行抖动、不返回持续发位置指令0.5s 间隔累积监测偏差v5起飞后猛冲增加 EKF 稳定等待 5sv6着陆检测不准增加解锁状态监测 地面停留 2s 置信判断最终流程连接 → GUIDED 模式 → 解锁 ↓ 起飞到 2m → 悬停 2s → 等待 EKF 稳定 5s ↓ 向前飞行 2m持续发送位置指令 ↓ 返回起点持续发送位置指令 ↓ 降落高度 解锁状态双重判断当前参数起飞高度 2m前飞距离 2m位置误差容忍 0.3m着陆高度阈值 0.15m 持续 2s。还顺手写了一个一键归位脚本自动检测飞行状态、降落、上锁最后用gz model命令把无人机重置到初始位置。七、当前状态已完成FASTLIO2_ROS2 完整版编译成功Gazebo SITL 环境修复GUI、启动速度、插件加载飞行测试脚本开发完成多轮迭代后稳定运行辅助诊断脚本开发完成待解决Livox 仿真插件未实际发布点云数据需要深入修改插件源码或寻找替代方案RViz 中无点云/地图显示已知北航版本可正常建图说明传感器与 Gazebo 配置无误新版 FASTLIO2 需额外关注与仿真插件的话题对接层八、启动方式当前整套环境的启动方式终端1 (Gazebo): cd ~/Desktop source setup_environment.sh export GAZEBO_MODEL_DATABASE_URI ros2 launch simulation gazebo_world.launch.py 终端2 (SITL): cd ~/ardupilot/ArduCopter sim_vehicle.py -v ArduCopter -f gazebo-iris --console --map -I0 终端3 (飞行测试): python3 test_forward_and_back.py 终端3 (归位): python3 reset_uav_position.py虚拟机环境有个已知的性能限制PreArm 会报 Gyro 频率不足595Hz 720Hz和主循环过慢250Hz 400Hz需要使用 param221196 强制解锁不过不影响功能操作。点云的问题目前看下来大概率需要改 Livox 插件的源码或者换一种方式来对接仿真数据。后续有进展再更新。