1、概述

ROS的二维导航功能包。简单来说。就是依据输入的里程计等传感器的信息流和机器人的全局位置,通过导航算法,计算得出安全可靠的机器人速度控制指令。

可是,怎样在特定的机器人上实现导航功能包的功能,却是一件较为复杂的project。作为导航功能包使用的必要先决条件。机器人必须执行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

欢迎继续关注我的博客

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

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

    1.概述 ROS的二维导航功能包,简单来说,就是根据输入的里程计等传感器的信息流和机器人的全局位置,通过导航算法,计算得出安全可靠的机器人速度控制指令.但是,如何在特定的机器人上实现导航功能包的功能, ...

  2. Linux 笔记 - 第十九章 配置 Squid 正向代理和反向代理服务

    一.简介 Squid 是一个高性能的代理缓存服务器,对应中文的乌贼,鱿鱼的意思.Squid 支持 FTP,gopher 和 HTTP 协议.和一般的代理缓存软件不同,Squid 用一个单独的,非模块化 ...

  3. ROS探索总结(十八)——重读tf

    在之前的博客中,有讲解tf的相关内容,本篇博客重新整理了tf的介绍和学习内容,对tf的认识会更加系统. 1 tf简介 1.1 什么是tf tf是一个让用户随时间跟踪多个参考系的功能包,它使用一种树型数 ...

  4. 第十九章——使用资源调控器管理资源(1)——使用SQLServer Management Studio 配置资源调控器

    原文:第十九章--使用资源调控器管理资源(1)--使用SQLServer Management Studio 配置资源调控器 本系列包含: 1. 使用SQLServer Management Stud ...

  5. 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器

    原文:第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 前言: 在前一章已经演示了如何使用SSMS来配置资源调控器.但是作为DBA,总有需要写脚本的时候,因为它可以重用及扩展. ...

  6. 第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

    第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式 我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/en ...

  7. centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课

    centos  MySQL主从配置 ntsysv   chkconfig  setup命令  配置MySQL 主从 子shell  MySQL备份  kill命令  pid文件  discuz!论坛数 ...

  8. m_Orchestrate learning system---二十九、什么情况下用数据库做配置字段,什么情况下用配置文件做配置

    m_Orchestrate learning system---二十九.什么情况下用数据库做配置字段,什么情况下用配置文件做配置 一.总结 一句话总结: 配置文件 开发人员 重置 数据库 非开发人员 ...

  9. ROS探索总结(四)——简单的机器人仿真

    前边我们已经介绍了ROS的基本情况,以及新手入门ROS的初级教程,现在就要真正的使用ROS进入机器人世界了.接下来我们涉及到的很多例程都是<ROS by Example>这本书的内容,我是 ...

随机推荐

  1. 知识总结1:debug命令汇总(一)

    -r 得到当前寄存器状态或修改寄存器状态 -d 跳到默认(CS:IP指定的地址)区间 -d 段地址:偏移地址 跳到(段地址*+偏移地址)区间 -d 段地址:起始偏移地址 终止偏移地址 跳到(段地址*+ ...

  2. # 深入理解Redis(二)——内存管理的建议与技巧

    引语 随着使用Redis的深入,我们不可避免的需要深入了解优化Redis的内存,本章将重点讲解Redis的内存优化之道,同时推荐大家阅读memory-optimization一文. 想要高效的使用Re ...

  3. 使用cnblogs发布第一篇文章,HelloWorld

    HelloWorld! 瞅瞅源码的样式,嗯,语法高亮还是可以的,辨识度还是挺高的. <!DOCTYPE html> <html> <head> <meta c ...

  4. 关于MVC4.0版本以上的RegisterBundles用法

    public class BundleConfig { //新建了一个项目文件,打开App_Start下的BundleConfig看看, public static void RegisterBund ...

  5. 理解Python中编码的应用

    完全理解字符编码 与 Python 的渊源前,我们有必要把一些基础概念弄清楚,虽然有些概念我们每天都在接触甚至在使用它,但并不一定真正理解它.比如:字节.字符.字符集.字符码.字符编码. 字节 字节( ...

  6. 团体程序设计天梯赛-练习集-L1-042. 日期格式化

    L1-042. 日期格式化 世界上不同国家有不同的写日期的习惯.比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”.下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期. 输 ...

  7. 雪花算法生成全局唯一ID

    系统中某些场景少不了全局唯一ID的使用,来保证数据的唯一性.除了通过数据库自带的自增id来保证 id 的唯一性,通常为了保证的数据的可移植性会选择通过程序生成全局唯一 id.百度了不少php相关的生成 ...

  8. python tkinter模块小工具界面

    代码 #-*-coding:utf-8-*- import os from tkinter import * root=Tk() root.title('小工具') #清空文本框内容 def clea ...

  9. JDK环境变量设置(linux)

    1.下载jdk1.8版本软件包 2.解压 tar -zxvf jdk1.8.tar.gz mv jdk1.8 /usr/local/ 3.添加环境变量 vim /etc/profile 在文件底部加入 ...

  10. CSS学习笔记之选择器

    目录 1.元素选择器 2.继承 3.选择器分组 4.声明分组 5.后代选择器 6.子元素选择器 7.相邻兄弟选择器 8.类选择器 9.ID 选择器 10.属性选择器 11.伪类 12.伪元素 1.元素 ...