1.TODO清单
26年版本
新技术路线
[仿真/真实硬件] [算法层] [输出]
RTK GPS → robot_localization → /tf (map->odom)
轮式里程计 → (EKF融合) → 全局定位
3D LiDAR → pointcloud_to_laserscan → /scan (2D)
→ Nav2 costmap → 障碍物地图
Nav2 → global_planner → 全局路径
→ local_planner → /cmd_vel
/cmd_vel → 车体控制器 → 小车运动新 TODO 清单
第一阶段:仿真环境搭建
- 换用差速轮模型(Turtlebot3 或简单四轮差速),彻底绕开阿克曼复杂性
- 保留现有 Gazebo 场景(
slam_test.world) - 验证
/odom、/scan、/imu_raw话题正常输出
第二阶段:定位层
- 安装配置
robot_localization(EKF) - 用仿真 GPS 替代 RTK,融合轮式里程计,输出稳定的
map->odomTF - 验证 Rviz 里小车位置和 Gazebo 一致
第三阶段:Nav2 导航
- 安装 Nav2,配置差速轮参数
- 配置 costmap(用 2D laserscan)
- 能在 Rviz 里点击目标点,小车自动导航过去并避障
- 能用 RTK 坐标(转换为 map 坐标系)作为导航目标
第四阶段:迁移真实硬件
- 替换
/odom→ 真实轮式编码器 - 替换
/gps/fix→ 真实 RTK 模块 - 替换
/scan→ 真实 Mid-360(pointcloud → laserscan) - 替换
/cmd_vel→ 真实底盘驱动 - 调参验证真实环境导航效果
25年末版本
第一阶段:车辆与物理环境 (Vehicle & Environment)
1. 获取阿克曼模型 (Audibot/F1Tenth)
推荐使用 Audibot 的 ROS2 分支。它的代码结构比 F1Tenth 更适合做二次开发。
搜索 GitHub
audibot_ros2,拉取代码并编译。
2. 传感器改装 (Model Modification)
Mid-360 仿真难点:Mid-360 是非重复扫描(花瓣状)。在 Gazebo 中完美模拟这种物理特性比较吃力。
替代方案:为了验证 LIO-SAM 逻辑,建议在 URDF 中使用标准的 32线或64线 LiDAR 插件,但将垂直视场角 (Vertical FOV) 设置大一点(Mid-360 是 360°x59°)。
RTK-GPS 仿真:在 GPS 插件中,将
gaussian_noise设置为极小值(例如0.001),模拟 RTK 的高精度。
3. 验证 TF 树 (Crucial)
在 Rviz 中检查 TF:
base_link->lidar_link->imu_link->gps_link。重点:阿克曼车的旋转中心在后轴中心,而 LiDAR 通常在车顶。确保这个 TF 变换是准确的,否则地图会随着车转弯而发生“重影”。
第二阶段:LIO-SAM 适配 (Algorithm Adaptation)
Mid-360 的驱动输出格式和普通雷达不同(Livox 自定义消息 vs PointCloud2),这里是很多人的“深坑”。
1. 选择支持 Livox 的 LIO-SAM 分支
官方 LIO-SAM 是基于 ROS1 的。你需要找 LIO-SAM-ROS2 版本。
注意:如果要用真实的 Mid-360 驱动逻辑,你需要编译
livox_ros_driver2。但在仿真里,如果你用的是标准点云插件,那么 LIO-SAM 的配置文件中sensor类型要选velodyne(即使你假装它是 Mid-360),这样接口才对得上。
2. IMU 融合配置
JY901 vs 内部 IMU:Mid-360 内部 IMU 频率高但精度一般,JY901 精度不错。
在
params.yaml中,重点修改extrinsicRot和extrinsicTrans。这是 LiDAR 到 IMU 的外参。如果这个填错 1 厘米或 1 度,LIO-SAM 必挂。
3. GPS 因子图融合
开启
useGPS: true。由于你是 RTK,你可以信任 GPS 数据。在 LIO-SAM 代码中,寻找 GPS 协方差矩阵(Covariance),将其数值改小,增加 GPS 在优化中的权重。
第三阶段:无图导航配置 (Navigation w/o Pre-mapping)
你的需求是“不预先建图”,这在 ROS2 中通常被称为 SLAM Toolbox / LIO-SAM + Nav2 Rolling Window。
1. 实时栅格化 (3D -> 2D)
LIO-SAM 输出的是 3D 点云
/lio_sam/mapping/cloud_registered。Nav2 需要 2D 地图。你需要运行
octomap_server或者pcl_to_grid节点,实时把 3D 点云压扁成 2D 占用栅格地图 (/map或/local_map),喂给 Nav2。
2. 配置 Nav2 (TEB/MPPI Controller)
核心痛点:阿克曼车不能原地转。默认的
DWB控制器如果不细调,经常会规划出原地旋转的路径,导致车卡死。推荐:配置 MPPI Controller (Model Predictive Path Integral) 或 TEB Local Planner。它们对阿克曼运动学约束支持最好。
在 Nav2 的
nav2_params.yaml中,设置robot_radius或footprint为你的车体大小。
3. 全局规划器 (Global Planner)
因为没有全图,你需要配置
SmacPlannerHybrid或者NavFn,并设置use_sim_time: true。让 Nav2 在“未知区域”也能规划路径(通常需要设置
allow_unknown: true)。
