学习笔记22--Setup and Configuration of the Navigation Stack on a Robot(机器人导航包的配置以及设置)

最近在学习导航包东西,发现了官网这篇文章介绍很全面,靠着躺过6级的能力,用尽吃奶的力气,花了近7个小时把里面的东西按照自己理解的翻译出来,希望有一定参考价值.有理解错误地方,麻烦指出来哈.
(吐槽一下,以前刷6级试题连续几个小时就恶心不行,现在居然没事,果然有兴趣不累,哈哈哈)

材料来源:
http://wiki.ros.org/navigation/Tutorials/RobotSetup

机器人导航包的配置以及设置

简介:本教程逐步说明如何让导航包在机器人上面跑起来.主要内容包括:使用tf发送装换信息,发布里程计信息,在ROS里面发布激光传感器数据,和基本导航包配置.

目录
1机器人设置
1.1ROS
1.2变换配置
1.3传感器数据
1.4里程计信息
1.5基本控制器
1.6地图服务
2导航包设置
2.1创建一个包
2.2创建机器人launch配置文件
2.3代价地图配置(局部型和全局型)
2.4本地规划器基本配置
2.5创建一个导航包的launch文件
2.6 amcl配置
3运行导航包
4排错

1机器人设置
在这里插入图片描述
导航包假定机器人在运动前做好了相应的配置.上面图表给出了大体的配置信息.白色是功能实现必须组成模块,灰色是功能实现的可选择部分,蓝色是每个机器人控制台必须创建的.下面章节教程会介绍怎么来配置满足导航包运行的必要条件.

1.1ROS

导航包默认为机器人使用的是ROS.请查看关于ROS 介绍链接(http://wiki.ros.org/ROS),查看怎么在机器人上安装ROS.

1.2变换配置(包括其他一些变换)

导航包要求机器人使用tf来发布坐标系之间的关系信息.这方面详细信息可以看以下这个链链接(http://wiki.ros.org/navigation/Tutorials/RobotSetup/TF).

1.3传感器信息

在世界中,导航包靠采集的传感器信息来避障.它默认这些传感器在ROS 里面发布信息类型是 sensor_msgs/LaserScan 或者 sensor_msgs/PointCloud messages (就是告诉我们,发布其他类似的,它没办法获取到的).在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 消息类型来发布里程计信息.链接(http://wiki.ros.org/navigation/Tutorials/RobotSetup/Odom)里面教程有介绍了怎么发布里程计信息到ROS里面.下面列出一些支持里程计的平台和他们相关的适用的驱动:

Videre Erratic: erratic_player
(链接http://wiki.ros.org/erratic_player)
PR2: pr2_mechanism_controllers
(链接http://wiki.ros.org/pr2_mechanism_controllers)
(简单点理解就是一些怎么发布里程计信息相关文件编写案例,非常有参考价值的)

1.5 基本控制器

导航包默认采用 geometry_msgs/Twist 消息类型发布速度消息,速度的topic就是机器人基础坐标系里面”cmd_vel”topic.这就意味着必须有一个node来订阅”cmd_vel”主题(该topic里面含义: (vx, vy, vtheta) <==> (cmd_vel.linear.x, cmd_vel.linear.y, cmd_vel.angular.z),就是表示xy两方向的线速度和绕z的角速度),并可以将这些信息转换为电机指令到移动地盘上面.下面有些参考案例:

Videre Erratic: erratic_player
(链接http://wiki.ros.org/erratic_player)
PR2: pr2_mechanism_controllers
(链接http://wiki.ros.org/pr2_mechanism_controllers)

1.6绘制地图(地图服务)

导航包不要求项地图,但是为了完成本教程,我们假定已经有了一张地图了.链接(http://wiki.ros.org/slam_gmapping/Tutorials/MappingFromLoggedData)
里面教程有教我们怎么创建自己世界环境的地图.

2导航包设置

这节介绍怎么在机器人上面设置和配置导航包.我们认为上面的机器人配置要求都已经满足了,再开始本节学习.特别地,可以认定,机器人必须采用tf来发布坐标系信息,从传感器上面获取的消息类型都是直接给导航包使用的样式:sensor_msgs/LaserScan or sensor_msgs/PointCloud ,并且发布里程计谢谢采用的tfnav_msgs/Odometry来传送速度指令到底层.如果你的机器人还有一些要求没有满足,看上半节教程并完成它.

2.1创建一个包

本教程第一步,创建一个用于存放配置导航包信息文件,launch文件的包.这个包会有很多其他依赖包,这些依赖包是用来满足上半节基本配置要求的,以及这个带有很多导航包关键接口的move_base包要求.所以,选择一个区域运行下面指令来创建该包:

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文件里面.当然,你也可以根据使用的机器人名称重新命名该文件.同时,在下面的一系列文件中也应该作出相应的修改,所以要确保你要看完下面的内容.

<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">

这节里面,我们启动了机器人导航包用到的一些传感器.sensor_node_pkg标签可以换成自己使用传感器的ros驱动包名称,相应的sensor_node_type也可以换成自己对应的传感器对
应的node名称,sensor_node_name可以根据自己爱好定义,sensor_param这些参数根据使用的node来确定.注意,如果使用多个传感器来传信息到导航包,则需要在这个launch文件里面都启动起来.

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

在这一节中,我们启动了里程计.里面的包名称,类型名称,node的名字和具体参数需要根据我们实际上使用的作出替换.

   <param name="transform_configuration_param" value="param_value" />
 </node>

在这一小节中,我们启动了机器人的转换配置文件,同样里面的具体名称参数根据实际使用的替换进去.

2.3代价地图参数(局部代价地图与全局代价地图)

导航包使用两张代价地图去存储世界中障碍物信息.一张代价地图是用于全局规划,意味着在整体的环境中有一个长期的规划,另外一个地图是用来做短期规划和避障的.有些配置项,两个地图都是一样的,但是有些参数是需要单独设置的.因此,下面有了以下三小节代价地图配置课程:公共配置设置\全局配置设置\局部配置设置.

注意:下面的章节涵盖的只是代价地图里面的基础配置…全面的项类型说明,请看链接(http://wiki.ros.org/costmap_2d)

2.3.1 公共配置(局部代价地图和全局代价地图)

导航包使用代价地图去存储世界中障碍物信息.为了达到这一点,我们需要指定代价地图去监听对应的传感器的topic不断更新数据.创建一个名称为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米,超过3米的区域传感器数据都会被机器人忽视消除.

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

这里,我们设置机器人的大小痕迹footprint,如果是是圆型的话,那么这里footprint就是填写半径.在指定的具体大小痕迹里面,机器人的中心被视为坐标原点(0,0),里面采用那个顺时针或者逆时针样式填写都是可以的(简单点理解就是这些坐标围成的区域就是表示机器人本身).我们也要设代价地图的膨胀半径(inflation_radius)范围.膨胀半径设置的是距离障碍物最大距离就会触发代价产生(可以理解为离障碍物多远,规划路线就会绕着走意思).例如,把膨胀半径设置为0.55米,意味着机器人走的路径都会跟障碍物保持在0.55米(含)以外,也就说在障碍物外延0.55米都是具有等效的障碍物代价.

observation_sources: laser_scan_sensor point_cloud_sensor

observation_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参数应该是这个传感器的坐标系名称(简单理解为对应的传感器的link);data_type参数应该设定为LaserScanPointCloud类型,这可以根据topic消息类型来确定;topic_name参数应该设置为传感器发布数据对应的topic名称;marking和clearing参数决定着传感器在代价地图里面是否可以添加障碍物信息(如给一个虚拟墙壁在代价地图里面),清除障碍物信息(手动去除代价地图里面的障碍物信息),或者同时两者都可以.

2.3.2全局配置(全局代价地图)
我们创建下面文件来存储全局代价地图具体的配置项信息.打开编译器,创建一个名称为global_costmap_params.yaml文件,把下面的内容粘贴进去.

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

global_frame参数定义了代价地图运行在哪个坐标系(理解为link吧)上面,这这里,我们选择了 /map 坐标系; robot_base_frame参数定义的坐标系是代价地图可以查询机器人的基本信息对应的link(作用就是代价地图通过该link或者说坐标系可以知道机器人的具体位置信息);update_frequency参数定义的代价地图更新周期的频率,单位为hz; static_map参数表示的是代价地图本身是否可以被map_sever初始化.如果你不想用现在的地图,可以把这个参数设置为false.

2.3.3局部配置(局部代价地图)

我们创建一个文件存储局部代价地图具体配置项信息.打开编译器,创建一个名称为local_costmap_params.yam文件,把下面内容拷贝进去.

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的话,当机器人在世界中行走,代价地图会一直围绕着机器人为中心(这里是不是表示视角在rviz里面跟随机器人移动意思呢?不是很理解); width\height\resolution参数设置的是代价地图的宽(米)\长(米)\分辨率(米每格).注意,细网格的分辨率跟静态地图有所不一样,但大多数时候把这两者视为一样的(这句话不是很理解,是指大多数时候采用静态地图的分辨率代替细网格的分辨率吗?).

2.3.4整体配置项
上面介绍的是启动并正常运行起来的最低配置项,更多代价地图方面的细节配置项学习可以看链接(http://wiki.ros.org/costmap_2d)里面的介绍.

2.4基本局部规划配置

base_local_planner (基本局部规划器)负责计算速度指令,并传送给机器人底盘,来完成高层规划.我们需要根据机器人规格参数来设置一些配置,启动一些东西并运行起来.创建一个名称为 base_local_planner_params.yaml文件并打开,把下面的文本拷贝进去.
注意,本节仅仅包含TrajectoryPlanner里面很基本的配置项.所有的配置项说明可以参考链接(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为导航包创建一个启动文件

现在我们获取了所有的适用的配置文件,我们需要把所有的配置信息一起放到一个导航包luanch文件中.创建一个名称为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.6AMCL配置
Amcl 有很多的配置项会影响机器人的局部行为的.更多关于amcl的信息,可以查看链接(http://wiki.ros.org/amcl)里面.

3.运行导航包

现在我们设置了所有东西了,是时候开始运行导航包了.为了满足这个需求,我们需要在机器人上面开启两个终端窗口,第一个窗口,运行my_robot_configuration.launch;第二个窗口运行move_base.launch,这两个都是我们刚才创建的.
窗口(Terminal) 1:

roslaunch my_robot_configuration.launch

窗口(Terminal) 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排错

运行导航包时候碰到的一些突发事件处理,可以参考链接(http://wiki.ros.org/navigation/Troubleshooting)界面.

关键字:移动平台设置,机器人设置,设置机器人,开始使用移动机器人

##########################
好记性不如烂笔头
–20200717

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值