简介:本资源是一套基于ROS的AGV激光SLAM导航系统实现方案,面向机器人方向本科生、ROS初学者及自动化物流领域入门开发者,聚焦于同步定位与地图构建(SLAM)在真实AGV平台上的工程落地,解决未知环境中自主建图、实时定位与基础导航控制等核心问题。压缩包共111个文件,含14个launch启动脚本(用于模块协同运行)、21个yaml配置文件(涵盖gmapping参数、传感器标定与TF坐标系设置)、14个cpp/cc源码文件(如lslidar_n301_driver、base_controller、Sensorfusion与localEKF等关键算法节点),以及rviz可视化配置、pgm地图文件和PDF学位论文等,整体仅1.23MB,轻量易部署。已有83人学习下载,资源结构清晰,完整呈现从激光雷达数据采集、IMU融合定位、SLAM建图到AGV底层运动控制的全链路ROS软件栈,附带可直接复现的启动流程与参数配置逻辑,是理解ROS工业导航系统集成架构的优质实践参考。
1. 项目概述:当AGV遇上ROS与激光SLAM
在工业物流和仓储自动化领域,AGV(自动导引运输车)早已不是什么新鲜事物。但你是否想过,那些在仓库里灵活穿梭、精准停靠的“小黄人”或“小蓝人”,它们是如何在没有预设磁条或二维码的复杂动态环境中,实现“认路”、“避障”和“送货”的?这背后,激光SLAM(即时定位与地图构建)与ROS(机器人操作系统)的组合,正成为新一代智能AGV导航系统的核心技术基石。
简单来说,这个项目就是教你如何从零开始,搭建一套能让AGV“自己学会看路”的智能导航大脑。它不再依赖昂贵且不易变更的地面基础设施,而是通过车顶的一台或多台激光雷达,像人的眼睛一样实时扫描周围环境,一边构建出车间或仓库的全局地图,一边在这个地图中精准地确定自己的位置,并规划出一条安全、高效的行驶路径。整个过程,完全自主。
为什么是ROS?因为它提供了一个模块化、标准化的软件框架。想象一下,激光雷达数据采集、SLAM算法计算、路径规划决策、电机运动控制……这些原本需要紧密耦合、开发调试极其复杂的模块,在ROS里变成了一个个可以独立开发、测试、通信的“节点”。这极大地降低了机器人软件开发的复杂度,让开发者可以更专注于算法本身,而不是底层通信和系统集成。对于AGV开发,无论是学术研究还是工业原型验证,ROS几乎是目前最主流、生态最丰富的选择。
这套方案适合谁?如果你是机器人相关专业的学生,想亲手打造一辆能跑会躲的智能小车;如果你是初创公司的工程师,正在为产品寻找可靠且开源的导航方案;或者你是一位工厂自动化改造的技术负责人,希望了解前沿导航技术的落地可行性——那么,这篇基于实际项目经验总结的详细实现方案,将为你提供一条清晰的路径。我们将从系统设计思路讲起,深入到每个核心模块的代码与配置,并分享那些在教科书和官方文档里找不到的“踩坑”实录与调参心得。
2. 系统整体设计与核心思路拆解
在动手写代码之前,理清整个系统的架构和核心组件的协作关系至关重要。一个基于ROS的激光SLAM导航AGV,其软件系统可以看作一个由感知、决策、执行三层构成的闭环。
2.1 核心架构:三层闭环与ROS节点网络
最底层是执行层,包括电机驱动器、底盘控制器等硬件。它们通过ROS的串口或CAN总线驱动节点,接收速度指令 (/cmd_vel话题),并反馈轮子编码器数据 (/odom话题) 和电池状态等信息。
中间层是决策层,这是导航的“大脑”。它接收来自感知层的地图、定位信息和目标点,核心任务有两个:全局路径规划和局部路径规划与避障。全局规划器(如global_planner)负责计算从起点到终点的最优路径(类似于手机地图给你规划的行车路线);局部规划器(如dwa_local_planner或teb_local_planner)则负责处理实时障碍物,在全局路径的指导下,生成当前时刻最安全、最平滑的速度指令。move_base是ROS中集成这两个规划器的核心功能包,充当了决策层的调度中心。
最上层是感知层,也是本项目的核心。它主要依赖激光雷达 (/scan话题) 和里程计 (/odom话题)。激光SLAM算法(如gmapping,cartographer,hector_slam)同时处理这两类数据,实现“定位”和“建图”。定位是回答“我在哪”,建图是回答“环境什么样”。这个过程是同时且相互依赖的:准确的地图需要精确的定位来构建,而精确的定位又需要准确的地图作为参考。SLAM节点会实时发布构建好的地图 (/map话题) 和机器人在地图中的精确位姿 (/tf变换树中的map->odom或map->base_link)。
所有层之间的数据交换,都通过ROS的话题、服务、参数服务器和TF坐标变换树来完成。理解这个数据流,是调试一切问题的基础。
2.2 硬件选型与考量:不只是买个雷达那么简单
硬件是软件的基石,选型不当会让后期开发举步维艰。
激光雷达:这是SLAM的“眼睛”。工业AGV常用2D激光雷达,如SICK或Hokuyo的高性能型号,它们测距远(几十米)、精度高、抗环境光干扰强,但价格昂贵。对于学习和原型开发,国产雷达如思岚(RPLIDAR)、禾赛(Pandar)或速腾聚创(RoboSense)的低成本型号是更常见的选择。选型时需关注:测距范围(需大于走廊宽度)、角度分辨率(影响建图精细度)、扫描频率(影响实时性)以及ROS驱动支持是否完善。
注意:很多廉价雷达在强光直射或面对深色、吸光物体时,测量会严重失真甚至丢失,这在仓库环境中很常见,务必在真实环境下测试。
主控制器:通常是一台工控机或高性能嵌入式主板(如NVIDIA Jetson系列)。它需要运行Ubuntu和ROS,并实时处理SLAM计算。计算性能和接口是关键。确保有足够的USB端口(给雷达)、稳定的电源以及用于调试的网口。如果考虑后期融合视觉或多传感器,GPU或算力更强的平台是必要的。
底盘与电机:AGV的“腿”。需要选择带编码器的直流伺服电机或步进电机,并提供速度闭环控制。编码器脉冲是生成里程计 (
/odom) 信息的唯一来源,其精度直接影响到SLAM的定位精度,尤其是在激光特征不明显的长走廊环境,里程计的准确性至关重要。底盘的运动模型(差分驱动、麦克纳姆轮、全向轮)决定了后续move_base中参数配置的差异。其他传感器(可选但推荐):IMU(惯性测量单元)可以提供角速度和加速度信息,与里程计融合后能显著提升在打滑、颠簸情况下的位姿估计精度,这对
cartographer等SLAM算法尤其有益。一个单目或深度相机可以用于辅助识别二维码、货架编号或动态障碍物,实现更高级的功能。
2.3 软件栈规划:ROS版本与功能包选型
ROS1 Noetic是当前最成熟、稳定的LTS版本,社区支持最好,是本项目的首选。不建议初学者在项目初期使用ROS2,虽然它是未来,但其生态和工具链的成熟度仍在追赶中。
核心功能包选型:
- SLAM:
gmapping是入门首选,基于粒子滤波,对2D激光建图简单有效,但计算量大,不适合大场景。hector_slam不依赖里程计,适合空中或地面不平整机器人,但对高速运动敏感。cartographer是Google开源的高性能SLAM,支持2D/3D,回环检测能力强,能构建大而一致的地图,是当前工业应用和学术研究的主流选择,虽然配置稍复杂。 - 导航:
move_base是标准框架,集成了全局规划器(默认使用navfn或global_planner)和局部规划器(默认dwa_local_planner)。对于AGV,teb_local_planner(时间弹性带)通常比DWA表现更好,因为它能生成更平滑、更符合运动学约束的轨迹,对于需要精准停靠的AGV任务尤其合适。 - 仿真:
Gazebo是ROS官方的物理仿真器。在实车开发前,用Gazebo搭建一个虚拟的仓库环境,模拟激光雷达、电机和碰撞,可以无风险地验证整个导航栈的可行性,极大提高开发效率。
3. 核心模块解析与实操要点
理解了宏观架构,我们深入到每个核心模块的内部,看看它们如何工作,以及在实际配置中需要注意哪些“魔鬼细节”。
3.1 激光SLAM模块深度剖析:以Cartographer为例
我们选择cartographer作为SLAM实现的例子,因为它代表了当前的主流水平。它的核心思想是将连续的激光扫描数据与子图(Submap)进行匹配。当子图不再变化时,就将其加入“全局地图”,并通过扫描匹配和回环检测来优化所有位姿,形成一个全局一致的地图。
关键配置解析(lua配置文件):
-- 对于2D SLAM MAP_BUILDER.use_trajectory_builder_2d = true TRAJECTORY_BUILDER_2D.submaps.num_range_data = 90 -- 一个子图包含多少帧激光数据 TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 10.0 -- 平移权重 TRAJECTORY_BUILDER_2D.ceres_scan_matcher.rotation_weight = 40.0 -- 旋转权重 POSE_GRAPH.constraint_builder.min_score = 0.55 -- 回环检测的最小匹配分数num_range_data:这个值决定了子图的“新鲜度”。值越小,子图更新越快,对动态环境适应好,但可能引入更多噪声;值越大,子图更稳定,但延迟高。对于结构稳定的仓库,可以设大一些(如90)。translation_weight和rotation_weight:这是在扫描匹配时,对位姿变化惩罚的权重。如果你的里程计比较准,可以适当调高这些权重,让优化更信任里程计;如果激光数据质量很高而里程计有漂移,可以调低。min_score:回环检测的置信度阈值。调低可以检测到更多回环,加速全局优化,但也可能引入错误闭环,导致地图扭曲。通常从0.55开始微调。
实操心得:
- 建图模式 vs 纯定位模式:Cartographer可以分开。第一次建图时,使用
roslaunch cartographer_ros offline_backpack_2d.launch(或类似)并播放数据包,生成.pbstream地图文件。在实际导航时,则加载这个地图文件,并启动纯定位节点,此时它不再修改全局地图,只输出高精度的定位。 - 初始位姿很重要:启动建图时,尽量让AGV停在一个特征明显(如两面墙夹角)的位置,并确保启动命令中的
initial_pose参数设置正确。一个糟糕的初始位姿可能导致初期匹配失败,整个建图过程都会歪掉。 - 处理“走廊病”:在长而特征重复的走廊里,激光SLAM容易在走廊方向(通常是x轴)上发生漂移。这时,里程计和IMU的融合数据就显得尤为关键。确保你的
/odom话题发布的是经过滤波(如robot_pose_ekf包)的稳定数据。
3.2 导航栈(move_base)配置精髓
move_base是导航的“总指挥”,其配置文件(.yaml)参数多如牛毛,但掌握几个核心组,就能解决80%的问题。
代价地图(Costmap)配置: 导航的核心是两张地图:global_costmap(全局代价地图)和local_costmap(局部代价地图)。它们将SLAM生成的静态地图(/map)与实时激光障碍物信息融合,生成一个每个栅格都有“代价”的地图,代价越高,表示越不可通行。
global_costmap: global_frame: map robot_base_frame: base_link update_frequency: 1.0 # 全局地图更新频率,可以较低 static_layer: map_topic: /map obstacle_layer: observation_sources: laser_scan laser_scan: {sensor_frame: laser, data_type: LaserScan, topic: /scan, marking: true, clearing: true} local_costmap: global_frame: odom # 注意!局部地图通常基于odom帧,以应对短期漂移 robot_base_frame: base_link update_frequency: 5.0 # 局部地图需要高频更新 rolling_window: true # 关键!局部地图是随着机器人移动的滚动窗口 width: 6.0 # 滚动窗口的宽度/高度,单位米 height: 6.0rolling_window:这是局部规划能实时避障的关键。它只关心机器人周围一小块区域,并随着机器人移动而移动。marking和clearing:marking=true表示激光检测到的点会被标记为障碍物;clearing=true表示激光光束穿过的区域会被清理为自由空间。这模拟了传感器的感知特性。
规划器参数调优(以teb_local_planner为例):
TebLocalPlannerROS: max_vel_x: 0.5 # 最大前进速度 (m/s) max_vel_theta: 0.8 # 最大旋转速度 (rad/s) acc_lim_x: 0.5 # 前进加速度限制 acc_lim_theta: 0.7 # 旋转加速度限制 # 轨迹优化权重 weight_kinematics_forward_drive: 1.0 # 鼓励向前行驶 weight_optimaltime: 1.0 # 鼓励快速到达(时间最优) weight_obstacle: 50.0 # 障碍物代价权重,**这个值非常关键!** # 与全局规划器的衔接 global_plan_overwrite_orientation: true # 使局部轨迹朝向与全局路径一致 feasibility_check_no_poses: 5 # 向前检查多少個位姿是否可行weight_obstacle:这是避障敏感度的主要调节参数。如果AGV总是离障碍物太近,甚至撞上,就调高这个值(比如从50调到200)。如果AGV过于“胆小”,在狭窄通道口犹豫不决,可以适当调低。feasibility_check_no_poses:局部规划器会向前预览未来几个位姿是否在代价地图中“可行”。增加这个值可以让规划更“远视”,但计算量也会增大。对于速度较快的AGV,需要适当增加。- 实测经验:参数调优没有银弹,必须在实际环境或高保真仿真中反复测试。记录下AGV在不同场景(直道、弯道、狭窄通道、动态障碍物)下的行为,然后有针对性地调整1-2个参数,观察变化。
3.3 坐标变换(TF)树:看不见的骨架
TF树是ROS中描述所有坐标系(frame)相对关系的系统。一个正确、稳定、无断链的TF树是导航成功的绝对前提。常见的坐标系有:
map: 全局地图坐标系,由SLAM模块发布,是静止的。odom: 里程计坐标系。它是一个随时间漂移的坐标系,但短期内是准确的。SLAM会发布一个从map到odom的静态变换(实际上是通过/tf话题动态发布),来修正这种漂移。base_link: 机器人底盘中心坐标系。laser: 激光雷达坐标系。
你需要通过robot_state_publisher或静态变换发布器 (static_transform_publisher),正确发布base_link到laser、base_link到imu等传感器之间的固定变换关系。使用rosrun tf view_frames可以生成TF树的PDF图,这是排查坐标系问题的第一利器。
致命坑点:如果
/odom话题的发布频率不稳定,或者其header.frame_id设置错误,会导致TF树出现“Lookup would require extrapolation into the future/past”错误,导航将完全瘫痪。务必确保里程计节点以稳定频率(至少10Hz)发布正确的/odom消息。
4. 从仿真到实车:完整实现流程
理论说得再多,不如动手跑一遍。我们遵循“仿真先行,实车验证”的稳健流程。
4.1 步骤一:搭建仿真环境与验证模型
创建ROS工作空间与功能包:
mkdir -p ~/agv_ws/src cd ~/agv_ws/src catkin_init_workspace git clone <你的AGV模型与仿真代码仓库> # 或手动创建 cd .. catkin_make source devel/setup.bash编写URDF机器人模型:在功能包的
urdf文件夹下,创建一个.xacro文件(例如agv.xacro),用XML语法描述你的AGV:底盘形状、轮子位置与关节类型(连续旋转关节)、激光雷达和IMU的链接(link)与关节(joint)。务必精确指定雷达相对于底盘中心的偏移(x, y, z, roll, pitch, yaw)。<link name="laser"> <visual>...</visual> <collision>...</collision> <inertial>...</inertial> </link> <joint name="laser_joint" type="fixed"> <parent link="base_link"/> <child link="laser"/> <origin xyz="0.2 0 0.15" rpy="0 0 0"/> <!-- 雷达安装位置 --> </joint>创建Gazebo世界与启动文件:在
launch文件夹下创建simulation.launch文件。这个文件要依次启动:Gazebo空世界(或加载一个仓库模型)、将URDF模型生成到Gazebo中、加载机器人关节控制器、发布机器人状态到TF、启动一个虚拟激光雷达的Gazebo插件。<launch> <!-- 启动Gazebo --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(find your_pkg)/worlds/warehouse.world"/> </include> <!-- 加载机器人模型到参数服务器 --> <param name="robot_description" command="$(find xacro)/xacro '$(find your_pkg)/urdf/agv.xacro'" /> <!-- 在Gazebo中生成机器人 --> <node name="spawn_model" pkg="gazebo_ros" type="spawn_model" args="-urdf -model agv -param robot_description -x 0 -y 0 -z 0.1" /> <!-- 启动机器人状态发布器 --> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" /> <!-- 启动虚拟激光雷达数据发布 --> <node name="laser_node" pkg="gazebo_ros" type="gazebo_ros_laser" ... /> </launch>运行
roslaunch your_pkg simulation.launch,你应该能在Gazebo里看到你的AGV模型,并使用rostopic echo /scan看到激光数据。
4.2 步骤二:仿真环境下的SLAM建图与导航测试
启动SLAM建图:新开一个终端,启动cartographer。
roslaunch cartographer_ros demo_agv_2d.launch同时,启动Rviz可视化工具,添加
LaserScan、Map和TF等显示项。在Gazebo中用键盘控制(rosrun teleop_twist_keyboard teleop_twist_keyboard.py)驾驶你的虚拟AGV走遍整个仿真环境。你会看到Rviz中地图被一点点绘制出来。保存地图:建图完成后,使用cartographer的工具保存地图。
rosrun map_server map_saver -f ~/my_warehouse_map这会生成
my_warehouse_map.pgm(地图图像)和my_warehouse_map.yaml(地图元数据)两个文件。测试导航:
- 修改启动文件,将cartographer节点改为纯定位模式,并加载刚才保存的
.pbstream地图文件。 - 启动
move_base节点,并加载你调优好的参数配置文件。 - 在Rviz中,使用“2D Pose Estimate”工具告诉机器人它的初始位置(点击地图对应位置并拖拽方向),然后使用“2D Nav Goal”工具点击目标点。
- 观察AGV是否能够规划出路径(绿色线),并平滑、安全地行驶到目标点。在仿真中,你可以故意加入一些动态障碍物(在Gazebo中放置移动的方块),测试局部避障功能。
- 修改启动文件,将cartographer节点改为纯定位模式,并加载刚才保存的
4.3 步骤三:实车部署与标定
仿真通过后,才是真正的挑战。
硬件系统集成:将工控机、激光雷达、电机驱动器等物理连接好。确保所有设备供电稳定,特别是激光雷达,电压不稳会导致点云抖动。为工控机配置稳定的Wi-Fi或以太网连接,方便远程SSH调试。
驱动与通信:
- 雷达驱动:根据雷达型号,安装对应的ROS驱动包。确保
/scan话题能正常发布,并使用rviz查看点云是否正常,检查是否有大量噪点或扇形缺失。 - 底盘驱动:编写或使用现有的串口/CAN节点,订阅
/cmd_vel(类型:geometry_msgs/Twist),将其解析为左右轮速指令下发给电机控制器。同时,从电机编码器读取脉冲数,计算并发布/odom话题(类型:nav_msgs/Odometry)。这里的关键是精确测量轮间距和轮子半径,任何误差都会导致里程计累积误差剧增。
- 雷达驱动:根据雷达型号,安装对应的ROS驱动包。确保
传感器标定——成败的关键:
- 雷达外参标定:你需要精确知道雷达中心在
base_link坐标系下的位置和朝向。一个粗略的方法是测量,但更准确的方法是手动标定。将AGV放在一个墙角,在Rviz中观察激光扫描线是否与地图中的两面墙完美重合。如果不重合,调整static_transform_publisher中的参数,直到在所有角度下扫描线都与真实环境特征对齐。 - 里程计标定:这是减少SLAM漂移的核心。让AGV在空旷地走一个边长为L的正方形。记录下发的速度指令和实际轨迹。如果它走出的不是一个闭合的正方形,说明左右轮速有偏差或轮间距不准。通过修改底盘驱动节点中的轮距参数和左右轮速补偿系数来反复校准,直到它能走出一个尽可能闭合的正方形。
- 雷达外参标定:你需要精确知道雷达中心在
实车建图与导航:
- 将仿真中验证过的SLAM和导航launch文件与参数,移植到实车上。首次建图时,务必慢速、匀速地驾驶AGV,确保激光数据质量。
- 实车导航时,第一个命令永远是“2D Pose Estimate”进行初始定位。定位准确后,再发送目标点。
- 准备好紧急停止的物理开关或遥控器,安全第一。
5. 典型问题排查与调优实录
即使按照步骤操作,你也一定会遇到各种问题。下面是我在多个项目中总结的“排坑指南”。
5.1 SLAM建图常见问题
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
| 地图严重重影或错位 | 1. 里程计数据不准或噪声大。 2. 雷达外参标定错误。 3. 机器人运动过快,激光数据失真。 | 1.首要检查/odom:用rostopic echo /odom查看位置变化是否平滑,在直线行驶时,pose.pose.position.x应线性增长,y应接近0。如果跳跃,检查编码器接线和计算程序。2.复查TF树: rosrun tf view_frames,确认base_link->laser的变换正确且稳定。3. 降低建图时的移动速度。 |
| 地图出现“拉丝”或“鬼影” | 1. 雷达面对玻璃、镜面、深色吸光物体。 2. 环境中存在大量动态物体(如走动的人)。 | 1. 这是硬件局限,考虑更换雷达安装位置或使用抗干扰能力更强的雷达。 2. 在SLAM配置中,可以尝试启用 TRAJECTORY_BUILDER_2D.motion_filter,过滤掉过于相似的连续帧,减少动态物体影响。 |
| 在长走廊中地图弯曲 | “走廊病”,特征不足导致在走廊方向约束弱。 | 1.融合IMU:在cartographer配置中启用use_imu_data = true,并提供高质量的/imu话题数据。2.增加人为特征:在走廊中放置一些独特的、低矮的障碍物(如锥桶)。 3.调优SLAM参数:提高 rotation_weight,让优化更信任旋转约束。 |
5.2 导航规划与避障故障
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
| AGV在目标点附近“震荡”或旋转不停 | 1. 目标点容差设置过小。 2. 局部规划器到达目标点的朝向与全局路径终点朝向不一致。 3. 控制器精度问题。 | 1. 检查move_base的xy_goal_tolerance和yaw_goal_tolerance参数,适当调大(如0.1米,0.1弧度)。2. 对于 teb_local_planner,设置global_plan_overwrite_orientation: true。3. 检查底盘控制器是否精确执行了低速指令。 |
| AGV在狭窄通道口“卡住”,不前进 | 1. 机器人轮廓(footprint)设置过大。2. 代价地图膨胀半径( inflation_radius)过大。3. 局部规划器找不到可行轨迹。 | 1. 在costmap_common_params.yaml中精确设置footprint点列表,确保是底盘的实际凸包轮廓。2. 适当减小 inflation_radius,但不要太小,需留出安全余量。3. 尝试调低 weight_obstacle,或增加max_vel_x让规划器有更多速度选择空间。 |
| 规划路径穿过已知障碍物 | 全局代价地图未正确加载静态地图。 | 1. 检查global_costmap的static_layer的map_topic是否指向正确的/map话题。2. 在Rviz中查看 global_costmap话题,确认障碍物信息已被正确叠加到地图上。 |
| 遇到动态障碍物反应迟钝或撞上 | 1. 局部代价地图更新频率低。 2. 激光雷达扫描频率低。 3. 机器人惯性大,刹车距离长。 | 1. 提高local_costmap的update_frequency(如到10Hz)。2. 确保激光 /scan话题频率(rostopic hz /scan)足够高(>5Hz)。3. 在 local_planner中调高acc_lim_x(负值为减速度限制),并调高weight_obstacle。 |
5.3 系统性能与稳定性优化
CPU占用过高:SLAM和路径规划都是计算密集型任务。使用
htop命令监控。如果cartographer节点占用过高,可以尝试降低TRAJECTORY_BUILDER_2D.submaps.num_range_data或提高POSE_GRAPH.optimize_every_n_nodes(优化频率)。对于move_base,可以降低全局/局部代价地图的分辨率(resolution参数,如从0.05调到0.1),代价是规划精度下降。TF树警告或错误:这是最令人头疼的问题之一。除了检查硬件数据频率,还要确保所有
transform的发布时间戳(header.stamp)是同步的。可以使用rosrun tf tf_monitor监控TF延迟。一个常见的技巧是使用message_filters库中的ApproximateTime策略来同步订阅多个传感器话题,确保输入到算法中的数据在时间上是对齐的。地图管理:对于大型仓库,一张全景地图可能非常大且笨重。可以考虑使用
multimap_server或cartographer的trajectory概念,进行分区域建图和定位。在导航时,根据AGV的大致位置加载相应的子地图。
从一行代码到一个能在真实仓库中自主运行的AGV,这个过程充满了挑战,但每一步问题的解决都让人收获巨大。我个人最深的体会是,仿真可以解决70%的逻辑和算法问题,但剩下的30%的“魔鬼细节”——如传感器噪声、机械误差、通信延迟、环境干扰——必须在实车上反复调试和磨合才能解决。不要指望有一套放之四海而皆准的参数,最好的参数永远是在你的特定AGV、特定传感器、特定运行环境中调试出来的。多观察Rviz中的可视化信息,多记录运行日志,养成科学排查问题的习惯,你会发现自己对机器人系统的理解在不断加深。最后,安全绳和急停开关永远是实车测试时的第一道,也是最后一道保险。
本文还有配套的精品资源,点击获取