尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

ROS机器人自主导航实战:从定位、建图到路径规划全链路解析

ROS机器人自主导航实战:从定位、建图到路径规划全链路解析 在实际机器人开发中自主导航是衡量一个机器人系统是否“智能”的核心能力。它要求机器人能够回答“我在哪”定位、“周围环境什么样”建图以及“我该怎么去那里”路径规划这三个基本问题。ROSRobot Operating System作为机器人领域的“事实标准”框架为开发者提供了实现这一复杂功能的完整工具箱。然而面对amcl、gmapping、move_base等众多功能包以及它们之间复杂的参数配置和消息交互新手往往感到无从下手即使跑通了官方教程一旦应用到自己的机器人上也常常遇到定位丢失、地图漂移、规划失败等问题。本文将以《ROS机器人程序设计》第七章的核心思想为蓝本结合一线工程实践为你拆解ROS自主导航的完整实现链路。我们将从零开始搭建一个仿真环境逐步实现定位、建图与路径规划并深入每个环节的关键配置与排错逻辑。无论你是正在学习ROS的学生还是希望将导航功能集成到实体机器人的开发者通过本文的步骤你将能构建一个可运行、可调试、可扩展的自主导航系统原型并掌握排查常见问题的系统性方法。1. 理解ROS导航框架的核心组件与数据流在动手写代码或改配置之前必须厘清ROS导航栈Navigation Stack中各组件的职责和数据流向。这能帮助你在出现问题时快速定位是哪个环节出了差错。1.1 导航栈的经典架构move_base 及其插件ROS Noetic及更早版本中导航的核心是move_base功能包。它本身不执行具体的算法而是一个协调器通过加载不同的插件Plugin来完成全局规划、局部规划、恢复行为等任务。全局代价地图Global Costmap基于已有的静态地图如SLAM建图所得生成标识了全局的可行区域Free、障碍区域Lethal和未知区域Unknown。全局路径规划器基于此地图工作。局部代价地图Local Costmap一个围绕机器人、持续更新的小窗口地图。它融合了静态地图的障碍信息以及传感器如激光雷达实时探测到的动态障碍物。局部路径规划器和恢复行为基于此地图工作。全局规划器Global Planner负责计算从起点到终点的粗略路径。常见的实现是navfn或global_planner它们使用 Dijkstra 或 A* 等搜索算法在全局代价地图上寻找最优路径。局部规划器Local Planner负责跟随全局路径并实时避开动态障碍物。最常用的是dwa_local_plannerDynamic Window Approach或teb_local_plannerTimed Elastic Band。它们根据机器人的运动学模型和局部代价地图计算出下一时刻的速度指令geometry_msgs/Twist。恢复行为Recovery Behaviors当机器人被困住例如被障碍物包围时move_base会触发一系列恢复行为如原地旋转、清除局部代价地图等试图让机器人摆脱困境。这些组件通过ROS的参数服务器Parameter Server进行配置并通过插件机制动态加载。理解这一点至关重要你对导航的调参绝大部分是在修改这些插件的参数。1.2 不可或缺的支撑TF、传感器与里程计导航栈的正常运转严重依赖几个基础且关键的数据流TFTransform系统这是ROS中管理坐标系关系的框架。导航要求一个完整的TF树至少包含map-odom-base_link-sensor_frame的变换关系。map世界固定坐标系地图的原点。odom里程计坐标系由轮式编码器等积分得到随时间漂移但短期精确。base_link机器人基座坐标系。sensor_frame传感器如激光雷达、相机的安装坐标系。关键点map到odom的变换通常由定位节点如amcl发布它修正了里程计的累积漂移将机器人定位在地图中。如果TF树断裂或时序错误导航将立即失效。传感器数据Sensor Sources主要是激光雷达LaserScan或点云PointCloud2数据。这些数据被送入move_base用于更新局部代价地图实现实时避障。数据必须发布到约定的Topic如/scan。里程计Odometry提供机器人的位姿估计nav_msgs/Odometry消息通常发布在/odom话题和速度反馈。move_base用其来评估局部规划器的控制效果并进行闭环控制。下图概括了核心数据流与组件关系静态地图 (.pgm/.yaml) | v [ 全局代价地图 ] --- 传感器数据 (/scan) | | v v [全局规划器] [局部代价地图] | | v v 全局路径 (/plan) [局部规划器] | | --------- [move_base] --- | v 速度指令 (/cmd_vel) | v [机器人底盘] | v 里程计 (/odom) TF | v [定位节点 (如amcl)] | v TF (map-odom)一个常见的误区是认为启动了move_base和amcl就能导航。实际上必须先确保TF树正确、传感器数据正常、里程计数据准确否则上层导航如同空中楼阁。接下来的环境准备将首先搭建一个能提供这些基础数据的仿真环境。2. 环境准备搭建包含机器人与传感器的Gazebo仿真世界我们选择在仿真中完成所有实践因为它可重复、无硬件损坏风险且能模拟各种场景。这里使用经典的TurtleBot3 Waffle Pi模型它集成了激光雷达和差速驱动底盘。2.1 安装ROS与必要功能包假设你已安装ROS Noetic桌面版。接下来安装仿真相关的包# 设置ROS软件源如果尚未设置 sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update # 安装TurtleBot3仿真包、导航包及依赖 sudo apt install ros-noetic-turtlebot3-simulations ros-noetic-turtlebot3-navigation ros-noetic-gmapping ros-noetic-amcl ros-noetic-move-base ros-noetic-dwa-local-planner # 安装rviz用于可视化 sudo apt install ros-noetic-rviz # 设置TurtleBot3模型类型每次打开新终端都需要设置或写入~/.bashrc echo export TURTLEBOT3_MODELwaffle_pi ~/.bashrc source ~/.bashrc2.2 启动Gazebo仿真环境与机器人我们创建一个简单的世界里面有一些墙壁和障碍物用于后续的建图和导航测试。# 启动Gazebo空世界并加载TurtleBot3 roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch启动后Gazebo界面会出现一个TurtleBot3机器人。此时关键的ROS话题已经发布/scan激光雷达数据。/odom里程计数据。/tfTF变换树由robot_state_publisher和Gazebo插件发布。验证基础数据流 打开一个新终端使用以下命令检查# 查看TF树是否完整 rosrun tf view_frames # 生成一个pdf文件frames.pdf用文档查看器打开检查是否有map-odom-base_link-...的链条。 # 注意此时还没有amcl所以map-odom的变换是缺失的这是正常的。 # 查看激光数据 rostopic echo /scan -n 1 # 应能看到包含ranges距离数组等字段的消息。 # 查看里程计数据 rostopic echo /odom -n 1 # 应能看到包含位姿pose和速度twist的消息。2.3 在Rviz中可视化机器人模型与传感器数据Rviz是ROS的3D可视化工具是调试导航的“眼睛”。# 新终端中启动Rviz并加载一个为TurtleBot3配置好的视图 roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch在Rviz中你需要添加并配置几个关键的显示类型DisplayRobotModel显示机器人URDF模型。TF显示坐标系检查箭头是否正确。LaserScanTopic设为/scan看到激光扫描线。Map稍后建图时使用Topic设为/map。确保在Rviz中能看到机器人模型和红色的激光扫描点。如果激光点位置不对比如出现在机器人内部或地面以下说明TF中传感器坐标系base_scan到base_link的变换不正确需要检查URDF或仿真模型。对于TurtleBot3官方模型已配置正确。至此一个能提供里程计、传感器数据和TF的仿真机器人环境就准备好了。接下来我们将解决“周围环境什么样”的问题——建图。3. 实战建图使用gmapping创建环境地图建图Mapping是构建环境空间表示的过程。gmapping是ROS中一个基于激光雷达的2D SLAM同步定位与建图算法实现。它通过在机器人移动过程中匹配连续的激光扫描帧同时估计机器人位姿定位和构建栅格地图建图。3.1 启动gmapping节点并控制机器人探索建图需要机器人移动以覆盖环境。我们通常通过键盘遥控teleop来控制机器人行走。# 终端1: 保持Gazebo运行 # 终端2: 启动gmapping节点 roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:gmapping # 终端3: 启动键盘遥控节点 roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch现在你可以在终端3中按键盘方向键控制机器人移动。同时在Rviz中之前已启动添加一个Map显示Topic设为/map。你应该能看到随着机器人移动灰色未知、黑色障碍、白色空闲的地图被逐渐绘制出来。3.2 关键参数解析与地图保存gmapping有许多参数影响建图质量。常见的调参位置在启动文件turtlebot3_slam.launch或它包含的gmapping.launch.xml中。几个关键参数delta地图的分辨率米/像素例如0.05表示一个像素代表5厘米。值越小地图越精细但计算量越大。maxUrange激光雷达的最大可用范围。应设置为略小于传感器物理最大范围以过滤噪声。particles粒子滤波器中粒子的数量。增加粒子数可以提高定位精度但会显著增加CPU负载。室内环境通常30-100即可。map_update_interval地图更新的时间间隔。值越小地图更新越频繁但计算更密集。建图技巧控制机器人缓慢、平稳地移动尽量让激光雷达扫描到所有区域特别是角落。尝试走“弓”字形路线确保区域覆盖。当机器人回到起点时观察地图是否闭合loop closure这是检验SLAM算法是否有效纠正漂移的关键。保存地图 当建图满意后使用map_server包提供的工具保存地图。# 在希望保存的目录下执行 rosrun map_server map_saver -f my_office_map这将生成两个文件my_office_map.pgm地图图像和my_office_map.yaml地图元数据文件。yaml文件内容类似image: my_office_map.pgm resolution: 0.050000 origin: [-10.000000, -10.000000, 0.0] negate: 0 occupied_thresh: 0.65 free_thresh: 0.196origin参数很重要它定义了地图左下角像素在map坐标系中的坐标。后续导航加载地图时需要它。3.3 建图阶段的常见问题与排查问题现象可能原因检查与解决方式Rviz中地图不更新或全是灰色1./scan话题数据未收到或格式不对。2. TF树错误特别是base_link到base_scan的变换。3.gmapping节点启动参数错误如maxUrange设置过小。1.rostopic echo /scan检查数据。2.rosrun tf view_frames检查TF树rosrun tf tf_echo base_link base_scan检查具体变换。3. 检查启动文件参数确保maxUrange大于0且小于激光最大量程。地图严重漂移或扭曲1. 里程计数据不准Gazebo仿真中通常准确实体机器人需校准。2. 机器人移动过快激光数据匹配失败。3.gmapping的particles参数设置过小。1. 控制机器人慢速移动。2. 适当增加particles数量如从30增至80。3. 确保环境有足够的特征如墙壁、家具角点供算法匹配。保存的地图在Rviz中显示方向不对map_saver保存时机器人的朝向决定了地图的“上”方向。建图完成后让机器人回到一个标准朝向例如让机器人正对地图的“北”向再保存。或者在加载地图后通过修改yaml文件的origin和旋转来调整。完成建图并保存好地图文件后我们就拥有了导航所需的静态地图。接下来进入定位环节。4. 实现定位使用amcl在已知地图中估计机器人位姿在已知地图中回答“我在哪”的问题即定位Localization。ROS中常用的是自适应蒙特卡洛定位AMCL算法。amcl节点接收激光观测数据、里程计数据以及已知地图通过粒子滤波来估计机器人在map坐标系下的位姿并发布map到odom的TF变换。4.1 加载已有地图并启动amcl首先关闭之前的gmapping和teleop节点在对应终端按CtrlC。确保Gazebo和Rviz仍在运行。# 终端1: Gazebo (仍在运行) # 终端2: Rviz (仍在运行) # 终端3: 加载已保存的地图 rosrun map_server map_server /path/to/your/map/my_office_map.yaml # 请将 /path/to/your/map/ 替换为你的地图文件实际路径。 # 终端4: 启动amcl节点 roslaunch turtlebot3_navigation turtlebot3_amcl.launch # 或者使用更通用的启动方式并指定初始位姿可选 # roslaunch amcl amcl_diff.launch map:/path/to/your/map/my_office_map.yaml initial_pose_x:0.0 initial_pose_y:0.0 initial_pose_a:0.0启动后在Rviz中你应该能看到加载的静态地图。同时amcl会发布许多粒子在Rviz中添加PoseArray显示Topic设为/particlecloud这些粒子代表了机器人位姿的可能分布。4.2 初始化位姿与参数调优刚启动时粒子可能分散在地图各处。你需要通过Rviz的“2D Pose Estimate”工具告诉amcl机器人大概在哪里。在Rviz顶部工具栏点击“2D Pose Estimate”。在地图上机器人实际所在的大概位置点击并拖拽设定一个方向箭头。松开鼠标后你会看到粒子迅速收敛到你所指定的位置附近。关键参数调优amcl的参数极大影响定位精度和速度。主要配置文件通常位于/opt/ros/noetic/share/amcl/params/amcl_params.yaml或启动文件内嵌。需要关注的参数包括粒子数量(min_particles,max_particles)粒子越多定位越准但计算越慢。初始定位或丢失后需要更多粒子稳定跟踪时可减少。典型值min_particles: 100,max_particles: 5000。激光模型参数(laser_model_type,laser_likelihood_max_dist)指定如何计算激光观测的概率。likelihood_field是常用模型。laser_likelihood_max_dist设置激光匹配的最大距离超出此距离的观测被视为无效有助于处理动态障碍物。里程计模型参数(odom_model_type)对于差速机器人使用diff对于全向或阿克曼转向机器人使用omni。错误设置会导致粒子发散。恢复性参数(recovery_alpha_slow,recovery_alpha_fast)当定位置信度下降时amcl会注入随机粒子以重定位。这两个参数控制慢速和快速平均权重滤波器用于检测定位失败。一般保持默认即可。4.3 定位失败与重定位如果机器人被搬动“绑架”问题或长时间运动后累积误差过大定位可能失败粒子发散。此时需要手动重定位再次使用Rviz的“2D Pose Estimate”工具在地图上指出机器人最可能的位置。观察粒子是否快速收敛。如果收敛很慢或无法收敛可能是以下原因地图与真实环境不符环境发生了变化如门开关、椅子移动而地图未更新。激光数据异常传感器被遮挡或数据噪声太大。参数过于激进如update_min_d位移更新阈值和update_min_a角度更新阈值设置过大导致amcl不更新粒子。一个良好的定位系统应该能在机器人正常移动时保持粒子聚集在轻微遮挡后能自我恢复。接下来我们将整合定位与地图启动完整的导航栈。5. 整合与路径规划配置并运行move_base现在我们有了地图map_server和定位amcl可以启动move_base来接管机器人的运动控制实现自主导航。5.1 启动move_base节点TurtleBot3提供了整合的导航启动文件。如果你使用自定义机器人则需要编写自己的move_base启动文件。这里我们使用官方配置。# 确保以下节点都在运行 # 终端1: Gazebo (仿真环境) # 终端2: Rviz (可视化) # 终端3: map_server (加载地图) # 终端4: amcl (定位) # 终端5: 启动move_base roslaunch turtlebot3_navigation turtlebot3_navigation.launch # 这个启动文件会加载move_base及其所有插件的参数配置文件。启动后在Rviz中你需要添加几个关键的显示来监控导航状态Global Plan(Topic:/move_base/GlobalPlanner/plan)显示全局规划器计算出的路径绿色。Local Plan(Topic:/move_base/DWAPlannerROS/local_plan)显示局部规划器计算的轨迹红色。Planner Clouds(Topic:/move_base/DWAPlannerROS/global_costmap/obstacle_layer_footprint/obstacles等)显示代价地图中的障碍物信息。Costmap(Topics:/move_base/global_costmap/costmap和/move_base/local_costmap/costmap)分别显示全局和局部代价地图。5.2 发送导航目标与理解规划过程在Rviz中使用“2D Nav Goal”工具点击工具栏的“2D Nav Goal”。在地图上任意一个空闲白色区域点击并拖拽设定目标位置和朝向箭头。松开鼠标后你应该立即看到一条绿色的全局路径从机器人当前位置连接到目标点。一条红色的局部轨迹从机器人当前位置延伸出一小段。机器人开始自主移动红色轨迹不断更新引导机器人沿绿色路径前进并避开实时障碍物。这个过程发生了什么目标发布Rviz工具向/move_base_simple/goal话题发布了一个PoseStamped消息。全局规划move_base收到目标全局规划器在全局代价地图上从机器人当前位置由amcl提供map-base_link的变换间接得到搜索一条到达目标的路径。局部控制局部规划器接收全局路径结合局部代价地图包含静态障碍和实时激光数据和机器人当前速度来自/odom计算出下一时刻的线速度和角速度cmd_vel。执行与反馈速度指令通过/cmd_vel话题发送给Gazebo中的机器人模型或真实机器人底层驱动机器人开始运动。里程计反馈新的位姿amcl利用激光数据修正位姿move_base根据新的位姿重新进行局部规划形成闭环。5.3 核心参数配置详解以DWA局部规划器为例导航的性能和表现几乎完全由参数决定。move_base的参数配置文件通常位于/opt/ros/noetic/share/turtlebot3_navigation/param/或类似目录。主要分为以下几类1. 代价地图通用参数 (costmap_common_params.yaml)obstacle_layer: observation_sources: scan # 指定传感器源 scan: {data_type: LaserScan, topic: /scan, marking: true, clearing: true} inflation_radius: 0.55 # 膨胀半径将障碍物膨胀以防止碰撞 cost_scaling_factor: 10.0 # 成本缩放因子inflation_radius至关重要。它会在障碍物周围产生一个“成本场”距离障碍物越近成本越高。局部规划器会避开高成本区域。设置过小会导致机器人擦碰障碍物过大会导致机器人无法通过狭窄通道。2. 全局代价地图参数 (global_costmap_params.yaml)global_frame: map # 全局坐标系 robot_base_frame: base_link # 机器人基座坐标系 update_frequency: 1.0 # 更新频率通常较低 publish_frequency: 0.5 # 发布频率 static_map: true # 使用静态地图 rolling_window: false # 不使用滚动窗口全局地图固定3. 局部代价地图参数 (local_costmap_params.yaml)global_frame: odom # 注意局部代价地图通常基于odom坐标系 robot_base_frame: base_link update_frequency: 5.0 # 更新频率需要更高以应对动态障碍物 publish_frequency: 2.0 static_map: false # 不使用静态地图仅依赖实时传感器 rolling_window: true # 使用滚动窗口始终以机器人为中心 width: 6.0 # 窗口宽度米 height: 6.0 # 窗口高度米4. DWA局部规划器参数 (dwa_local_planner_params.yaml) 这是调参最密集的地方直接影响机器人运动“性格”。# 速度限制 max_vel_x: 0.22 # 最大前进速度 (m/s) min_vel_x: -0.22 # 最大后退速度 max_vel_theta: 2.75 # 最大旋转速度 (rad/s) min_vel_theta: -2.75 acc_lim_x: 2.5 # 线加速度限制 acc_lim_theta: 3.2 # 角加速度限制 # 目标容差 xy_goal_tolerance: 0.05 # 到达目标点的位置容差 (米) yaw_goal_tolerance: 0.17 # 到达目标点的角度容差 (弧度) # 轨迹评分权重 (调整机器人行为偏好) path_distance_bias: 32.0 # 贴近全局路径的权重 goal_distance_bias: 24.0 # 朝向目标的权重 occdist_scale: 0.01 # 避开障碍物的权重 # 采样窗口 vx_samples: 20 # 线速度采样数 vtheta_samples: 40 # 角速度采样数 sim_time: 1.5 # 模拟轨迹的时间长度 (秒)sim_time局部规划器会模拟未来一段时间内多种速度组合下的轨迹并选择最优的一条。此值越大规划越“前瞻”但计算量也越大。在狭窄空间或高速场景下需要仔细调整。权重参数调整path_distance_bias和goal_distance_bias可以改变机器人是更严格地跟随路径还是更直接地冲向目标。当机器人在拐角处犹豫不决或频繁撞击内角时需要调整这些参数。5.4 导航中的常见故障与排查清单导航失败的表现多种多样以下是系统性的排查思路阶段问题现象排查步骤全局规划失败Rviz中不显示绿色全局路径。1.检查目标点是否设置在空闲白色区域黑色障碍或灰色未知区域无法规划。2.检查全局代价地图在Rviz中查看全局代价地图确认机器人当前位置和目标点是否都在白色区域。地图可能有未更新的障碍物。3.检查TFrosrun tf tf_echo map base_link确认amcl提供了正确的定位。如果输出“Lookup would require extrapolation into the past”等错误说明TF时间戳不同步或数据缺失。4.检查全局规划器日志rostopic echo /move_base/GlobalPlanner/plan查看是否有规划输出或查看rosout日志。局部规划失败/机器人不动有绿色全局路径但红色局部轨迹很短或没有机器人不动。1.检查/cmd_velrostopic echo /cmd_vel查看move_base是否发布了速度指令。如果没有问题在规划器如果有问题在底层执行。2.检查局部代价地图在Rviz中查看局部代价地图确认机器人前方是否被实时传感器数据标记为障碍可能是误报。3.检查DWA参数sim_time是否过短inflation_radius是否过大导致所有方向成本都高速度限制max_vel_x是否为04.检查恢复行为机器人可能触发了恢复行为并卡住。查看/move_base/current_goal和/move_base/status。机器人行为怪异剧烈震荡、绕远路、撞到障碍物。1.调整DWA权重增加path_distance_bias使其更贴路径增加goal_distance_bias使其更直奔目标增加occdist_scale使其更远离障碍物。2.检查传感器数据激光数据是否有大量噪声或固定盲区在Rviz中观察/scan是否平滑。3.检查里程计rostopic echo /odom查看速度反馈是否准确。不准确的里程计会导致控制环路不稳定。4.降低速度先调低max_vel_x和max_vel_theta确保能稳定运行再逐步提高。定位丢失粒子发散机器人在地图上“跳变”到错误位置。1.重定位使用“2D Pose Estimate”工具。2.检查激光匹配环境是否变化太大amcl的laser_likelihood_max_dist是否设置过小过滤了有效数据3.增加粒子数临时增加amcl的max_particles以重获定位但长期需解决环境或传感器问题。6. 从仿真到实机关键考量与最佳实践将仿真中调试好的导航系统部署到实体机器人上是最终的挑战。除了硬件驱动不同在软件层面需要关注以下要点1. 传感器标定与数据同步激光雷达确保安装位置和TF变换base_link-laser_frame在URDF中准确无误。倾斜或高度错误会导致地图扭曲。里程计标定实机里程计编码器存在误差轮子打滑、直径不准、轮距误差。必须进行标定通常通过让机器人走固定距离或固定圈数对比实际位移与里程计读数来计算误差系数。时间同步确保所有传感器数据的时间戳正确。使用message_filters进行近似时间同步避免因延迟导致的定位和建图误差。2. 地图质量是基础建图时环境应保持静止光照条件与导航时尽量一致。地图分辨率要合适。室内通常0.05m走廊等狭窄区域可考虑0.025m但会增大地图文件和计算量。保存地图后务必检查yaml文件中的origin参数确保其符合你的世界坐标系定义。3. 参数需要重新调整仿真机器人模型是理想的实机有惯性、延迟、控制误差。必须重新调参尤其是DWA规划器的速度、加速度限制以及sim_time。从保守的参数开始较低的速度较大的膨胀半径在安全环境中逐步测试和优化。4. 引入异常处理与监控外部异常在move_base外增加监控节点监听导航状态/move_base/status。如果长时间处于ABORTED或RECOVERING状态可以触发声音提示、日志记录或 fallback 行为如停止。生命周期管理使用roslaunch的respawn和required属性管理节点或使用systemd等工具确保导航栈在异常退出后能重启。5. 性能优化代价地图更新调整update_frequency和publish_frequency在实时性和CPU负载间取得平衡。传感器数据处理如果激光雷达频率很高如10Hz以上可以考虑在obstacle_layer中设置expected_update_rate和max_obstacle_height来过滤噪声和地面反射。使用更高效的规划器对于复杂环境或非完整约束机器人可以尝试teb_local_planner它通常能产生更平滑、更符合动力学的轨迹。自主导航系统的调试是一个迭代过程需要耐心地在仿真和实机间反复验证。从搭建一个能提供正确TF、里程计和传感器数据的基础机器人平台开始然后逐步集成建图、定位和路径规划模块并针对具体机器人的运动能力和环境特征精细调整参数是通往稳定可靠自主导航的必经之路。
返回列表