1. 从地图到导航:理解自主导航的完整闭环
上一节我们成功让小车在房间里跑了一圈,用gmapping建出了一张漂亮的二维栅格地图。看着Rviz里逐渐清晰的墙壁轮廓和空旷的走廊,是不是很有成就感?但这只是第一步。地图建好了,就像我们手里有了一张精确的纸质地图,但想让小车自己看懂这张地图,并且能像老司机一样,从A点出发,绕过路上的椅子和箱子,安全到达B点,这才是真正的挑战,也是我们这一节要解决的核心问题。
这个过程,在机器人学里叫做“自主导航”。听起来很高大上,其实拆解开来,就是三个核心步骤:定位、规划、控制。我打个比方你就明白了:假设你是一个外卖小哥(机器人),要去一个陌生小区(仿真环境)送餐。
- 定位:你得先知道自己在地图上的哪个位置,是站在3号楼门口,还是5号楼的拐角。这就是amcl要干的活——自适应蒙特卡洛定位。它通过对比机器人身上的激光雷达“看到”的周围环境(比如距离左边墙壁3米,前面5米有个柱子),和手中地图上标记的环境特征,来反复猜测并确定自己最可能在地图上的哪个点。这个过程就像你在小区里,对照手机地图和周围的楼栋样子,来确定自己的位置。
- 规划:知道了自己在哪(A点),也知道了顾客家在哪(B点),接下来就要规划一条走过去的路。这条路最好又短又快,还不能撞到花坛、汽车和遛狗的大爷。在ROS里,这通常由一个全局规划器(比如
navfn或global_planner)来负责,它根据地图的全局信息,规划出一条从起点到终点的粗略路径,就像地图APP给你规划的行车路线。 - 控制:路线有了,但实际走起来,路上可能突然出现一个玩耍的小孩(动态障碍物),或者你发现规划的路线中间有个水坑。这时你需要实时调整步伐,进行微操避让。这就是本地规划器(比如我们这节要用的teb_local_planner)的工作。它只关心机器人前方一小段距离内的环境,根据实时传感器信息(激光雷达),对全局路径进行“局部修正”,生成当前时刻最合适的速度和转向指令,让机器人平滑、安全地沿着大方向前进。
所以,我们这一节的目标,就是为我们的阿克曼小车,搭建起这套“眼睛”(定位)、“大脑”(规划)和“手脚”(控制)的协同系统。我会带你一步步启动导航功能包,配置关键的定位和规划参数,并最终在Gazebo的仿真房间里,亲眼看着小车完成一次从“茫然”到“自主”的华丽转身。准备好了吗?让我们开始吧。
2. 启动导航核心:amcl定位与move_base框架
要让小车动起来,我们得先把导航的“大脑”和“眼睛”启动起来。在ROS中,这一切的核心是一个叫做 move_base 的节点。你可以把它理解为一个导航调度中心,它整合了定位(amcl)、全局规划、本地规划、代价地图等所有模块。我们的工作,就是为这个调度中心提供正确的“工作手册”(配置文件)。
2.1 创建并配置导航启动文件
首先,我们需要创建一个启动文件,把amcl和move_base都跑起来。在你的机器人功能包(比如racebot_navigation)的launch文件夹下,新建一个文件,命名为amcl_teb_navigation.launch。
<?xml version="1.0"?>
<launch>
<!-- 启动AMCL定位节点 -->
<node pkg="amcl" type="amcl" name="amcl" output="screen">
<!-- 加载AMCL参数,参数文件我们稍后创建 -->
<rosparam file="$(find racebot_navigation)/params/amcl_params.yaml" command="load" />
<!-- 设置初始位置,这里我们先设为默认值,可以在Rviz里用“2D Pose Estimate”工具手动指定 -->
<param name="initial_pose_x" value="0.0"/>
<param name="initial_pose_y" value="0.0"/>
<param name="initial_pose_a" value="0.0"/>
</node>
<!-- 启动move_base导航框架 -->
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<!-- 加载全局规划器参数 -->
<rosparam file="$(find racebot_navigation)/params/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find racebot_navigation)/params/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find racebot_navigation)/params/local_costmap_params.yaml" command="load" />
<rosparam file="$(find racebot_navigation)/params/global_costmap_params.yaml" command="load" />
<!-- 加载全局和本地规划器参数,这里指定使用teb作为本地规划器 -->
<rosparam file="$(find racebot_navigation)/params/global_planner_params.yaml" command="load" />
<rosparam file="$(find racebot_navigation)/params/teb_local_planner_params.yaml" command="load" />
<!-- 明确指定规划器插件,这是关键! -->
<param name="base_global_planner" value="global_planner

&spm=1001.2101.3001.5002&articleId=151237781&d=1&t=3&u=4c2d9583f4be4016b7e7698f83551e21)
2287

被折叠的 条评论
为什么被折叠?



