22、ROS机器人导航:从理论到实践

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
  1. 启动机器人 :在[TurtleBot]上运行‘turtlebot3_robot.launch’文件,以启动‘turtlebot3_core’和‘turtlebot3_lds’节点。
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch
  1. 执行导航包 :在[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
  1. 执行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、导航实践、导航应用以及系统的配置和优化。从理论到实践,我们逐步掌握了机器人在复杂环境中的定位和移动技术。

在未来的应用中,机器人导航技术将不断发展。例如,结合深度学习技术,可以提高机器人对环境的感知能力和决策能力;使用多传感器融合技术,可以提高定位和导航的精度。同时,随着机器人应用场景的不断拓展,如物流配送、服务机器人等,对导航系统的性能和可靠性也提出了更高的要求。

希望本文能够帮助读者深入理解机器人导航技术,并在实际应用中取得良好的效果。通过不断的学习和实践,我们可以进一步优化和拓展机器人导航系统,为机器人的广泛应用提供有力支持。

【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)内容概要:本文档主要围绕“直流最优潮流(OPF)课设”的Matlab代码实现展开,属于电力系统优化领域的教学与科研实践内容。文档介绍了通过Matlab进行电力系统最优潮流计算的基本原理与编程实现方法,重点聚焦于直流最优潮流模型的构建与求解过程,适用于课程设计或科研入门实践。文中提及使用YALMIP等优化工具包进行建模,并提供了相关资源下载链接,便于读者复现与学习。此外,文档还列举了大量与电力系统、智能优化算法、机器学习、路径规划等相关的Matlab仿真案例,体现出其服务于科研仿真辅导的综合性平台性质。; 适合人群:电气工程、自动化、电力系统及相关专业的本科生、研究生,以及从事电力系统优化、智能算法应用研究的科研人员。; 使用场景及目标:①掌握直流最优潮流的基本原理与Matlab实现方法;②完成课程设计或科研项目中的电力系统优化任务;③借助提供的丰富案例资源,拓展在智能优化、状态估计、微电网调度等方向的研究思路与技术手段。; 阅读建议:建议读者结合文档中提供的网盘资源,下载完整代码与工具包,边学习理论边动手实践。重点关注YALMIP工具的使用方法,并通过复现文中提到的多个案例,加深对电力系统优化问题建模与求解的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值