[ROS]Setup and Configuration of the Navigation Stack on a Robot

本贴最后更新于 3208 天前,其中的信息可能已经时过境迁

####前言
本文一步步的介绍如何在运行的机器人上一步步实现导航。包含的主题包括:发送坐标转换的 tf,发布里里程计信息,通过 ROS 发布激光传感器数据和基本的导航包配置。

####1.机器人建立

导航包假设已经部分配置好能够跑动。上面的图解展示了这个配置。白色的组件是必须的组件,并且已经实现了;灰色的组件是可选的组件,并且也已经实现了;蓝色的组件是必须为每一个具体的机器人平台创建的。导航包的预需求部分(以及说明如何满足每一个需求)在下文中提供。

#####1.1ROS

导航包默认机器人使用 ROS,关于如何安装在机器人上安装 ROS 需要查找 ROS 文档。

#####1.2.转换配置 (其他平台)

导航报需要机器人发布使用 tf 转换后的坐标系之间关系的信息。关于如何建立这种配置的详细教程参考:http://wiki.ros.org/navigation/Tutorials/RobotSetup/TF

#####1.3.传感器信息 (源自传感器)

导航包使用传感器收集的信息进行避障,假设这些传感器通过 ROS 发布 sensor_msgs/LaserScan 或者 sensor_msgs/PointCloud 信息。关于通过 ROS 发布的这些信息,参考:http://wiki.ros.org/navigation/Tutorials/RobotSetup/Sensors。当然了,已经有一部分传感器已经有了 ROS 驱动包含了这一步骤。已支持的传感器和相关的驱动链接如下:
######SCIP2.2-compliant Hokuyo Laser Devices as well as the Hokuyo Model 04LX, 30LX - urg_node(http://wiki.ros.org/urg_node)
######SICK LMS2xx Lasers - sicktoolbox_wrapper(http://wiki.ros.org/sicktoolbox_wrapper)

#####1.4.里程信息 (来自里程计)

导航包需要使用 tf 和 nav_msgs/Odometry 信息发布的里程计信息。关于通过 ROS 发布里程计信息的教程参考:http://wiki.ros.org/navigation/Tutorials/RobotSetup/Odom。支持里程计的平台和链接参考:
######Videre Erratic: erratic_player(http://wiki.ros.org/erratic_player)
######PR2: pr2_mechanism_controllers(http://wiki.ros.org/pr2_mechanism_controllers)

#####1.5.底盘控制

导航包假设 它可以使用"cmd_vel"主题上发布的在底盘坐标系上的 geometry_msgs/Twist 消息发布速度命令。这意味着必须有一个节点订阅“cmd_vel”主题,“cmd_vel”能公布(vx, vy, vtheta) <==> (cmd_vel.linear.x, cmd_vel.linear.y, cmd_vel.angular.z)速度以及转换他们为运动命令并发送到移动底盘。支持底盘控制平台以及相关驱动的链接如下:
######Videre Erratic: erratic_player
######PR2: pr2_mechanism_controllers

#####1.6.建图(map_server)

导航包需要地图用来操作,但是在本教程假设已经有了一个地图。关于详细的如何在具体环境中创建地图参考:http://wiki.ros.org/slam_gmapping/Tutorials/MappingFromLoggedData。

####2.导航包的建立

本节描述如何在机器人上建立和配置导航包。假设上文描述的建立机器人的需求已经得到满足。特别地,这也意味着机器人必须使用 tf 发布坐标系信息,所有传感器发布的 sensor_msgs/LaserScan 或者 sensor_msgs/PointCloud 将被导航包使用,使用 tf 和 sensor_msgs.LaserScan 发布的里程计信息同样通过速度命令发送到底盘。如果机器人不满足这些需求,查看上文的说明并完善。

#####2.1 创建 package

本教程的第一步就是创建一个 package,我们将用它来保存导航包的所有的配置和 launch 文件。上述机器人建立步骤描述的满足需要的所有包的依赖对于 move_base package 也一样,它包含了实现导航包的高等级的接口。所以,选择 package 的保存位置,运行如下命令:

catkin_create_pkg my_robot_name_2dnav move_base my_tf_configuration_dep my_odom_configuration_dep my_sensor_configuration_dep

#####2.2.创建 launch 配置文件

既然我们已经有了保存配置和 launch 文件的工作空间,我们将创建一个 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 文件的模板,现在我们需要根据具体的机器人进行填充。下文将介绍具体介绍每一个区域需要更改的内容。

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

在本区域中,我们将创建任何机器人需要导航用到的传感器。用实际使用的传感器 package 名替换掉"sensor_node_pkg","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>

上述代码创建了机器人的转换配置。代码中的参数根据具体的参数进行修改。

#####2.3.Costmap Configuration (local_costmap) & (global_costmap)

导航包使用 2 个 costmap 记录世界参考系中的障碍信息。一个用来全局路径规划,同时创建整体环境的长期规划,另一个用来局部规划和避障。有部分是两个 costmap 共同的配置选项,也有部分是单独的。因此,下文将有 3 个部分来介绍相关配置:公共配置选项,全局配置选项,局部配置选项。
注意:下文只是介绍了一些基本的配置选项,关于更多的配置选项,参考:http://wiki.ros.org/costmap_2d。

######2.3.1.Common Configuration (local_costmap) & (global_costmap)

导航包使用 costmap 保存世界参考系中的障碍物信息。为了正确的完成这个目标,我们需要支出在传感器主题中指出 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

这个参数集合给定了加进 costmap 中的障碍信息的阈值。"obstacle_range"决定范围传感器读取到的最大数据导致在 costmap 中加入障碍。这里,我们设置的是 2.5 米,这意味着机器人将仅仅更新 costmap 中的底盘的障碍信息在 2.5 米内。"raytrace_range"参数决定给定传感器读取的光线追踪自由空间。设置它为 3 米表示机器人通过给定的传感器读取的数据将尝试清除它面前的空间到 3 米外。

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

这里我们设置机器人的 footprint 和机器人的半径(如果是圆的话)。如果要指定 footprint,机器人的中心假定为(0,0,0,0)以及指定顺时针和逆时针方向都能被支持。

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}

上述的一行设置 observation_sources 中传感器关注的参数,本示例定义了 laser_scan_sensor 作为示例。
"frame_name"是传感器的坐标系的名字,"data_type"必须被设置为 LaserScan 或者 PointCloud,取决于使用了哪种消息的的主题,"topic_name"必须设置为传感器发布数据的主题的名字。"marking" 和 "clearing"决定传感器是否被用来增加障碍信息到 costmap 中,从 costmap 清除障碍信息或者两者都是。

######2.3.2.Global Configuration (global_costmap)

我们将创建 global_costmap_params.yaml 文件保存全局 costmap 的具体配置选项。

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 提供的 mao 为基础初始化自身。如果不是使用已有的地图或者 map server,设置这个参数为 false。

######2.3.3.Local Configuration (local_costmap)

我们将创建 local_costmap_params.yaml 文件保存局部 costmap 的具体配置选项:

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"参数表示是否以机器人为中心,是则机器人始终在地图的中央。"width," "height," 和"resolution"设置 costmap 的宽度(米)、长度(米)、分辨率(米/格)。值得注意的是最好设置 grid 的分辨率和 static map 的分辨率不同,但是大多数的时候还是倾向于设置成一样。

######2.3.4.Full Configuration Options

最小配置应该要能启动和运行,对于 costmap 的更多的可用配置选项参考:http://wiki.ros.org/costmap_2d。
#####2.4.Base Local Planner Configuration
base_local_planner 响应速度计算命令并发送到机器人移动底盘用于更高级别的规划。我们需要根据机器人的规则去设置一些配置参数。新建 base_local_planner_params.yaml 文件然后复制下面的内容:

注意:这里这配置了一些基本的路径规划配置参数。更多的参考:http://wiki.ros.org/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

现在我们已经创建并编写好了所有需要的配置文件,现在需要把所有的文件在一个 launch 文件里面配置好。新建 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>

仅需要的改变就是需要将 map server 指向你创建的地图,改变"amcl_omni.launch" 为 "amcl_diff.launch",如果你有不同的机器人驱动。关于如何创建地图,参考:http://wiki.ros.org/slam_gmapping/Tutorials/MappingFromLoggedData。

#####2.6.AMCL Configuration (amcl)

AMCL 有多个配置选项会影响定位的性能,更多的请参考:amcl documentation.http://wiki.ros.org/amcl

####3.Running the Navigation Stack

现在我们已经创建好了一切,现在可以运行导航包了。执行:

终端 1:

roslaunch my_robot_configuration.launch

终端 2:

roslaunch move_base.launch

可以看到导航包已经运行起来了。
关于通过图像化界面查看发送到导航包的信息查看:http://wiki.ros.org/navigation/Tutorials/Using%20rviz%20with%20the%20Navigation%20Stack。如果要用代码替代发送信息,参看:http://wiki.ros.org/navigation/Tutorials/SendingSimpleGoals。

####4.Troubleshooting

关于导航包使用中遇到的问题,参考:http://wiki.ros.org/navigation/Troubleshooting

######关键字:mobile platform setup, robot setup, setup robot, getting started with mobile robot

  • ROS
    23 引用 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 258 关注
  • AWS
    11 引用 • 28 回帖 • 9 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 5 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 677 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1443 引用 • 10082 回帖 • 496 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 513 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 543 回帖
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖 • 1 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    186 引用 • 1021 回帖
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 395 关注
  • gRpc
    11 引用 • 9 回帖 • 100 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 6 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 2 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 648 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 504 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    53 引用 • 190 回帖
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 728 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 184 关注
  • abitmean

    有点意思就行了

    34 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 27 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 37 关注
  • Anytype
    3 引用 • 31 回帖 • 25 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖