ROS机器人导航:从理论到实践
1. 粒子滤波与SLAM
在解决机器人相关问题时,Rao - Blackwellized粒子滤波器(RBPF)得到了广泛应用,它同时结合了粒子滤波器和卡尔曼滤波器。对于想要深入了解粒子滤波器的人,推荐参考Sebastian Thrun所著的《Probabilistic Robotics》,这本书是机器人学领域的经典教材。其相关资源可参考:
- 书籍官网:http://www.probabilistic - robotics.org/
- 相关课程:https://www.udacity.com/course/cs373
在SLAM(同步定位与地图构建)领域,OpenSLAM和gmapping是重要的研究内容。OpenSLAM.org汇集了众多开源的SLAM研究成果,是一个值得访问的网站。gmapping在ROS社区的SLAM应用中被广泛使用,有两篇相关论文分别于2005年和2007年发表,它们介绍了如何通过减少粒子数量来降低计算量,实现实时操作,主要方法就是使用上述的Rao - Blackwellized粒子滤波器。
2. 导航实践
在进行导航实践前,我们使用TurtleBot3作为移动机器人,LDS作为传感器,测量环境与之前的SLAM示例相同。接下来将使用之前SLAM示例创建的地图,让机器人移动到指定目的地。
2.1 ROS导航包
本实践使用的导航相关ROS包包括之前SLAM实践中的turtlebot3元包、导航元包中的‘move_base’、amcl和‘map_server’包。这些包在之前的SLAM部分已完成安装,下面将介绍执行方法。
2.2 执行导航
导航的执行顺序如下(以TurtleBot3 Waffle为例,若使用Burger或Waffle Pi,只需将命令中的‘TURTLEBOT3_MODEL’参数从‘waffle’改为‘burger’或‘waffle_pi’):
1.
启动roscore
:在[Remote PC]上运行roscore。
$ roscore
- 启动机器人 :在[TurtleBot]上运行‘turtlebot3_robot.launch’文件,以启动‘turtlebot3_core’和‘turtlebot3_lds’节点。
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch
-
执行导航包
:在[Remote PC]上运行‘turtlebot3_navigation.launch’文件。该包包含多个启动文件,执行时会启动以下节点以及TurtleBot3的3D模型信息:
- ‘robot_state_publisher’节点:用于在TF中发布两个轮子和关节的三维位置和方向信息。
- ‘map_server’节点:加载地图。
- AMCL(自适应蒙特卡罗定位)节点。
- ‘move_base’节点。
$ export TURTLEBOT3_MODEL=waffle
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml
- 执行RViz :运行ROS的可视化工具RViz,方便直观确认目标姿态指定和导航结果。
$ rosrun rviz rviz -d `rospack find turtlebot3_navigation`/rviz/turtlebot3_nav.rviz
运行上述命令后,在RViz的右侧地图上会看到许多绿色箭头,这些是SLAM理论中提到的粒子滤波器的粒子,机器人位于这些绿色箭头的中间。
2.3 估计初始姿态
首先要对机器人的初始姿态进行估计。在RViz菜单中按下[2D Pose Estimate],会出现一个很大的绿色箭头。将其移动到给定地图中实际机器人所在的位置,按住鼠标左键,将绿色箭头拖动到机器人前方所面对的方向。这相当于一个早期估计机器人姿态的命令。然后使用‘turtlebot3_teleop_keyboard’节点等工具让机器人前后移动,收集周围环境信息,以确定机器人在地图上的当前位置。完成此过程后,机器人会以绿色箭头指定的位置和方向作为初始姿态,估计其实际位置和方向。
2.4 设置目的地并移动机器人
一切准备就绪后,可从导航GUI尝试移动命令。在RViz菜单中按下[2D Nav Goal],会出现一个很大的绿色箭头,这是用于指定机器人目的地的标记。箭头的根部是机器人的‘x’和‘y’位置,箭头所指方向是机器人的‘theta’方向。在机器人要移动的位置点击该箭头,并拖动以设置方向。机器人会根据地图创建一条避开障碍物到达目的地的路径。
3. 导航应用
导航的目标是让机器人在给定环境中从一个位置移动到指定目的地,这需要一个包含环境中家具、物体和墙壁几何信息的地图,该地图可通过之前的SLAM过程创建。
3.1 导航流程
导航过程主要包括以下几个步骤:
|步骤|描述|
|----|----|
|感知|机器人在地图上通过编码器和惯性传感器(IMU传感器)更新里程计信息,并测量传感器姿态到障碍物(墙壁、物体、家具等)的距离。|
|定位/姿态估计|基于编码器的车轮旋转量、IMU传感器的惯性信息以及传感器到障碍物的距离信息,在之前创建的地图上对当前机器人进行定位/姿态估计。这里使用粒子滤波器定位方法和自适应蒙特卡罗定位(AMCL)。|
|运动规划|也称为路径规划,创建从当前姿态到地图上指定目标姿态的轨迹。包括整个地图的全局路径规划和机器人周围小区域的局部路径规划。使用ROS中的‘move_base’和‘nav_core’路线规划包,基于动态窗口法(DWA)这一避障算法。|
|移动/避障|根据运动规划创建的移动轨迹向机器人发出命令,机器人按规划路径移动到目的地。在移动过程中,感知、姿态估计和运动规划仍在执行,遇到突然出现的障碍物或移动物体时,使用动态窗口法(DWA)算法进行避障。|
3.2 导航所需信息
导航所需的信息通过以下主题传递,具体如下:
|主题名称|主题消息类型|作用|
|----|----|----|
|/odom|nav_msgs/Odometry|机器人的里程计信息,用于局部路径规划,接收机器人当前速度等信息以生成局部路径或避障。|
|/tf|tf/tfMessage|由于机器人传感器的姿态会根据硬件配置变化,ROS使用相对坐标变换(TF),描述传感器相对于机器人里程计的相对x、y、z坐标。‘move_base’节点接收该主题,结合机器人和传感器的姿态进行路径规划。|
|/scan|sensor_msgs/LaserScan或sensor_msgs/PointCloud|传感器测量的距离值,常用的传感器有LDS、RealSense、Kinect、Xtion等,用于估计机器人当前姿态或使用AMCL进行运动规划。|
|/map|nav_msgs/GetMap|导航使用占用栅格地图,本教程使用之前通过‘map_server’包创建的‘map.pgm’和‘map.yaml’。|
|/move_base_simple/goal|geometry_msgs/PoseStamped|由用户指定的目标坐标,本教程使用RViz设置,目标坐标包括二维坐标(x,y)和方向θ。|
|/cmd_vel|geometry_msgs/Twist|通过发布遵循规划路径的速度命令,将机器人移动到目标坐标。|
3.3 turtlebot3_navigation的节点和主题状态
当在[turtlebot]上启动‘turtlebot3_robot.launch’和‘turtlebot3_navigation.launch’文件后,机器人即可进行导航。
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch
$ export TURTLEBOT3_MODEL=waffle
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml
执行‘rqt_graph’可可视化ROS上运行的节点和主题信息,导航所需的信息会以‘/odom’、‘/tf’、‘/scan’、‘/map’和‘/cmd_vel’等主题名称进行发布和订阅。当在RViz中指定目标坐标时,会发布‘move_base_simple/goal’主题。
3.4 turtlebot3_navigation的设置
‘turtlebot3_navigation’包包含启动导航相关节点和包的启动文件,以及配置各种参数的配置文件,如xml文件、yaml文件、地图文件和rviz配置文件。以下是这些文件的详细信息:
-
/launch/turtlebot3_navigation.launch
:启动所有导航相关包。
<launch>
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<!-- Turtlebot3 -->
<include file="$(find turtlebot3_bringup)/launch/turtlebot3_remote.launch" />
<!-- Map server -->
<arg name="map_file" default="$(find turtlebot3_navigation)/maps/map.yaml"/>
<node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)">
</node>
<!-- AMCL -->
<include file="$(find turtlebot3_navigation)/launch/amcl.launch.xml"/>
<!-- move_base -->
<arg name="cmd_vel_topic" default="/cmd_vel" />
<arg name="odom_topic" default="odom" />
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
<rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml"
command="load" ns="global_costmap" />
<rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml"
command="load" ns="local_costmap" />
<rosparam file="$(find turtlebot3_navigation)/param/local_costmap_params.yaml" command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/global_costmap_params.yaml"
command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/move_base_params.yaml" command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/dwa_local_planner_params.yaml"
command="load" />
<remap from="cmd_vel" to="$(arg cmd_vel_topic)"/>
<remap from="odom" to="$(arg odom_topic)"/>
</node>
</launch>
- /launch/amcl.launch.xml :包含自适应蒙特卡罗定位(AMCL)的各种参数设置,与‘turtlebot3_navigation.launch’文件配合使用。
- /param/move_base_params.yaml :配置监督运动规划的‘move_base’的参数。
- /param/costmap_common_params_burger.yaml、/param/costmap_common_params_waffle.yaml、/param/global_costmap_params.yaml、/param/local_costmap_params.yaml :导航使用占用栅格地图,这些文件用于配置代价地图的参数。‘costmap_common_params.yaml’包含通用参数,‘global_costmap_params.yaml’用于全局区域运动规划,‘local_costmap_params.yaml’用于局部区域运动规划。根据机器人型号不同,‘costmap_common_params.yaml’有不同后缀,TurtleBot3 Waffle Pi型号除相机外与Waffle型号相同,使用‘waffle’后缀。
- /param/dwa_local_planner_params.yaml :‘dwa_local_planner’包最终向机器人传输速度命令,该文件为其设置参数。
- base_local_planner_params.yaml :包含‘base_local_planner’的配置值,但由于TurtleBot3使用‘dwa_local_planner’,该文件未被使用,因为‘move_base’节点的参数设置已提前修改为:
<param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
- /maps/map.pgm、/maps/map.yaml :将之前创建的占用栅格地图保存并使用。
- /rviz/turtlebot3_nav.rviz :包含RViz的设置信息,用于从RViz显示插件加载网格、机器人模型、TF、激光扫描、地图、全局地图、局部地图和AMCL粒子。
3.5 机器人模型与TF
从‘turtlebot3_description’包加载TurtleBot3的机器人3D模型,并通过‘robot_state_publisher’以相对坐标变换‘tf’的形式发布机器人状态(如关节信息)。具体来说,‘turtlebot3_core’发布里程计的‘tf’,其他坐标根据导入的机器人模型中的坐标变换进行相对变换(odom → base_footprint → base_link → base_scan),并发布到‘tf’。这样,在RViz中可以看到机器人的3D模型,通过‘tf’可以找到传感器测量距离值的姿态。
<!-- Turtlebot3 -->
<include file="$(find turtlebot3_bringup)/launch/turtlebot3_remote.launch" />
turtlebot3_bringup/launch/turtlebot3_remote.launch
<launch>
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<include file="$(find turtlebot3_bringup)/launch/includes/description.launch.xml">
<arg name="model" value="$(arg model)" />
</include>
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"
output="screen">
<param name="publish_frequency" type="double" value="50.0" />
</node>
</launch>
3.6 地图服务器
‘map_server’节点加载存储在‘turtlebot3_navigation/maps/’文件夹中的地图信息(map.yaml)和地图(map.pgm),并以主题的形式发布地图。
<!-- Map server -->
<arg name="map_file" default="$(find turtlebot3_navigation)/maps/map.yaml"/>
<node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)">
</node>
3.7 AMCL(自适应蒙特卡罗定位)
运行amcl节点进行自适应蒙特卡罗定位,并设置相关参数。
<include file="$(find turtlebot3_navigation)/launch/amcl.launch.xml"/>
3.8 move_base
设置运动规划所需的代价地图相关参数,为向机器人传递移动速度命令的‘dwa_local_planner’设置参数,以及为监督运动规划的‘move_base’设置参数。
<arg name="cmd_vel_topic" default="/cmd_vel" />
<arg name="odom_topic" default="odom" />
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
<rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml"
command="load" ns="global_costmap" />
<rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml"
command="load" ns="local_costmap" />
<rosparam file="$(find turtlebot3_navigation)/param/local_costmap_params.yaml" command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/global_costmap_params.yaml"
command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/move_base_params.yaml" command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/dwa_local_planner_params.yaml"
command="load" />
<remap from="cmd_vel" to="$(arg cmd_vel_topic)"/>
<remap from="odom" to="$(arg odom_topic)"/>
</node>
通过以上步骤和配置,我们可以实现基于ROS的机器人导航,从理论学习到实践操作,逐步掌握机器人在复杂环境中的定位和移动技术。
4. 导航系统各部分详细解析
4.1 AMCL节点深入分析
AMCL(自适应蒙特卡罗定位)节点在机器人导航中起着关键作用,它通过粒子滤波器来估计机器人的位置。在
/launch/amcl.launch.xml
文件中,包含了AMCL的各种参数设置。这些参数的调整会直接影响到定位的精度和稳定性。
例如,粒子的数量会影响定位的精度,但过多的粒子会增加计算负担。在实际应用中,需要根据具体的环境和机器人的运动情况进行合理调整。另外,传感器模型参数也需要根据使用的传感器进行优化,以提高定位的准确性。
下面是一个简单的mermaid流程图,展示了AMCL节点的工作流程:
graph TD;
A[接收传感器数据] --> B[更新粒子权重];
B --> C{是否需要重采样};
C -- 是 --> D[重采样粒子];
C -- 否 --> E[继续更新];
D --> E;
E --> F[输出机器人位置估计];
4.2 move_base节点详解
move_base
节点是导航系统的核心,它负责运动规划和路径执行。在
/launch/turtlebot3_navigation.launch
文件中,对
move_base
节点进行了详细的配置。
-
局部路径规划器
:使用
dwa_local_planner作为局部路径规划器,它基于动态窗口法(DWA)进行路径规划。在/param/dwa_local_planner_params.yaml文件中,设置了该规划器的各种参数,如最大速度、加速度等。这些参数的设置需要考虑机器人的物理性能和环境的特点。 -
代价地图
:代价地图用于表示环境中不同区域的代价,帮助机器人避开障碍物。在
/param/costmap_common_params_*.yaml、/param/global_costmap_params.yaml和/param/local_costmap_params.yaml文件中,对代价地图的参数进行了配置。例如,障碍物的膨胀半径、自由空间的代价等。
下面是
move_base
节点的工作流程mermaid图:
graph TD;
A[接收目标位置] --> B[全局路径规划];
B --> C[局部路径规划];
C --> D[生成速度指令];
D --> E[控制机器人移动];
E --> F{是否到达目标};
F -- 否 --> C;
F -- 是 --> G[完成导航];
5. 导航系统的优化与调试
5.1 参数优化
在实际应用中,导航系统的性能往往需要通过调整参数来优化。以下是一些常见的参数优化建议:
-
AMCL参数
:调整粒子数量、传感器模型参数等,以提高定位的精度和稳定性。
-
move_base参数
:调整局部路径规划器的参数,如最大速度、加速度等,以适应不同的环境和任务。
-
代价地图参数
:调整障碍物的膨胀半径、自由空间的代价等,以提高机器人的避障能力。
5.2 调试技巧
在调试导航系统时,可以使用以下技巧:
-
可视化工具
:使用RViz可以直观地观察机器人的位置、路径规划和传感器数据,帮助发现问题。
-
日志记录
:查看ROS节点的日志信息,了解节点的运行状态和错误信息。
-
逐步测试
:可以先进行局部测试,如单独测试AMCL节点的定位功能,再逐步集成到整个导航系统中。
6. 总结与展望
通过本文的介绍,我们详细了解了基于ROS的机器人导航系统,包括粒子滤波、SLAM、导航实践、导航应用以及系统的配置和优化。从理论到实践,我们逐步掌握了机器人在复杂环境中的定位和移动技术。
在未来的应用中,机器人导航技术将不断发展。例如,结合深度学习技术,可以提高机器人对环境的感知能力和决策能力;使用多传感器融合技术,可以提高定位和导航的精度。同时,随着机器人应用场景的不断拓展,如物流配送、服务机器人等,对导航系统的性能和可靠性也提出了更高的要求。
希望本文能够帮助读者深入理解机器人导航技术,并在实际应用中取得良好的效果。通过不断的学习和实践,我们可以进一步优化和拓展机器人导航系统,为机器人的广泛应用提供有力支持。
超级会员免费看
2136

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



