ROS探索总结(十六)(十七)(十八)(十九)——HRMRP机器人的设计 构建完整的机器人应用系统 重读tf 如何配置机器人的导航功能

来源:互联网 发布:地图慧软件下载 编辑:程序博客网 时间:2024/04/28 12:12

ROS探索总结(十六)——HRMRP机器人的设计

1. HRMRP简介


        HRMRP(Hybrid Real-time Mobile Robot Platform,混合实时移动机器人平台)机器人是我在校期间和实验室的其他小伙伴一起从零开始设计并开发的一款机器人平台,其中大部分扩展电路、驱动和ROS相关的底层功能都是我们自己做的。该机器人平台具有软硬件可编程、灵活性强、模块化、易扩展、实时性强等特点,机器人的整体结构如下图所示。

      HRMRP具备丰富的传感器和执行器,在该平台的基础上,我们设计并实现了机器人SLAM、自主导航、人脸识别、机械臂控制等功能。在设计开发完成之初,我们参加了2013年的OpenHW大赛,并且获得了全国一等奖,此外还在中国智能机器人学术会议上发表学术论文一篇,获得了会议的十佳论文奖。这个机器人陪伴我走过了研究生的三年时光,接下来的几篇博客,我会详细介绍HRMRP从设计到实现方面的很多细节。就机器人的性能来讲,很多方面是超越已有同等级的很多机器人的,但是由于我们开发能力、时间的限制,并没有在最终的应用中充分发挥他的潜力,这也给我留下了一些遗憾。
      废话不多说,先让大家对该机器人有一个整体的印象:
      演示视频:OpenHW大赛机器人演示
      相关论文:《基于嵌入式系统的室内移动机器人定位与导航》 

2. HRMRP的总体架构


        如下图所示,我们根据层次化、模块化的思想,设计的HRMRP的总体架构。

3. 硬件层


3.1 机械平台 

       HRMRP 主体结构为铝合金材质,尺寸为 316mm×313mm×342mm (高××长),装配两个驱动轮与一个万向轮。驱动轮由两个 30W 的直流电机带动,转速可达 83 转/分钟,机器人最快速度 1.5m/s。HRMRP 还装有一个六自由度机械臂, 可以完成三维空间内的夹取操作。 

3.2 控制平台 

       嵌入式系统具备小型化、低功耗、低成本、高灵活性等显著的特点, 电子技术的 发展,也促使可编程门阵列FPGA在嵌入式系统中 得到了越来越广泛的应用,很大程度上改善了嵌入式系统硬件的灵活度与繁琐计算的 实时化。 HRMRP的控制平台即基于 Xilinx 最新一代集成 FPGA 与 ARM 的片上系统 (System-on-Chip,SoC)——Zynq 
       Zynq 由处理系统(Processor System, PS)与可编程逻辑(Programmable Logic, PL)两部分组成。其中 PS 基于 ARM Cortex-A9 双核处理器构建,包含常用的外设接口,例如网络、 USB、内存控制器等。而 PL 由 Xilinx 的 7 系列 FPGA 构成,支持动 态重配置,可以使用 Verilog 语言编程使用。在HRMRP 中,PS通过操作系统控制所 有功能正常有序的实现,而 PL作为协处理器一方面可以对复杂的运算并行加速处理, 另一方面可以进行 I/O 接口扩展,为多传感器和执行器设计统一的接口,提高系统硬 件配置的灵活性。

3.3 传感器系统 

       在机器人核心传感器的选择上, HRMRP使用了高性价比、高集成度的微软 Kinect 传感器。 除此还装配有超声波、加速度、里程计、陀螺仪等多种传感器, 确保机器人 平台可以采集到丰富的传感信息。

4. 驱动层


       驱动层的主要工作是采集或预处理硬件层的数据,下发操作系统层的指令,为底层硬件与上层功能模块提供相应的数据传输通道。由于我们采用的“ARM+FPGA”异构控制平台,为配合硬件层硬件功能,驱动层也分为两部分,分别放置于硬件的PS端和PL端。
       PS端主要驱动连接到ARM处理器的外设,例如通过PS中的OpenNI驱动 Kinect, 并且提供 PL 端到 PS 端的接口。而在PL端中,利用可编程硬件的灵活性和并行处理能力,来进行 I/O 扩展与算法的硬件加速, 如下图所示。

       在I/O 扩展方面,在传统的设计实现当中,由于种类繁多的传感器、 执行器对接口的要求各不相同,会占用大量 I/O 资源,增加处理器的负担。而在HRMRP的ARM+FPGA系统当中,通过定义一组标准的硬件接口, 连接传感器和电机等外设,可使用编程逻辑取代繁杂的电路连接工作,满足各种不同需求的硬件外设。
       在硬件加速方面,一般来说PS端适合常用接口的驱动、网络数据的处理等功能,而PL端适合于规律性的算法处理,在HRMRP中主要负责Kinect的数据预处理工作(这里我们将OpenNI中的部分代码放入FPGA中进行加速)。PS与PL相互配合,提高了系统数据处理的实时性。

5. 操作系统层


        操作系统层是机器人平台的控制核心,集成了机器人的功能模块,负责行为控制、 数据上传、指令解析、人机交互等功能。为与 ROS 通讯接口保持一致,使用Ubuntu12.04作为操作系统,运行于Zynq的PS端ARM处理器之中。ROS为用户的不同需求提供了大小和功能不同的多种安装包,为了减少ARM端的执行压力, HRMRP编译移植了仅包括 ROS 基本通讯机制的核心库。继承了ROS的优势,机器人平台具备ROS通讯以及功能包运行的能力,与上层网络指令无缝连接,结合开源软件库,极大的丰富了机器人的功能模块与应用范围。 
       HRMRP是一种较为典型的高性能、低成本机器人平台。与现在研究和应用中使用较为广泛的TurtleBot、 Pioneer等机器人相比,HRMRP具有相似的结构与尺寸,同样可以完成多种多样的机器人应用,但是在接口的可扩展性、传感器的丰富度以及成本控制等方面,具备更好的综合性能。
       今天就针对HRMRP的设计写到这里,下篇继续针对细节实现进行分析。

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




ROS探索总结(十七)——构建完整的机器人应用系统


上一篇博客介绍了HRMRP机器人平台的设计,基于该平台,可以完成丰富的机器人应用,以较为典型的机器人导航为例,如何使用HRMRP来完成相应的功能?本篇博客将详细介绍如何将HRMRP应用到实际的应用当中。

       1. 系统架构

       ROS作为一个分布式框架,从微观的角度讲,分布式体现在节点的布局和配置上,而从宏观的角度来讲,这种分布式可以体现在多机器人、多主机集成的系统当中。ROS社区中针对多机器人系统并没有很多的涉及,相关应用也比较少。在HRMRP机器人的基础上,我们试图去提出一种多机器人实现的框架,如下图所示:


       2. Server (服务器)

       由于机器人架构多种多样,处理应用的能力也各不相同,在不同场合下的需求也有差异,我们设计了服务器层来提高机器人应用的计算能力,负责调度、分配多机器人应用中的任务,同时为用户提供友好、易用的人机交互界面。
       分布的机器人节点与服务器都采用ROS框架设计,使用无线网络通讯,可以快速集成ROS社区中丰富的应用功能。在多机器人系统当中,通过机器人之间的信息共享和与任务协作,可以让每个机器人在充分发挥自己的能力的同时,获得更多额外的应用潜力。
      

        3. Robot Node(机器人节点)

       机器人节点是应用的执行者与信息的采集者。在该系统中可以集成多种采用ROS框架的机器人,这里以我们设计的HRMRP机器人平台为例,上一篇博客中已经进行了详细的介绍。

        4. 机器人导航

        HRMRP机器人平台采用嵌入式系统作为主控,对于机器人导航等复杂算法的处理能力有限,于是我们将应用的处理在服务器端实现,机器人将采集到的周围环境信息和自身传感器信息发布,由服务器订阅消息并完成处理和显示,再向下发布控制指令。
        数据的处理流程如下:

        SLAM的效果如下:


        导航效果如下:

     

       5. 多机器人实验

       当然,该系统对多机器人的支持也是很好的,由于时间有限,我们只做了一个简单的机器人跟随实验。该实验使用了两个机器人,除HRMRP机器人之外,还使用树莓派制作了一个简单的小型机器人。在实验中,HRMRP机器人在地图上自主导航前进,服务器负责应用的处理与显示,同时将HRMRP的位置信息转发给树莓派机器人,树莓派机器人收到信息后,紧跟HRMRP。
       实验效果如下:

      

      6.相关论文

A New ROS-based Hybrid Architecture for Heterogeneous Multi-Robot Systems

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



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


在之前的博客中,有讲解tf的相关内容,本篇博客重新整理了tf的介绍和学习内容,对tf的认识会更加系统。


1 tf简介

1.1 什么是tf

        tf是一个让用户随时间跟踪多个参考系的功能包,它使用一种树型数据结构,根据时间缓冲并维护多个参考系之间的坐标变换关系,可以帮助用户在任意时间,将点、向量等数据的坐标,在两个参考系中完成坐标变换。

        tf的相关设计思想,可以参见:tf设计


1.2 tf可以做什么

        一个机器人系统通常有很多三维的参考系,而且会随着时间的推移发生变化,例如全局参考系(world frame),机器人中心参考系(base frame),机械夹参考系(gripper frame),机器人头参考系(head frame)等等。tf可以以时间为轴,跟踪这些参考系(默认是10秒之内的),并且允许用户提出如下的申请:

  • 五秒钟之前,机器人头参考系相对于全局参考系的关系是什么样的?
  • 机器人夹取的物体相对于机器人中心参考系的位置在哪里?
  • 机器人中心参考系相对于全局参考系的位置在哪里?

        tf可以在分布式系统中进行操作,也就是说一个机器人系统中所有的参考系变换关系,对于所有节点组件,都是可用的,所有订阅tf消息的节点都会缓冲一份所有参考系的变换关系数据,所以这种结构不需要中心服务器来存储任何数据。

1.3 tf的使用流程

        想要使用tf功能包,总体来讲可以分为以下两个步骤:

      (1)   监听tf变换

        接收并缓存系统中发布的所有参考系变换,并从中查询所需要的参考系变换。

      (2)   广播tf变换

        向系统中广播参考系之间的坐标变换关系。系统中更可能会存在多个不同部分的tf变换广播,每个广播都可以直接将参考系变换关系直接插入tf树中,不需要再进行同步。

2 tf实例理解

        参见:ROS探索总结(十二)——坐标系统

3 tf基础教程

        参见:ROS探索总结(十二)——坐标系统


4 tf功能包的API说明

  • 数据类型
  • 变换与参考系
  • 发布tf变换广播
  • 接收并使用tf广播
  • 异常

5 命令行工具

        虽然tf是ROS中的一个代码链接库,但是仍然提供了丰富的命令行工具来帮助用户调试和创建tf变换。

5.1 tf_monitor

        tf_monitor工具的功能是打印tf树中的所有参考系信息,通过输入参数来查看指定参考系之间的信息。

        命令格式如下:

  • tf_monitor
  • tf_monitor <source_frame> <target_target>

        示例结果如下图所示:



5.2 tf_echo

        tf_echo工具的功能是查看指定参考系之间的变换关系。

        命令的格式如下:

  • tf_echo <source_frame> <target_frame>

        示例效果如下图所示:


5.3 static_transform_publisher

        static_transform_publisher工具的功能是发布两个参考系之间的静态坐标变换,两个参考系一般不发生相对位置变化。

命令的格式如下:

  • static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
  • static_transform_publisher x y z qx qy qz qw frame_id child_frame_id  period_in_ms

         以上两种命令格式,需要设置坐标的偏移和旋转参数,偏移参数都使用相对于xyz三轴的坐标位移,而旋转参数第一种命令格式使用以弧度为单位的 yaw/pitch/roll三个角度(yaw是围绕x轴旋转的偏航角,pitch是围绕y轴旋转的俯仰角,roll是围绕z轴旋转的翻滚角),而第二种命令格式使用四元数表达旋转角度。发布频率以ms为单位,一般100ms比较合适。

        该命令不仅可以在终端中使用,还可以在launch文件中使用,使用方式如下:
[html] view plain copy
  1. <launch>  
  2. <node pkg="tf" type="static_transform_publisher" name="link1_broadcaster" args="1 0 0 0 0 0 1 link1_parent link1 100" />  
  3. </launch>  

5.4 view_frames

        view_frames 是可视化的调试工具,可以生成pdf文件,来显示整棵tf树的信息。

        命令行的执行方式如下:
[html] view plain copy
  1. $ rosrun tf view_frames  
  2. $ evince frames.pdf  

5.5 roswtf plugin

        roswtf是ROS中自查的工具,也可以作为组件使用。针对tf,roswtf可以检查tf的配置并发现常见问题。

       命令的使用方式如下:
[html] view plain copy
  1. $ roswtf  

6 如何调试tf

        参见:调试tf问题

参考链接

  • tf : http://wiki.ros.org/tf
  • tf设计:http://wiki.ros.org/tf/Design
  • tf教程:http://wiki.ros.org/tf/Tutorials
  • tf: The transform library:http://wiki.ros.org/Papers/TePRA2013_Foote

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



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功能包,因为该包有很多我们后面需要用到的接口。找到合适的位置,输入以下命令来创建包:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. 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命名的文件:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <launch>  
  2.   <nodepkgnodepkg="sensor_node_pkg" type="sensor_node_type"name="sensor_node_name" output="screen">  
  3.     <paramnameparamname="sensor_param" value="param_value" />  
  4.  </node>  
  5.    
  6.   <nodepkgnodepkg="odom_node_pkg" type="odom_node_type"name="odom_node" output="screen">  
  7.     <paramnameparamname="odom_param" value="param_value" />  
  8.  </node>  
  9.    
  10.   <nodepkgnodepkg="transform_configuration_pkg"type="transform_configuration_type"name="transform_configuration_name" output="screen">  
  11.     <paramnameparamname="transform_configuration_param" value="param_value"/>  
  12.  </node>  
  13. </launch>  

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

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <launch>  
  2.   <nodepkgnodepkg="sensor_node_pkg" type="sensor_node_type"name="sensor_node_name" output="screen">  
  3.     <paramnameparamname="sensor_param" value="param_value" />  

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

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <node pkg="odom_node_pkg"type="odom_node_type" name="odom_node"output="screen">  
  2.     <paramnameparamname="odom_param" value="param_value" />  
  3.  </node>  

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

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <nodepkgnodepkg="transform_configuration_pkg"type="transform_configuration_type"name="transform_configuration_name" output="screen">  
  2.    <paramnameparamname="transform_configuration_param" value="param_value"/>  
  3. </node>  

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

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

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

(1)通用配置文件(Common Configuration (local_costmap) &(global_costmap))

      代价地图用来存储周围环境的障碍信息,其中需要注明地图关注的机器人传感器消息,以便于地图信息进行更行。针对两种代价地图通用的配置选项,创建名为costmap_common_params.yaml的配置文件:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. obstacle_range: 2.5  
  2. raytrace_range: 3.0  
  3. footprint: [[x0, y0], [x1, y1], ... [xn, yn]]  
  4. #robot_radius: ir_of_robot  
  5. inflation_radius: 0.55  
  6.   
  7. observation_sources: laser_scan_sensor point_cloud_sensor  
  8.   
  9. laser_scan_sensor: {sensor_frame: frame_name, data_type: LaserScan, topic: topic_name, marking: true, clearing: true}  
  10.   
  11. point_cloud_sensor: {sensor_frame: frame_name, data_type: PointCloud, topic: topic_name, marking: true, clearing: true}  

      详细解析以上配置文件的内容:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. obstacle_range: 2.5  
  2. raytrace_range: 3.0  

       这两个参数用来设置代价地图中障碍物的相关阈值。obstacle_range参数用来设置机器人检测障碍物的最大范围,设置为2.5意为在2.5米范围内检测到的障碍信息,才会在地图中进行更新。raytrace_range参数用来设置机器人检测自由空间的最大范围,设置为3.0意为在3米范围内,机器人将根据传感器的信息,清除范围内的自由空间。

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. footprint: [[x0, y0], [x1, y1], ... [xn, yn]]  
  2. #robot_radius: ir_of_robot  
  3. inflation_radius: 0.55  

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

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. observation_sources: laser_scan_sensorpoint_cloud_sensor  

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

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. laser_scan_sensor: {sensor_frame: frame_name, data_type:LaserScan, topic: topic_name, marking: true, clearing: true}  

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

2)全局规划配置文件(Global Configuration (global_costmap)

        全局规划配置文件用来存储用于全局代价地图的配置参数,我们使用global_costmap_params.yaml来命名,内容如下:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. global_costmap:  
  2.  global_frame: /map  
  3.  robot_base_frame: base_link  
  4.  update_frequency: 5.0  
  5.   static_map:true  

     global_frame参数用来表示全局代价地图需要在那个参考系下运行,这里我们选择了map这个参考系。robot_base_frame参数表示代价地图可以参考的机器人本体的参考系。update_frequency参数绝地全局地图信息更新的频率,单位是Hzstatic_map参数决定代价地图是否需要根据map_server提供的地图信息进行初始化,如果你不需要使用已有的地图或者map_server,最好将该参数设置为false

3)本地规划配置文件(Local Configuration (local_costmap)

       本地规划配置文件用来存储用于本地代价地图的配置参数,命名为local_costmap_params.yaml,内容如下:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. local_costmap:  
  2.  global_frame: odom  
  3.  robot_base_frame: base_link  
  4.  update_frequency: 5.0  
  5.  publish_frequency: 2.0  
  6.   static_map:false  
  7.  rolling_window: true  
  8.   width: 6.0  
  9.   height: 6.0  
  10.   resolution:0.05  

      "global_frame", "robot_base_frame","update_frequency",  "static_map"参数的意义与全局规划配置文件中的参数相同。publish_frequency设置代价地图发布可视化信息的频率,单位是Hzrolling_window参数是用来设置在机器人移动过程中是否需要滚动窗口,以保持机器人处于中心位置。"width," "height," "resolution" 设置设置代价地图长(米)、高(米)和分辨率(米/格)。分辨率可以设置的与静态地图不同,但是一般情况下两者是相同的。

4.4 本地规划器配置

       本地规划器base_local_planner的主要作用是根据规划的全局路径,计算发布给机器人的速度指令。该规划器需要我们根据机器人的规格,配置一些相应的参数。我们创建名为base_local_planner_params.yaml的配置文件:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. TrajectoryPlannerROS:  
  2.   max_vel_x: 0.45  
  3.   min_vel_x: 0.1  
  4.   max_vel_theta: 1.0  
  5.   min_in_place_vel_theta: 0.4  
  6.    
  7.   acc_lim_theta: 3.2  
  8.   acc_lim_x: 2.5  
  9.   acc_lim_y: 2.5  
  10.    
  11.   holonomic_robot: true  

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

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

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

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <launch>  
  2.   <masterautomasterauto="start"/>  
  3.    
  4.   <!-- Runthe map server -->  
  5.   <nodenamenodename="map_server" pkg="map_server"type="map_server" args="$(find my_map_package)/my_map.pgm my_map_resolution"/>  
  6.    
  7.   <!---Run AMCL -->  
  8.   <includefileincludefile="$(find amcl)/examples/amcl_omni.launch" />  
  9.    
  10.   <nodepkgnodepkg="move_base" type="move_base" respawn="false"name="move_base" output="screen">  
  11.    <rosparam file="$(find my_robot_name_2dnav)/costmap_common_params.yaml"command="load" ns="global_costmap" />  
  12.    <rosparam file="$(findmy_robot_name_2dnav)/costmap_common_params.yaml" command="load"ns="local_costmap" />  
  13.    <rosparam file="$(findmy_robot_name_2dnav)/local_costmap_params.yaml" command="load" />  
  14.    <rosparam file="$(findmy_robot_name_2dnav)/global_costmap_params.yaml" command="load"/>  
  15.    <rosparam file="$(findmy_robot_name_2dnav)/base_local_planner_params.yaml"command="load" />  
  16.  </node>  
  17. </launch>  

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

4.6 AMCL功能包的设置

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


5、运行导航功能包

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

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. roslaunch my_robot_configuration.launch  
  2. roslaunch move_base.launch  

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

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

欢迎大家转载我的文章。

转载请注明:转自古-月

http://blog.csdn.net/hcx25909

欢迎继续关注我的博客


0 0
原创粉丝点击