< >
Home » ROS与navigation教程 » ROS与navigation教程-安装和配置导航包

ROS与navigation教程-安装和配置导航包

ROS与navigation教程-安装和配置导航包

说明:

  • 介绍如何在机器人整合导航包。包括使用TF发送变换,发布里程信息,发布传感器数据以及基本导航包配置。

(1)机器人配置:

  • 机器人配置图

请输入图片描述

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

  • ROS

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

  • 变换配置(其他变换)

导航包要求机器人使用tf发布关于坐标系之间的关系的信息。有关设置此配置的详细教程,请参见:变换配置

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

导航包使用来自传感器的信息来避开地图上的障碍物,它假定这些传感器在ROS上发布 sensor_msgs/LaserScan 或 sensor_msgs/PointCloud消息。有关通过ROS发布这些消息的信息,请参阅“ROS发布传感器流”教程。此外,还有一些传感器已经有相关处理的ROS驱动程序。

  • 支持的传感器及其相应驱动程序的链接如下所示:

  • 里程信息(里程计源)

导航包需要使用TF和nav_msgs/Odometry消息来发布里程信息。有关发布测距信息的教程可以在这里找到:在ROS上发布测距信息

  • 基本控制器(基本控制器)

导航包假设它向机器人的“cmd_vel”话题,发送geometry_msgs/Twist类型的消息速度命令。这意味着必须有一个订阅“cmd_vel”话题的节点能够执行 (vx, vy, vtheta) <==> (cmd_vel.linear.x, cmd_vel.linear.y, cmd_vel.angular.z) 的速度并将其转换为电机命令以发送到移动基站。

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

(2)导航包设置

假定上述机器人设置的所有要求已经得到满足。这意味着机器人必须使用TF发布坐标系信息,接收所有能被导航包使用的传感器sensor_msgs/LaserScan或sensor_msgs/PointCloud的消息,并使用tf和nav_msgs/Odometry 发布里程消息,同时也发布速度命令到移动基座。如果您的机器人中没有满足这些要求,请参阅上面的“机器人配置”部分,了解完成它们的说明。

  • 创建包

本教程的第一步是创建一个包,其中我们将存储导航包的所有配置和启动文件。此软件包将依赖于用于满足上述“机器人配置”部分以及包含导航包高级接口的move_base软件包的任何软件包。因此,创建命令为:

catkin_create_pkg my_robot_name_2dnav move_base my_tf_configuration_dep my_odom_configuration_dep my_sensor_configuration_dep

此命令将创建一个具有必要依赖关系的包,以便在机器人上运行导航包。

  • 创建机器人配置启动文件

现在我们有一个工作空间用于我们所有的配置和启动文件,我们将创建一个roslaunch文件,它将启动所有硬件和发布机器人需要TF变换。启动您最喜欢的编辑器,并将以下代码段粘贴到名为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">
    <param name="sensor_param" value="param_value" />

在本节中,我们将介绍机器人用于导航的任何传感器。将“sensor_node_pkg”替换为传感器的ROS驱动程序的包名称,传感器驱动程序类型“sensor_node_type”,传感器节点所需名称的“sensor_node_name”以及带有任何参数的“sensor_param”您的节点可能需要。请注意,如果您有多个传感器用于将信息发送到导航包,则应在此处启动所有传感器。

  <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规范替换为与实际启动的节点名称。

  <node pkg="transform_configuration_pkg" type="transform_configuration_type" name="transform_configuration_name" output="screen">
    <param name="transform_configuration_param" value="param_value" />
  </node>

在本节中,我们将为机器人启动变换配置。再次,您需要将pkg,type,name和param规范替换为与实际启动的节点名称。

  • 代价地图配置(local_costmap) & (global_costmap)

导航包使用两个成本地图来存储有关地图的障碍物信息。一个成本地图用于全局规划,意味着在整个环境中创建长期计划,另一个用于本地规划和避障。有一些配置选项,我们希望两个代价地图都使用,一些我们要在每种代价地图上单独设置。因此,下面有三个部分用于代价地图的配置:常用配置选项,全局配置选项和本地配置选项。

注意:以下部分仅涵盖了代价地图的基本配置选项。有关各种选项的文档,请参阅costmap_2d文档

  • 通用配置 (local_costmap) & (global_costmap)

导航包使用代价地图存储有关障碍物的信息。为了正确执行此操作,我们需要为costmaps指定应该监听传感器主题和更新频率。我们创建一个名为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米外的空间。

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

“observe_sources”传感器源参数定义把信息传递给代价地图的传感器列表,以空格分隔每个传感器,每个传感器分别定义。

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

设置上述传感器源observation_sources的传感器信息。以laser_scan_sensor作为例子,应将“frame_name”参数设置为传感器坐标系的名称,“data_type”参数应根据话题使用的消息设置为LaserScan或PointCloud,并将“topic_name”设置为传感器发布数据的话题。“marking”和“clearing”参数确定传感器是否向代价地图添加障碍物信息或从代价地图中清除障碍物信息,或者同时都做。

  • 全局代价地图配置(global_costmap)

我们将在下面创建一个文件,用于存储特定于全局代价地图的配置选项。打开一个带有global_costmap_params.yaml文件的编辑器,并粘贴到以下文本中:

global_costmap:
  global_frame: /map
  robot_base_frame: base_link
  update_frequency: 5.0
  static_map: true

“global_frame”参数定义了代价地图应该运行的坐标系,在这种情况下,我们将选择/map坐标系。“robot_base_frame”参数定义了代价地图应该为机器人的基座的坐标系。“update_frequency”参数决定了代价地图更新的频率(以Hz为单位)。该“static_map”参数确定是否由map_server提供的地图服务来进行代价地图的初始化。如果您没有使用现有的地图或地图服务器,请将static_map参数设置为false。

  • 本地代价地图配置(local_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”参数确定代价地图发布可视化信息的速率(以Hz为单位)。将“rolling_window”参数设置为true意味着当机器人移动时,保持机器人在本地代价地图中心。“宽度”,“高度”和“分辨率”参数设置本地代价地图的宽度(米),高度(米)和分辨率(米/单元格)。请注意,这个网格的分辨率与静态地图的分辨率不同,但大多数时候我们倾向设置为相同值。

  • 完整的配置选项

此最低配置应该可以运行,但是有关可用于代价地图的配置选项的更多详细信息,请参阅costmap_2d文档

  • 基本本地规划器配置/base_local_planner

base_local_planner负责把上层规划器计算的速度指令发送给移动基座。我们需要根据我们的机器人的规格来设置一些配置选项,以便开始运行。打开一个名为base_local_planner_params.yaml的文件,并粘贴以下文本:

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

上述参数的第一部分定义了机器人的速度限制。第二部分定义了机器人的加速度限制。
注意:本节仅介绍TrajectoryPlanner的基本配置选项。有关各种选项的文档,请参阅base_local_planner文档

  • 创建导航包的启动文件

现在我们已经有了所有的配置文件,我们需要把所有的东西放在导航包的启动文件中。打开一个带有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”。有关创建地图的教程,请参阅构建地图

  • AMCL配置(amcl)

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

  • 运行导航包

现在我们已经完成了所有设置,我们可以运行导航包。为此,我们需要打开机器人的两个终端。在一个终端中,我们将启动my_robot_configuration.launch文件,另一个终端将启动我们刚创建的move_base.launch文件。

  • 终端1,执行
roslaunch my_robot_name_2dnav my_robot_configuration.launch
  • 终端2,执行
roslaunch my_robot_name_2dnav move_base.launch

恭喜,导航包现在应该正在运行。有关通过图形界面将目标发送到导航包的信息,请参阅rviz和导航教程。如果要使用代码将目标发送到导航包,请参阅“ 发送简单导航目标”教程

  • 故障排除

对于运行导航堆栈时遇到的常见问题,请参阅导航堆栈疑难解答页面

参考资料

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros与navigation教程