ROS探索总结(十九)——如何配置机器人的导航功能

1、概述

ROS的二维导航功能包,简单来说,就是根据输入的里程计等传感器的信息流和机器人的全局位置,通过导航算法,计算得出安全可靠的机器人速度控制指令。但是,如何在特定的机器人上实现导航功能包的功能,却是一件较为复杂的工程。作为导航功能包使用的必要先决条件,机器人必须运行ROS,发布tf变换树,并发布使用ROS消息类型的传感器数据。同时,为了让机器人更好的完成导航任务,开发者还要根据机器人的外形尺寸和性能,配置导航功能包的一些参数。

2、硬件要求

尽管导航功能包设计得尽可能通用,但是仍然对机器人的硬件有以下三个要求:

(1)导航功能包仅对差分等轮式机器人有效,并且假设机器人可直接使用速度指令进行控制,速度指令的格式为:x方向速度、y方向速度、速度向量角度。

(2)导航功能包要求机器人必须安装有激光雷达等二维平面测距设备。

(3)导航功能包以正方型的机器人为模型进行开发,所以对于正方形或者圆形外形的机器人支持度较好,而对于其他外形的机器人来讲,虽然仍然可以正常使用,但是表现则很有可能不佳。

3、机器人配置

导航功能包的结构如上图所示,在自己的机器人平台上实现自主导航,简单来说,就是按照上图将需要的功能按照需求完成即可。其中白色的部分是ROS功能包已经完成的部分,不需要我们去实现,灰色的是可选的部分,也由ROS完成,在使用中根据需求使用,需要关注的重点部分是蓝色部分,这些需要我们根据输入输出的要求完成相应的功能。

3.1、ROS

首先,请确保你的机器人安装了ROS框架。

3.2、tf变换(sensortransforms)

导航功能包要求机器人以tf树的形式发布各个相关参考系的变换关系。

3.3、传感器信息(sensor sources)

导航功能包需要采集机器人的传感器信息,以达到实时避障的效果。这些传感器要求能够通过ROS发布

sensor_msgs/LaserScan或者sensor_msgs/PointCloud 格式的消息,也就是二维雷达信息或者三维点云数据。ROS社区已经支持大部分激光雷达、Kinect等设备的驱动,可以直接使用社区提供的驱动功能包发布满足要求的传感器信息。如果你使用的传感器没有ROS支持,或者你想使用自己的驱动,也可以自己将传感器信息封装成要求的格式。

3.4、里程计信息(odometrysource)

导航功能包要求机器人发布nav_msgs/Odometry格式的里程计信息,同时在也要发布相应的tf变换。

3.5、机器人控制器(base_controller)

导航功能包最终的输出是针对机器人geometry_msgs/Twist格式的控制指令,这就要求机器人控制节点具备解析控制指令中速度、角度的能力,并且最终通过这些指令控制机器人完成相应的运动目标。

3.6、地图(map_server)

地图并不是导航功能所必需的。

4、导航功能包集的配置

在满足以上条件的前提下,我们来针对导航功能进行一些配置。

4.1、创建一个功能包

首先,我们需要创建一个功能包,用来存储导航需要用到的所有的配置文件和launch启动文件。在创建功能包的时候,我们需要添加相关的所有依赖,包括机器人配置中使用到的功能包,当然不要忘记了move_base功能包,因为该包有很多我们后面需要用到的接口。找到合适的位置,输入以下命令来创建包:

catkin_create_pkg my_robot_name_2dnav move_base my_tf_configuration_depmy_odom_configuration_dep my_sensor_configuration_dep

4.2、创建机器人启动文件

现在,我们已经有了一个存储各种文件的工作空间,下一步,我们来创建一个机器人启动文件,用来启动机器人配置中所提到的所有硬件,并发布相应的消息和变换关系。

打开编辑器,输入以下格式的内容,并保存为my_robot_configuration.launch命名的文件:

<launch>
  <nodepkg="sensor_node_pkg" type="sensor_node_type"name="sensor_node_name" output="screen">
    <paramname="sensor_param" value="param_value" />
 </node>

  <nodepkg="odom_node_pkg" type="odom_node_type"name="odom_node" output="screen">
    <paramname="odom_param" value="param_value" />
 </node>

  <nodepkg="transform_configuration_pkg"type="transform_configuration_type"name="transform_configuration_name" output="screen">
    <paramname="transform_configuration_param" value="param_value"/>
 </node>
</launch>

让我们来详细的解读以上内容的含义:

<launch>
  <nodepkg="sensor_node_pkg" type="sensor_node_type"name="sensor_node_name" output="screen">
    <paramname="sensor_param" value="param_value" />

这部分代码用来启动机器人的传感器,根据以上格式,修改你所使用到的传感器驱动包名称、类型、命名等信息,并且添加驱动包节点需要使用到的参数。当然,如果你需要使用多个传感器,可以使用相同的方法,启动多个传感器的驱动节点。

<node pkg="odom_node_pkg"type="odom_node_type" name="odom_node"output="screen">
    <paramname="odom_param" value="param_value" />
 </node>

这部分代码用来启动机器人上的里程计,根据需要修改功能包名、类型、节点名、参数。

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

这部分代码需要启动机器人相关的坐标变换。

4.3、代价地图的配置 (local_costmap)& (global_costmap)

导航功能包使用两种代价地图存储周围环境中的障碍信息,一种用于全局路径规划,一种用于本地路径规划和实时避障。两种代价地图需要使用一些共同和独立的配置文件:通用配置文件,全局规划配置文件,本地规划配置文件。以下将详细讲解这三种配置文件:

(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米范围内,机器人将根据传感器的信息,清除范围内的自由空间。

footprint: [[x0, y0], [x1, y1], ... [xn, yn]]
#robot_radius: ir_of_robot
inflation_radius: 0.55

这些参数用来设置机器人在二维地图上的占用面积,如果机器人外形是圆形,则需要设置机器人的外形半径。所有参数以机器人的中心作为坐标(0,0)点。inflation_radius参数是设置障碍物的膨胀参数,也就是机器人应该与障碍物保持的最小安全距离,这里设置为0.55意为为机器人规划的路径应该与机器人保持0.55米以上的安全距离。

observation_sources: laser_scan_sensorpoint_cloud_sensor

observation_sources参数列出了代价地图需要关注的所有传感器信息,每一个传感器信息都将在后边列出详细信息。

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

以激光雷达为例,sensor_frame标识传感器的参考系名称,data_type表示激光数据或者点云数据使用的消息类型,topic_name表示传感器发布的话题名称,而marking和clearing参数用来表示是否需要使用传感器的实时信息来添加或清楚代价地图中的障碍物信息。

(2)全局规划配置文件(Global Configuration (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提供的地图信息进行初始化,如果你不需要使用已有的地图或者map_server,最好将该参数设置为false。

(3)本地规划配置文件(Local Configuration (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参数是用来设置在机器人移动过程中是否需要滚动窗口,以保持机器人处于中心位置。"width," "height," 和"resolution" 设置设置代价地图长(米)、高(米)和分辨率(米/格)。分辨率可以设置的与静态地图不同,但是一般情况下两者是相同的。

4.4 本地规划器配置

本地规划器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

该配置文件声明了机器人的本地规划采用Trajectory Rollout算法。第一段设置了机器人的速度阈值,第二段设置了机器人的加速度阈值。

4.5 为导航功能包创建一个启动文件

到此为止,我们已经创建完毕所有需要用到的配置文件,接下来我们需要创建一个启动文件,来启动所有需要的功能。创建move_base.launch的文件:

<launch>
  <masterauto="start"/>

  <!-- Runthe map server -->
  <nodename="map_server" pkg="map_server"type="map_server" args="$(find my_map_package)/my_map.pgm my_map_resolution"/>

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

  <nodepkg="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="$(findmy_robot_name_2dnav)/costmap_common_params.yaml" command="load"ns="local_costmap" />
   <rosparam file="$(findmy_robot_name_2dnav)/local_costmap_params.yaml" command="load" />
   <rosparam file="$(findmy_robot_name_2dnav)/global_costmap_params.yaml" command="load"/>
   <rosparam file="$(findmy_robot_name_2dnav)/base_local_planner_params.yaml"command="load" />
 </node>
</launch>

在该配置文件中,你需要修改的只有map-server输入的地图,以及如果使用差分驱动的机器人,需要修改"amcl_omni.launch"成"amcl_diff.launch" 。

4.6 AMCL功能包的设置

AMCL有许多的参数设置,会影响机器人的定位效果,具体参考amcldocumentation

5、运行导航功能包

现在,我们已经完成了所有需要的工作,最后一步,运行启动文件,开始导航之旅:

roslaunch my_robot_configuration.launch
roslaunch move_base.launch

现在导航功能包应该已经可以顺利运行了,但这绝对不是结束,因为你只能从终端里看到一端乱蹦的代码,如何使用更友好的方式进行机器人导航呢?如果你想使用UI界面,请参考rviz and navigationtutorial,如果你想使用代码,请参考Sending SimpleNavigation Goals 。

----------------------------------------------------------------

欢迎大家转载我的文章。

转载请注明:转自古-月

http://blog.csdn.net/hcx25909

欢迎继续关注我的博客

时间: 2024-10-06 02:00:35

ROS探索总结(十九)——如何配置机器人的导航功能的相关文章

linux杂谈(十九):DNS服务器的配置(二)

1.本机和外网的解析 ? ?之前讨论了DNS的正向解析和反向解析,但有的时候我们想让DNS服务器对于服务器本机的解析和对于外网的解析是不同的.那就需要在主配置文件中对本机和外网进行不同的配置: ? ? ? ? ? ?这个是主配置文件中对于本服务器的访问,并且副配置文件为example.com.zone:(注意要注释的内容). ? ? ? ?这个是对于非本机的配置,并且副配置文件为example.com.inter. ? ?为了统一期间,把之前的副配置文件的策略注释掉. ? ? ? ? ?然后我们

linux杂谈(十九):DNSserver的配置(二)

1.本机和外网的解析 ? ?之前讨论了DNS的正向解析和反向解析,但有的时候我们想让DNSserver对于server本机的解析和对于外网的解析是不同的.那就须要在主配置文件里对本机和外网进行不同的配置: ? ? ? ? ? ?这个是主配置文件里对于本server的訪问,而且副配置文件为example.com.zone:(注意要凝视的内容). ? ? ? ?这个是对于非本机的配置,而且副配置文件为example.com.inter. ? ?为了统一期间,把之前的副配置文件的策略凝视掉. ? ?

Python之路【第十九篇】:爬虫

Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. Requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. import

ROS探索总结(一)——ROS简介

转自古-月 ROS探索总结(一)--ROS简介 一.历史 随着机器人领域的快速发展和复杂化,代码的复用性和模块化的需求原来越强烈,而已有的开源机器人系统又不能很好的适应需求.2010年Willow Garage公司发布了开源机器人操作系统ROS(robot operating system),很快在机器人研究领域展开了学习和使用ROS的热潮. ROS系统是起源于2007年斯坦福大学人工智能实验室的项目与机器人技术公司Willow Garage的个人机器人项目(Personal Robots Pr

菜鸟学Java(十九)——WEB项目测试好帮手,Maven+Jetty

做WEB开发,测试是一件很费时间的事情.所以我们就应该用更简单.更快捷的方式进行测试.今天就向大家介绍一个轻量级的容器--jetty.j今天说的etty是Maven的一个插件jetty-maven-plugin,与Maven配合起来使用非常的方便,它的配置也非常的简单,下面我们就看看它怎么用吧! 在pom.xml 文件的<project>标签下加入如下代码: <build> <plugins> <plugin> <groupId>org.mort

Java Web总结十九Filter过滤器

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:例如Jsp,Servlet,静态图片文件或静态HTML文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.自动登录.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发Web应用时,如果编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter.通过

云计算设计模式(十九)——运行重构模式

云计算设计模式(十九)——运行重构模式 设计应用程序,使得它可以在不需要重新部署或者重新启动应用程序重新配置.这有助于保持可用性并减少停机时间. 背景和问题 一个主要目的为重要的应用,如商业和企业网站是尽量减少停机时间以及由此引发的中断给客户和用户.但是,有时有必要重新配置应用程序改变特定行为或设置,而在部署和使用.因此,它是用于该应用程序被设计成这样一种方式,以允许在运行时要应用这些配置的变化,并为应用程序,以检测所述变化并且尽快地应用它们的部件的优点. 该种要应用可能被调整记录,以协助与应用

KALI LINUX WEB 渗透测试视频教程—第十九课-METASPLOIT基础

原文链接:Kali Linux Web渗透测试视频教程—第十九课-metasploit基础 文/玄魂 目录 Kali Linux Web 渗透测试视频教程—第十九课-metasploit基础...................... 1 metasploit..................................................................................................... 1 基本体系结构..........

微软云计算介绍与实践(实践之十九)

以下板块的实践着重于如何通过自动化来提升效率,通过自助服务和授权控制,并对基础设施提供统一的管理,这些实践中使用的重要组件为Service Manager.Orchestrator.App Controller 以及 Virtual Machine Manager. 一.微软私有云中的自动化自助服务 关于微软私有云中的自动化自助服务,相关背景知识和产品功能介绍,我就不多说了,贴上几张图,大家看了明白个大概就行. (IT需求和System Center功能) (租户和应用程序所有者的场景) 二.O