Skip to content

机器人导航堆栈的设置和配置

ericwen edited this page Apr 11, 2019 · 2 revisions
  • 描述:本教程提供了有关如何在机器人上运行导航堆栈的逐步说明。 涵盖的主题包括:使用tf发送变换,发布测距信息,通过ROS发布激光传感器数据,以及基本导航堆栈配置。
  • 教程级别:中级 原文链接

1.机器人设置(这个地方有个经典的框架图,请到原网址查看)

  • 导航堆栈假定机器人以特定方式配置以便运行。 上图显示了此配置的概述。 白色组件是已经实现的必需组件,灰色组件是已实现的可选组件,并且必须为每个机器人平台创建蓝色组件。 以下部分提供了导航堆栈的先决条件以及如何满足每个要求的说明。

1.1 ROS

  • 导航堆栈假定机器人正在使用ROS。 有关如何在机器人上安装ROS的说明,请参阅ROS文档。

1.2 变换配置(其他变换)

  • 导航堆栈要求机器人使用tf发布有关坐标框架之间关系的信息。 有关设置此配置的详细教程,请参见:Transform Configuration

1.3 传感器信息(传感器源)

  • 导航堆栈使用来自传感器的信息来避开世界上的障碍,它假设这些传感器通过ROS发布sensor_msgs / LaserScan或sensor_msgs / PointCloud消息。 有关通过ROS发布这些消息的信息,请参阅Publishing Sensor Streams Over ROS教程。 此外,还有许多具有ROS驱动程序的传感器已经完成了这一步骤。 下面列出了支持的传感器及其相应驱动程序的链接:
  • 符合SCIP2.2标准的Hokuyo激光设备以及Hokuyo Model 04LX,30LX - urg_node
  • SICK LMS2xx Lasers - sicktoolbox_wrapper

1.4 测距信息(测距源)

1.5 基础控制器(base controller)

  • 导航堆栈假设它可以使用geometry_msgs/Twist消息发送速度命令,假设该消息位于“cmd_vel”主题上机器人的基本坐标系中。这意味着必须有一个节点订阅“cmd_vel”主题,该节点能够接受(vx、vy、vtheta) <==> (cmd_vel.linear)。x, cmd_vel.linear。并将其转换为要发送到移动基地的电机命令。支持的基本控制平台及其相应驱动程序的链接如下:
  • Videre Erratic: erratic_player
  • PR2: pr2_mechanism_controllers

1.6 地图(map_server)

  • 导航堆栈不需要操作地图,但出于本教程的目的,我们假设您有一个地图。 有关创建环境地图的详细信息,请参阅构建地图教程

2. 导航堆栈设置

  • 本节介绍如何在机器人上设置和配置导航堆栈。 它假定满足机器人设置的所有上述要求。 具体来说,这意味着机器人必须使用tf发布坐标系信息,从所有与导航堆栈一起使用的传感器接收sensor_msgs / LaserScan或sensor_msgs / PointCloud消息,并使用tf和nav_msgs / Odometry发布测距信息 消息同时也接受速度命令发送到基地。 如果您的机器人未满足任何这些要求,请参阅上面的机器人设置部分以获取完成它们的说明。

2.1 创建包

  • 本教程的第一步是创建一个包,我们将存储导航堆栈的所有配置和启动文件。 该软件包将依赖于用于满足上述机器人设置部分以及包含导航堆栈高级接口的move_base软件包中的要求的任何软件包。 因此,为您的包选择一个位置并运行以下命令:
catkin_create_pkg my_robot_name_2dnav move_base my_tf_configuration_dep my_odom_configuration_dep my_sensor_configuration_dep
  • (译者注:上面的依赖 my_tf_configuration_dep 等需要完成上文蓝字链接部分的学习,这些不是ROS标准提供的依赖,而是自定义依赖)
  • 此命令将创建一个包含必要依赖项的包,以在您的机器人上运行导航堆栈。

2.2 创建机器人配置启动文件(Launch File)

  • 现在我们有了一个用于所有配置和启动文件的工作区,我们将创建一个roslaunch文件,它可以显示机器人所需的所有硬件和转换发布。 启动您喜欢的编辑器,并将以下代码段粘贴到名为my_robot_configuration.launch的文件中。 当然,您应该随意将文本“my_robot”替换为您实际机器人的名称。 我们还必须对启动文件进行类似的更改,如下所述,因此请务必阅读本节的其余部分。
<launch>

   <node pkg="sensor_node_pkg" type="sensor_node_type" name="sensor_node_name" output="screen">
    <param name="sensor_param" value="param_value" />
 </node>
 <node pkg="odom_node_pkg" type="odom_node_type" name="odom_node" output="screen">
    <param name="odom_param" value="param_value" />
 </node>
 <node pkg="transform_configuration_pkg" type="transform_configuration_type" name="transform_configuration_name" output="screen">
    <param name="transform_configuration_param" value="param_value" />
 </node>

</launch> 
  • 好的..所以现在我们有一个启动文件的模板,但我们需要为我们的特定机器人填写它。 我们将在下面的每个部分中介绍需要进行的更改。
<launch>

   <node pkg="sensor_node_pkg" type="sensor_node_type" name="sensor_node_name" output="screen">
  • 在本节中,我们将调出机器人将用于导航的任何传感器。 将“sensor_node_pkg”替换为传感器的ROS驱动程序包的名称,将“sensor_node_type”替换为传感器的驱动程序类型,将“sensor_node_name”替换为传感器节点的所需名称,将“sensor_param”替换为任何参数 您的节点可能会采取的 请注意,如果您打算使用多个传感器将信息发送到导航堆栈,则应在此处启动所有传感器。
 </node>
 <node pkg="odom_node_pkg" type="odom_node_type" name="odom_node" output="screen">
    <param name="odom_param" value="param_value" />
 </node>
  • 在本节中,我们将为基地启动里程计。 再一次,您需要将pkg,type,name和param规范替换为与您实际启动的节点相关的规范。
 <param name="transform_configuration_param" value="param_value" />
 </node>
  • 在本节中,我们将启动机器人的转换配置。 再一次,您需要将pkg,type,name和param规范替换为与您实际启动的节点相关的规范。

2.3 Costmap配置(local_costmap)和(global_costmap)

  • 导航堆栈使用两个代价地图来存储有关世界上障碍物的信息。 一个代价图用于全局规划,即在整个环境中创建长期计划,另一个用于本地规划和避障。 有一些配置选项我们想要两个代价地图同时生效,有些我们想要在每个地图上单独设置。 因此,下面有三个部分用于costmap配置:常用配置选项(common configuration),全局配置选项(global configuration)和本地配置选项(local configuration)。
  • 注意:以下部分仅介绍costmap的基本配置选项。 有关所有选项的文档,请参阅costmap_2d文档

2.3.1 Common Configuration (local_costmap) & (global_costmap)

  • 导航堆栈使用代价地图来存储有关世界上障碍物的信息。 为了正确地执行此操作,我们需要将代价地图指向他们应该收听的传感器主题以进行更新。 让我们创建一个名为costmap_common_params.yaml的文件,如下所示,并填入:
obstacle_range: 2.5
raytrace_range: 3.0
footprint: [[x0, y0], [x1, y1], ... [xn, yn]]
#robot_radius: ir_of_robot
inflation_radius: 0.55

observation_sources: laser_scan_sensor point_cloud_sensor

laser_scan_sensor: {sensor_frame: frame_name, data_type: LaserScan, topic: topic_name, marking: true, clearing: true}

point_cloud_sensor: {sensor_frame: frame_name, data_type: PointCloud, topic: topic_name, marking: true, clearing: true}
  • 好吧,让我们将上面的文件分解为可管理的部分。
obstacle_range: 2.5
raytrace_range: 3.0
  • 这些参数设置放入代价地图的障碍物信息的阈值。 “obstacle_range”参数确定将导致障碍物放入代价地图的最大范围传感器读数。 在这里,我们设置为2.5米,这意味着机器人只会更新其地图中包含有关基地2.5米范围内障碍物的信息。 “raytrace_range”参数确定在给定传感器读数的情况下我们将光线跟踪自由空间的范围。 如上所述将其设置为3.0米意味着在给定传感器读数的情况下,机器人将尝试将其前方的空间清理到3.0米以外。
footprint: [[x0, y0], [x1, y1], ... [xn, yn]]
#robot_radius: ir_of_robot
inflation_radius: 0.55
  • 在这里,我们设置机器人的足迹或机器人的半径,如果它是圆形的。 在指定足迹的情况下,假设机器人的中心位于(0.0,0.0),并且支持顺时针和逆时针规格。 我们还将设置代价地图的扩张半径。 应将扩张半径设定为应产生代价的障碍物的最大距离。 例如,将扩张半径设置为0.55米意味着机器人将处理距离障碍物0.55米或更远的所有路径,因为具有相等的障碍物成本。
observation_sources: laser_scan_sensor point_cloud_sensor
  • “observation_sources”参数定义了一个传感器列表,这些传感器将信息传递给由空格分隔的costmap。 每个传感器在下一行中定义。
laser_scan_sensor: {sensor_frame: frame_name, data_type: LaserScan, topic: topic_name, marking: true, clearing: true}
  • 此行设置observe_sources中提到的传感器上的参数,此示例将laser_scan_sensor定义为示例。 “frame_name”参数应设置为传感器坐标系的名称,“data_type”参数应设置为LaserScan或PointCloud,具体取决于主题使用的消息,“topic_name”应设置为名称 传感器发布数据的主题。 “marking”和“clearing”参数确定传感器是否将用于将障碍物信息添加到成本图,从成本图中清除障碍物信息,或者两者都做。

2.3.2 Global Configuration (global_costmap)

  • 我们将在下面创建一个文件,用于存储特定于全局costmap的配置选项。 使用文件global_costmap_params.yaml打开编辑器并粘贴以下文本:
global_costmap:
  global_frame: /map
  robot_base_frame: base_link
  update_frequency: 5.0
  static_map: true
  • “global_frame”参数定义costmap应运行的坐标框架,在这种情况下,我们将选择/ map框架。 “robot_base_frame”参数定义costmap应为机器人基础引用的坐标系。 “update_frequency”参数确定costmap将运行其更新循环的频率(Hz)。 “static_map”参数确定costmap是否应根据map_server提供的映射初始化自身。 如果未使用现有映射或映射服务器,请将static_map参数设置为false。

2.3.3 Local Configuration (local_costmap)

  • 我们将在下面创建一个文件,用于存储特定于本地costmap的配置选项。 使用文件local_costmap_params.yaml打开编辑器并粘贴以下文本:
local_costmap:
  global_frame: 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
  resolution: 0.05
  • “global_frame”,“robot_base_frame”,“update_frequency”和“static_map”参数与上面的“全局配置”部分中描述的相同。 “publish_frequency”参数确定costmap将发布可视化信息的速率(Hz)。 将“rolling_window”参数设置为true意味着当机器人在世界中移动时,costmap将保持以机器人为中心。 “宽度”,“高度”和“分辨率”参数设置成本图的宽度(米),高度(米)和分辨率(米/单元)。 请注意,此网格的分辨率与静态地图的分辨率不同,但大多数情况下我们倾向于将它们设置为相同。

2.3.4 Full Configuration Options

  • 此最低配置应该可以启动并运行,但有关成本映射可用配置选项的更多详细信息,请参阅costmap_2d文档。

2.4 Base Local Planner Configuration

  • base_local_planner负责计算速度命令,以便在给定高级计划的情况下发送到机器人的移动基础。 我们需要根据机器人的规格设置一些配置选项来启动和运行。 打开一个名为base_local_planner_params.yaml的文件,并将以下文本粘贴到其中:
  • 注意:本节仅介绍TrajectoryPlanner的基本配置选项。 有关所有选项的文档,请参阅base_local_planner文档
TrajectoryPlannerROS:
  max_vel_x: 0.45
  min_vel_x: 0.1
  max_vel_theta: 1.0
  min_in_place_vel_theta: 0.4

  acc_lim_theta: 3.2
  acc_lim_x: 2.5
  acc_lim_y: 2.5

  holonomic_robot: true
  • 上面第一部分参数定义了机器人的速度限制。 第二部分定义了机器人的加速度限制。

2.5 Creating a Launch File for the Navigation Stack

  • 现在我们已经准备好了所有配置文件,我们需要将所有内容整合到导航堆栈的启动文件中。 使用文件move_base.launch打开一个编辑器并将以下文本粘贴到其中:
<launch>

   <master auto="start"/>
 <!-- Run the map server --> 
    <node name="map_server" pkg="map_server" type="map_server" args="$(find my_map_package)/my_map.pgm my_map_resolution"/>

 <!--- Run AMCL --> 
    <include file="$(find amcl)/examples/amcl_omni.launch" />

   <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
    <rosparam file="$(find my_robot_name_2dnav)/costmap_common_params.yaml" command="load" ns="global_costmap" /> 
    <rosparam file="$(find my_robot_name_2dnav)/costmap_common_params.yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find my_robot_name_2dnav)/local_costmap_params.yaml" command="load" />
    <rosparam file="$(find my_robot_name_2dnav)/global_costmap_params.yaml" command="load" /> 
    <rosparam file="$(find my_robot_name_2dnav)/base_local_planner_params.yaml" command="load" />
 </node>

</launch> 
  • 您需要对此文件进行的唯一更改是将地图服务器更改为指向您创建的地图,如果您有差分驱动器机器人(译者注:一般指双轮驱动的),则将“amcl_omni.launch”更改为“amcl_diff.launch”。 有关创建地图的教程,请参阅构建地图

2.6 AMCL Configuration (amcl)

  • AMCL有许多配置选项会影响本地化的性能。 有关AMCL的更多信息,请参阅amcl文档

Running the Navigation Stack

  • 现在我们已经完成了所有设置,我们可以运行导航堆栈。 要做到这一点,我们需要机器人上的两个终端。 在一个终端中,我们将启动my_robot_configuration.launch文件,在另一个终端中,我们将启动刚刚创建的move_base.launch文件。
  • Terminal 1:
roslaunch my_robot_configuration.launch
  • Terminal 2:
roslaunch move_base.launch
  • 恭喜,导航堆栈现在应该正在运行。 有关通过图形界面将目标发送到导航堆栈的信息,请参阅rviz和导航教程。 如果您想使用代码将目标发送到导航堆栈,请参阅发送简单导航目标教程。

4. 故障排除

  • 有关运行导航堆栈时遇到的常见问题,请参阅导航堆栈故障排除页面。
  • #keywords移动平台设置,机器人设置,设置机器人,移动机器人入门