简介这份资源是面向ROS初学者与AGV导航方向研究者的激光SLAM导航系统实现方案源自本科学位论文项目适合希望动手搭建激光雷达定位与建图流程、理解多模块协同的读者参考。压缩包共111个文件约1.23MB以yaml参数配置、launch启动脚本、cpp与cc源码、h头文件、xml与msg消息定义为主另含pgm栅格地图、rviz可视化配置及md说明文档覆盖驱动、控制、建图与传感器融合等环节。系统整合base_controller、lslidar_n301、set_gmapping、hwtimu等模块分别承担底盘控制、激光雷达数据处理、SLAM参数设置与IMU读取并借助localEKF、Sensorfusion等实现定位融合可帮助读者理解同步定位与地图构建的完整链路。目前已有85人学习。作者提示该方案创新性有限建议关注其后续硕士论文研究详细代码另存于独立仓库资源仅供学习交流请勿商用。1. 基于ROS的AGV激光SLAM导航系统从建图到自主导航的工程落地路径一台AGV在仓库里跑不起来十有八九不是硬件问题而是导航栈的配置和坐标系没理顺。基于ROS的AGV激光SLAM导航系统实现方案核心要解决三件事用激光雷达建出一张能用的栅格地图、让AGV知道自己在图上的精确位置、规划出一条不撞货架又能动态避障的路径。这套方案适合有Ubuntu和ROS基础的移动机器人开发者也适合正在把差速底盘改造成自主导航AGV的集成商。ros slam建图和自主导航这条链路在ROS 1 noetic上已经非常成熟雷达选型从思岚A1到速腾聚创16线都有对应驱动算力最低配置一台NUC或者Jetson Nano就能跑通。下面按实际工程顺序把建图、定位、导航、避坑四个环节拆开讲每一步都给出可复现的命令和参数。2. 激光SLAM建图从雷达驱动到一张能用的栅格地图2.1 为什么选gmapping而不是cartographer在AGV场景里gmapping和cartographer是最常见的两个激光SLAM方案。gmapping基于粒子滤波对2D单线雷达的兼容性最好计算量小在NUC上就能实时跑cartographer建图精度更高但配置复杂对TF树和传感器时间同步要求严格调参周期长。我一般建议如果AGV跑的是单层平面仓库、雷达是单线、算力有限直接用gmapping如果场地大、需要闭环优化、雷达是多线或者有IMU再上cartographer。gmapping的核心参数就几个粒子数、更新频率、激光扫描匹配的迭代次数。粒子数越多建图越稳但越吃CPU一般设30到50够用。线性更新阈值和角度更新阈值决定机器人走多远才更新一次地图设太小会导致地图重影设太大则地图更新滞后。2.2 雷达驱动安装与话题验证假设用的是思岚A1雷达ROS驱动包是rplidar_ros。安装和启动步骤如下# 安装rplidar驱动 sudo apt install ros-noetic-rplidar-ros # 查看雷达串口设备 ls /dev/ttyUSB* # 给串口权限 sudo chmod 666 /dev/ttyUSB0 # 启动雷达节点 roslaunch rplidar_ros rplidar.launch启动后另开终端验证话题# 查看雷达话题是否发布 rostopic list | grep scan # 查看扫描数据频率 rostopic hz /scan # 查看一帧扫描数据 rostopic echo /scan -n1逻辑说明rplidar_ros默认发布/scan话题消息类型是sensor_msgs/LaserScan。rostopic hz应该显示10Hz左右如果频率不稳或者没有数据先检查串口权限和波特率。参数方面rplidar.launch里可以改串口名和帧率A1默认波特率115200A2是256000设错了会直接报错。2.3 gmapping建图配置与实操建图前需要确认TF树完整base_link到laser的静态变换、odom到base_link的里程计变换。差速底盘一般用轮式里程计发布odom雷达用static_transform_publisher发布base_link到laser的固定变换。!-- 雷达静态TF -- node pkgtf typestatic_transform_publisher namebase_to_laser args0.1 0 0.2 0 0 0 base_link laser 100 /gmapping的launch文件关键配置launch node pkggmapping typeslam_gmapping nameslam_gmapping outputscreen param namebase_frame valuebase_link/ param nameodom_frame valueodom/ param namemap_frame valuemap/ param nameparticles value40/ param namedelta value0.05/ param namelinearUpdate value0.3/ param nameangularUpdate value0.2/ param namexmin value-20.0/ param nameymin value-20.0/ param namexmax value20.0/ param nameymax value20.0/ /node /launch参数说明particles是粒子数40在NUC上CPU占用约30%delta是地图分辨率0.05米即5厘米一格仓库场景够用linearUpdate和angularUpdate是更新阈值机器人移动0.3米或旋转0.2弧度才更新地图设太小会导致地图频繁重绘、CPU飙升。xmin/ymin/xmax/ymax是地图边界按实际场地设设太大浪费内存。建图完成后用map_server保存# 保存地图 rosrun map_server map_saver -f ~/agv_ws/maps/warehouse_map会生成warehouse_map.pgm和warehouse_map.yaml两个文件。yaml里记录了分辨率、原点坐标和阈值后续导航直接加载这个yaml。提示建图时尽量让AGV走闭合回路gmapping的闭环检测能显著提升地图一致性。如果仓库有长走廊建议来回走两遍减少激光匹配漂移。3. AMCL定位与move_base导航让AGV知道自己在哪、该往哪走3.1 AMCL参数怎么调才不丢定位AMCL是蒙特卡洛定位用粒子滤波在已知地图上估计机器人位姿。AGV导航中最常见的问题是定位跳变或者粒子发散表现是rviz里机器人位置突然飘到地图外。核心参数有三个粒子数、激光模型类型、更新阈值。launch node pkgamcl typeamcl nameamcl outputscreen param namemin_particles value500/ param namemax_particles value3000/ param namekld_err value0.05/ param nameupdate_min_d value0.2/ param nameupdate_min_a value0.2/ param namelaser_model_type valuelikelihood_field/ param namelaser_max_range value12.0/ param namelaser_min_range value0.15/ param nameodom_model_type valuediff/ param nameodom_alpha1 value0.2/ param nameodom_alpha2 value0.2/ param nameodom_alpha3 value0.2/ param nameodom_alpha4 value0.2/ /node /launch参数说明min_particles和max_particles是粒子数上下限500到3000在仓库场景够用laser_model_type选likelihood_field比beam模型更鲁棒对动态障碍物不敏感update_min_d和update_min_a是位移和旋转更新阈值设0.2米和0.2弧度太小会导致频繁重采样、CPU占用高。odom_alpha1到alpha4是里程计噪声模型参数差速底盘一般设0.2左右如果AGV打滑严重可以适当调大。初始定位时在rviz里用2D Pose Estimate给一个大致初始位姿AMCL会在几秒内收敛。如果粒子一直发散检查激光和地图是否匹配、里程计方向是否正确。3.2 move_base全局与局部规划器选型move_base是ROS导航的核心节点包含全局规划器和局部规划器两层。全局规划器常用global_planner或navfn局部规划器常用base_local_planner或teb_local_planner。AGV场景我一般推荐全局用global_planner的A*模式局部用teb_local_planner因为TEB对差速底盘的动力学约束处理更好转弯更平滑。launch node pkgmove_base typemove_base namemove_base outputscreen rosparam file$(find agv_nav)/config/costmap_common_params.yaml commandload nsglobal_costmap/ rosparam file$(find agv_nav)/config/costmap_common_params.yaml commandload nslocal_costmap/ rosparam file$(find agv_nav)/config/global_planner_params.yaml commandload/ rosparam file$(find agv_nav)/config/teb_local_planner_params.yaml commandload/ param namebase_global_planner valueglobal_planner/GlobalPlanner/ param namebase_local_planner valueteb_local_planner/TebLocalPlannerROS/ /node /launch代价地图公共参数# costmap_common_params.yaml obstacle_range: 3.0 raytrace_range: 3.5 footprint: [[-0.3, -0.25], [-0.3, 0.25], [0.3, 0.25], [0.3, -0.25]] inflation_radius: 0.55 cost_scaling_factor: 3.0 observation_sources: scan scan: {data_type: LaserScan, topic: /scan, marking: true, clearing: true}参数说明obstacle_range是障碍物标记距离3米够用raytrace_range是清除距离比obstacle_range大0.5米footprint是AGV轮廓按实际尺寸设设小了会撞设大了过不去窄通道inflation_radius是膨胀半径一般设AGV对角线一半再加0.1米安全余量cost_scaling_factor控制膨胀代价衰减速度越大衰减越快。3.3 从rviz发目标点到AGV实际运动导航启动后在rviz里用2D Nav Goal点一个目标位置move_base会自动规划路径并控制底盘运动。验证导航是否正常按以下步骤# 启动导航 roslaunch agv_nav navigation.launch # 查看move_base状态 rostopic echo /move_base/status # 查看全局路径 rostopic echo /move_base/GlobalPlanner/plan -n1 # 查看局部路径 rostopic echo /move_base/TebLocalPlannerROS/global_plan -n1如果AGV不动先看/move_base/status是不是ACTIVE再看/cmd_vel有没有输出。常见问题是代价地图没更新、TF超时、或者局部规划器陷入局部极小值。TEB的参数里max_vel_x和max_vel_theta控制最大速度acc_lim_x和acc_lim_theta控制加速度设太大会导致AGV急停急转设太小则反应迟钝。注意move_base的全局代价地图和局部代价地图是分开的全局地图更新频率低、范围大局部地图更新频率高、范围小。如果AGV在局部地图里看到障碍物但全局地图没有说明传感器观测没同步到全局层检查observation_sources配置。4. 多传感器融合与TF树激光SLAM导航的隐形地基4.1 TF树常见断裂点与排查方法TF树是ROS导航的坐标系骨架任何一环断裂都会导致导航失败。典型TF树结构是map - odom - base_link - laser。map到odom由AMCL发布odom到base_link由里程计发布base_link到laser由静态TF发布。排查TF问题用以下命令# 查看TF树 rosrun rqt_tf_tree rqt_tf_tree # 查看两个坐标系之间的变换 rosrun tf tf_echo map base_link # 查看TF发布频率 rostopic hz /tf如果tf_echo报错“Lookup would require extrapolation into the future”说明时间戳不同步检查雷达和里程计的时间源。如果TF树里缺少某个坐标系用rosrun tf view_frames生成pdf查看完整结构。4.2 里程计标定让odom和实际运动对得上里程计不准是AGV导航跑偏的头号原因。差速底盘的两个轮子直径、轮距、编码器分辨率如果设错odom推算的位姿和实际位姿会越差越远。标定方法是让AGV直线走3米看odom记录的距离和实际距离差多少然后按比例修正轮径参数。# 记录odom数据 rostopic echo /odom/pose/pose/position # 让AGV直线走3米记录起止位置 # 如果odom显示2.8米实际3米轮径参数乘以3/2.8角度标定类似让AGV原地转360度看odom的yaw角变化如果只转了350度轮距参数按比例修正。标定完后重新建图地图一致性会明显提升。4.3 激光雷达安装位置对建图的影响雷达安装高度和倾斜角度直接影响建图质量。安装太高会扫到货架顶部太低会扫到地面反光。一般建议雷达安装在AGV车体前方中部离地30到50厘米水平安装倾斜不超过2度。如果雷达有俯仰角激光扫描面会变成斜面建出的地图会有重影。另外雷达的盲区要避开AGV自身结构。如果雷达扫描面被车体遮挡需要在URDF里加过滤或者调整安装位置。rviz里看/scan数据如果有一片固定角度的缺失就是被遮挡了。5. 避坑与排查AGV激光SLAM导航的5个血泪教训5.1 建图时地图重影、墙壁变厚现象建出的地图墙壁有两层或者明显变厚AGV定位时粒子发散。原因里程计标定不准或者雷达安装倾斜导致激光匹配时位姿估计漂移。解决先标定里程计确认直线和旋转误差在5%以内再检查雷达安装水平度用水平仪校准建图时降低linearUpdate阈值让地图更新更频繁。5.2 导航时AGV原地打转或走S形现象AGV收到目标点后不往前走原地左右转或者走起来画龙。原因局部规划器参数不匹配max_vel_theta太大而acc_lim_theta太小或者代价地图膨胀半径过大导致局部极小值。解决降低max_vel_theta到0.5 rad/s以下增大acc_lim_theta到1.0 rad/s²检查inflation_radius是否超过通道宽度的一半如果通道窄适当减小膨胀半径。5.3 AMCL定位突然跳到地图外现象rviz里机器人位置突然飘到地图边界外导航中断。原因激光数据和地图匹配失败通常是环境变化太大比如货架挪动或者激光被动态障碍物遮挡。解决增大min_particles到1000以上提高定位鲁棒性检查laser_max_range是否设得太小导致可用激光点太少如果环境经常变考虑用cartographer的纯定位模式。5.4 move_base报错“Failed to get robot pose”现象move_base启动后一直报这个错导航无法启动。原因TF树里map到base_link的变换不可用通常是AMCL没启动或者没收到初始位姿。解决确认AMCL节点在运行并且在rviz里给了2D Pose Estimate检查AMCL的global_frame和robot_base_frame参数是否和TF树一致。5.5 雷达数据频率不稳导致建图卡顿现象建图过程中rviz卡顿地图更新一顿一顿的。原因雷达USB供电不足或者串口被其他进程占用导致/scan频率从10Hz掉到5Hz以下。解决给雷达单独供电不要和电机共用USB hub用rostopic hz /scan确认频率如果低于8Hz换USB口或者加有源hub。6. 进阶技巧用rosbag回放做导航算法离线验证导航参数调优最耗时的不是改参数而是每次都要让AGV实际跑一遍。用rosbag录制一次真实传感器数据之后就可以在离线环境下反复回放、反复调参不用碰硬件。这个习惯帮我省了至少一半的调试时间。录制rosbag的命令# 录制建图和导航所需的所有话题 rosbag record -O agv_nav_test.bag /scan /odom /tf /tf_static /cmd_vel # 回放时用--clock发布模拟时间 rosbag play agv_nav_test.bag --clock # 回放时可以用-r参数调整速度 rosbag play agv_nav_test.bag --clock -r 0.5回放时需要把use_sim_time参数设为true否则AMCL和move_base会用系统时间而不是bag时间导致TF extrapolation错误。param nameuse_sim_time valuetrue/回放验证的典型流程先回放bag在rviz里看AMCL定位是否收敛然后给目标点看move_base规划路径是否合理最后看/cmd_vel输出是否平滑。如果路径震荡调TEB的weight_kinematics_forward_drive和weight_kinematics_turning_radius如果避障太保守调min_obstacle_dist和inflation_radius。一个实用技巧把不同参数组合的导航结果用rosbag分别录下来对比/cmd_vel的角速度和线速度曲线能直观看出哪组参数更平滑。我一般会录三组保守组、激进组、折中组然后选折中组上线。提示rosbag文件会很大录制时用--split按大小分割或者只录关键话题。回放前用rosbag info查看话题列表和时长确认数据完整。这套方案从建图到导航跑通大概需要两到三天其中标定和调参占一大半时间。我的习惯是每次改完参数先录bag回放验证确认没问题再上实车这样翻车概率会低很多。希望帮到你。本文还有配套的精品资源点击获取