☰
基于ROS的AGV激光SLAM导航系统实现方案:从建图定位到路径规划全流程
2026/9/25 2:36:05 网站建设 项目流程

简介:这份资源是面向机器人方向本科生与初入行的SLAM工程师的ROS激光SLAM导航系统实现方案,源自一篇本科学位论文项目,用于解决AGV在未知或动态环境中定位、建图与路径规划的问题。压缩包共111个文件,约1.23MB,以yaml参数配置、launch启动脚本、cpp与cc源码、h头文件、xml与msg消息定义为主,另含pgm栅格地图、rviz可视化配置及md说明文档,覆盖base_controller、lslidar_n301、set_gmapping、hwtimu等模块,分别承担底盘控制、激光雷达数据处理、SLAM参数设置与IMU读取等功能。已有85人学习。读者可借此了解ROS下多模块整合的目录组织方式,参考传感器融合与局部EKF的实现思路,并对照launch与yaml快速复现建图导航流程,适合作为课程设计或入门练手的参考方案。

1. 从一台跑不直的 AGV 说起:这套 ROS 激光 SLAM 导航方案到底能干什么

很多人第一次接触 AGV,都是从小车跑不直、建图漂移、导航到一半卡死开始的。我见过太多团队在实验室里调得挺好,一到真实场地就翻车:激光雷达装歪了两度,代价是整张地图墙体重影;里程计标定没做,机器人走三米偏半米;导航参数照抄教程,结果一到窄通道就原地打转。这套「基于 ROS 的 AGV 激光 SLAM 导航系统实现方案」,解决的正是从建图、定位到路径规划、运动控制的完整链路问题,而不是只给你一个能跑 demo 的玩具。它适合正在做 AGV 小车、仓储搬运机器人、巡检机器人,或者单纯想系统学习 ROS 导航栈的工程师和学生。如果你已经装好 ROS,却不知道 gmapping、amcl、move_base 这些包怎么串起来,这份方案就是给你准备的。

2. 方案拆解:激光 SLAM 导航系统由哪些模块组成

2.1 硬件与软件栈的对应关系

一套能落地的 AGV 激光 SLAM 系统,硬件上通常包含轮式底盘、2D 激光雷达、IMU、编码器和工控机。软件上跑在 ROS 里,核心节点分工非常明确:激光雷达驱动负责把扫描数据转成sensor_msgs/LaserScan,底盘驱动把编码器脉冲转成nav_msgs/Odometry,SLAM 节点吃这两路数据吐出地图和位姿,导航栈再基于地图做路径规划。常见做法是雷达用思岚 A1/A2 或镭神 N10,底盘用差速两轮加万向轮,工控机装 Ubuntu 20.04 + ROS Noetic,这个组合资料最多、坑最少。如果你用的是 Ubuntu 22.04,ROS 2 Humble 也能跑,但很多老教程和功能包还是 Noetic 生态,新手建议先跟 Noetic 走一遍。

2.2 从传感器到地图:数据流怎么走

理解数据流比背命令重要。激光雷达发布/scan,底盘发布/odom,两者通过 tf 树关联到base_link。SLAM 节点订阅/scan和 tf,输出/map和map到odom的变换。导航时,amcl 订阅/scan和/map,输出map到odom的修正变换,move_base 再根据目标点规划路径,输出/cmd_vel给底盘。整个链路里,tf 树是黑匣子,一旦某个变换缺失或时间戳对不上,rviz 里就会报错,机器人也不会动。我一般会先用rosrun tf view_frames生成 tf 树图,确认map -> odom -> base_link -> laser这条链完整,再往下调。

2.3 建图与导航的启动顺序

启动顺序错了,节点之间抢 tf 或者参数没加载,都会导致玄学问题。正确顺序是:先启动雷达和底盘驱动,确认/scan和/odom有数据;再启动 SLAM 建图,用键盘遥控走一圈;保存地图后,关掉 SLAM,启动 amcl 和 move_base 做导航。下面是一个典型的建图启动命令,假设你已经把雷达和底盘驱动写好或用了现成包。

# 启动雷达驱动,具体包名根据你的雷达型号替换 roslaunch rplidar_ros rplidar.launch # 启动底盘驱动,这里以自己写的 base_driver 为例 roslaunch my_agv base_driver.launch # 启动 gmapping 建图 roslaunch my_agv gmapping.launch # 另开终端,启动键盘遥控 rosrun teleop_twist_keyboard teleop_twist_keyboard.py

这里gmapping.launch里关键参数是delta和particles。delta默认 0.05 米,地图分辨率,太小地图文件大,太大墙会糊;particles默认 30,粒子数越多建图越稳但越吃 CPU。我一般把particles调到 50 左右,delta保持 0.05。建图时速度别超过 0.3 m/s,转弯要慢,否则雷达帧匹配容易丢。

2.4 地图保存与导航配置

建完图用map_server保存,会生成.pgm和.yaml两个文件。.yaml里的resolution、origin和negate必须和建图时一致,否则导航时地图对不上。保存命令如下:

# 保存地图到当前目录,名字叫 my_map rosrun map_server map_saver -f my_map

保存后检查my_map.yaml,resolution应该是 0.05,origin是建图起点在 map 坐标系下的位姿。导航启动文件里要加载这张地图,并配置 amcl 和 move_base。amcl 的initial_pose参数可以设成建图起点,减少初始定位漂移。move_base 的global_planner和local_planner常用navfn和teb,teb 在窄通道表现更好,但参数多,新手先用base_local_planner跑通再换。

3. 动手复现:从零跑通建图与导航的完整步骤

3.1 环境准备与依赖安装

假设你已经装好 Ubuntu 20.04 和 ROS Noetic。如果还没装 ROS,常见做法是用一键安装脚本,但脚本来源要自己确认,装完用roscore验证。接着安装导航相关包:

sudo apt update sudo apt install ros-noetic-gmapping ros-noetic-amcl ros-noetic-move-base ros-noetic-map-server ros-noetic-teleop-twist-keyboard

这些包覆盖了建图、定位、路径规划和遥控。如果你用雷达是思岚,再装ros-noetic-rplidar-ros。装完用rospack find检查路径,确认没有缺失。

3.2 编写底盘驱动与里程计标定

底盘驱动是很多人的第一道坎。驱动要订阅/cmd_vel,把线速度和角速度转成左右轮 PWM,同时读编码器算里程计,发布/odom和odom -> base_link的 tf。下面是一个简化的 Python 驱动框架:

#!/usr/bin/env python import rospy from geometry_msgs.msg import Twist from nav_msgs.msg import Odometry import tf class BaseDriver: def __init__(self): rospy.init_node('base_driver') self.sub = rospy.Subscriber('/cmd_vel', Twist, self.cmd_cb) self.pub = rospy.Publisher('/odom', Odometry, queue_size=10) self.tf_broadcaster = tf.TransformBroadcaster() self.wheel_base = 0.3 # 轮距,单位米,根据实际测量修改 self.ticks_per_meter = 1000 # 每米编码器脉冲数,需要标定 def cmd_cb(self, msg): # 把线速度角速度转成左右轮速度,这里省略具体串口发送 v = msg.linear.x w = msg.angular.z v_left = v - w * self.wheel_base / 2.0 v_right = v + w * self.wheel_base / 2.0 # send_to_motor(v_left, v_right) def publish_odom(self, left_ticks, right_ticks): # 根据编码器脉冲算位移和角度,发布 odom 和 tf pass if __name__ == '__main__': driver = BaseDriver() rospy.spin()

wheel_base必须用卷尺量,ticks_per_meter要标定:让机器人直走 1 米,看编码器差值,反复调。标定不准,建图会重影,导航会画龙。我一般标三遍取平均,误差控制在 1% 以内。

3.3 建图实操与地图质量检查

启动建图后,在 rviz 里添加 LaserScan 和 Map,Fixed Frame 设成map。遥控机器人沿场地边缘走一圈,再走内部通道,速度放慢。建图过程中观察地图有没有重影,如果墙面变成两层,说明里程计或雷达安装角度有问题。走完后保存地图,用图像工具打开.pgm,检查黑色障碍物是否连续、白色可通行区域是否干净。地图质量直接决定导航成功率,别急着往下走。

3.4 导航参数配置与首次运行

导航启动文件里,amcl 的odom_frame_id设成odom,base_frame_id设成base_link,laser_model_type用likelihood_field。move_base 的costmap_common_params.yaml里,robot_radius或footprint必须按实际尺寸填,填小了会撞,填大了窄通道过不去。inflation_radius一般设成机器人半径的 1.5 倍。首次运行用 rviz 的 2D Nav Goal 点一个目标点,看机器人能不能规划出路径并移动。如果原地转圈,检查cmd_vel有没有发出去、底盘驱动有没有订阅。

4. 避坑与排查:AGV 导航最常见的五个翻车现场

4.1 现象:建图时地图重影,墙面变两层

原因通常是里程计标定不准,或者雷达安装角度和 tf 里的laser到base_link变换不一致。解决方法是先标定里程计,再用卷尺量雷达安装位置,更新 tf 的static_transform_publisher参数。如果雷达装歪了,能改安装就改,不能改就在 tf 里加旋转补偿。

4.2 现象:导航时机器人原地打转或不动

先看cmd_vel有没有数据,rostopic echo /cmd_vel。如果没有,检查 move_base 是否收到目标点、全局路径是否规划成功。如果有cmd_vel但底盘不动,检查底盘驱动订阅的话题名是否匹配。常见坑是 move_base 发的是/cmd_vel,底盘订阅的是/cmd_vel_raw,话题对不上。

4.3 现象:amcl 定位漂移,机器人位置跳变

amcl 的initial_pose没设对,或者激光雷达数据噪声大。解决方法是把初始位姿设成建图起点,调大laser_max_range和laser_min_range过滤无效点,必要时换likelihood_field为beam模型。如果场地有玻璃或镜面,激光雷达会测到虚假障碍,定位必漂,这种环境要考虑加反光板或换 3D 雷达。

4.4 现象:窄通道过不去,全局路径贴着墙

costmap 的inflation_radius太大,或者robot_radius填大了。把inflation_radius调到机器人半径的 1.2 倍左右,robot_radius按实际最小外接圆填。如果用了 teb,调小min_obstacle_dist和weight_kinematics_forward_drive,让机器人更愿意走直线。

4.5 现象:导航到目标点附近来回震荡

局部规划器参数太激进,或者目标点容差太小。把xy_goal_tolerance从 0.1 调到 0.2,yaw_goal_tolerance从 0.05 调到 0.1。如果是 teb,调大weight_kinematics_nh和weight_optimaltime,让轨迹更平滑。震荡严重时先降速,速度降到 0.2 m/s 以下再调参数。

5. 进阶技巧:用仿真验证参数,再上真车

真车调试成本高,撞一次可能坏雷达。我习惯先在 Gazebo 里跑仿真,把建图和导航参数调稳,再上真车。仿真里可以用turtlebot3_world或自己搭场景,加载激光雷达插件,跑同样的 gmapping 和 move_base。下面是一个仿真启动的典型命令:

# 启动 Gazebo 仿真环境 export TURTLEBOT3_MODEL=burger roslaunch turtlebot3_gazebo turtlebot3_world.launch # 启动建图 roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping # 启动导航 roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/my_map.yaml

仿真里重点验证三件事:全局路径是否合理、局部规划是否避障、到点精度是否达标。仿真通过后,把参数文件原样拷到真车,只改robot_radius和wheel_base这些硬件相关项。真车上再微调inflation_radius和速度限制。我一般会在真车第一次跑导航时,用手持急停开关守着,速度限制在 0.15 m/s,跑通一圈再逐步提速。

还有一个技巧是用rosbag record把建图和导航过程录下来,出问题可以回放分析。录/scan、/odom、/tf、/cmd_vel和/map就够了。回放时用rosbag play --clock,配合 rviz 看数据流,比在现场猜快得多。从那以后我每次调新场地,都强制先录一段 bag,再动手改参数。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询