admin管理员组

文章数量:1530013

move_base导航是基于gmapping所建的图。

(一)安装move_base

一行代码的事:

sudo apt-get install ros-melodic-navigation

因为需要事先保存gmapping建的图,因此需要安装map_server:

sudo aptitude install ros-melodic-map-server

保存地图运行的是rosrun map_server map_saver

终端所在路径会得到两个文件:

map.pgm
map.yaml

(二)踩坑总结

1. tf old
[ WARN] [1596446428.041753296]: TF_OLD_DATA ignoring data from the past for frame odom at time 153.696 according to authority unknown_publisher
Possible reasons are listed at http://wiki.ros.org/tf/Errors%20explained

解决办法:

在launch move_base的launch文件中,添加:

<param name="/use_sime_time" value="true"/>
2. tf转换丢失
[ WARN] [1596446116.138350948]: Timed out waiting for transform from base_link to map to become available before running costmap, tf error: Lookup would require extrapolation into the past.  Requested time 316.293000000 but the earliest data is at time 1596446106.242947328, when looking up transform from frame [base_link] to frame [map]. canTransform returned after 0.100411 timeout was 0.1.

解决办法:

根据报错信息可以发现frame [base_link] to frame [map]的坐标系tf转换丢失了。则强行发布一个变换。因此在launch文件中添加:

  <node name="map2odom" pkg="tf" type="static_transform_publisher" args="0 0 0 0 0 0 map odom 50"/>

将map和odom串起来。因为odom和base_link已经串起来了,所以都串起来了。

3. 控制指令丢失
[ WARN] [1596448254.694183698, 194.154000000]: Control loop missed its desired rate of 20.0000Hz... the loop actually took 0.9100 seconds

由于机器人需要速度指令进行运动,但是速度指令是move_base的输出,受到计算机算力的限制。解决办法是在launch move_base的文件中加入速度发布频率,将5其设置为5,或者1。但是这样是不准确的。也没办法。

<launch>

    <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
        <rosparam file="$(find amr_robots_description)/config/fake/costmap_common_params.yaml" command="load" ns="global_costmap" />
        <rosparam file="$(find amr_robots_description)/config/fake/costmap_common_params.yaml" command="load" ns="local_costmap" />
        <rosparam file="$(find amr_robots_description)/config/fake/local_costmap_params.yaml" command="load" />
        <rosparam file="$(find amr_robots_description)/config/fake/global_costmap_params.yaml" command="load" />
        <rosparam file="$(find amr_robots_description)/config/fake/base_local_planner_params.yaml" command="load" />
         <!-- 控制频率设置太低会在目标附近打转 -->
        <param name="controller_frequency" value="20.0"/>
        <param name="controller_patiente" value="15.0"/>
    </node>
  
</launch>

还有一种办法,就是global_costmap_params.yaml配置文件中,修改参数resolution,将分辨率从0.01改为0.1,为move_base提供更多算力,发现收敛速度更快了。
(参考:https://answers.ros/question/195523/warning-map-update-loop-missed-its-desired-rate-keeps-on-comming/)

(三)仿真结果

运用rviz上面的2D Nav Goal,鼠标左键拖拽设定目标位姿。

(三)参数设置

由于参数较多,因此仅仅列举重要的
参考:https://blog.csdn/Travis_X/article/details/84486765

base_local_planner_params.yaml
   max_vel_x: 0.3   --- x方向速度上限
   min_vel_x: 0   --- x方向速度下限
   max_vel_y: 0.0  --- y方向的速度限制由于速差转向均为0
   min_vel_y: 0.0  --- y方向的速度限制由于速差转向均为0
   min_in_place_vel_theta: 0.2  --- 原地旋转的最小速度
   max_rotation_vel: 0.3  --- 旋转速度上限
   escape_vel: -0.1  --- 逃逸速度,必须为负,若为正则机器人遇到障碍物会冲过去,而不是逃逸
   acc_lim_x: 0.05  --- x方向加速度限制
   acc_lim_y: 0.0 ---  y方向的加速度限制由于速差转向均为0
   acc_lim_theta: 0.05 --- 角加速度限制
costmap_common_params.yaml
	obstacle_range: 4 --- 最大范围传感器读数,范围内的障碍物被放入代价地图中。
	raytrace_range: 3.0  --- 清除指定范围外的空间。将其设置为3.0米,这意味着机器人将尝试清除3米外的空间,即在代价地图中清除3米外的障碍物
	robot_radius: 0.2 --- 机器人半径
	inflation_radius: 0.1  --- 障碍物膨胀半径
	max_obstacle_height: 0.6 --- 最大障碍物高度
	min_obstacle_height: 0.0 --- 最小障碍物高度
	observation_sources: scan --- 观察源是激光数据
	scan: {data_type: LaserScan, topic: /scan, marking: true, clearing: true, expected_update_rate: 0} --- 话题等
global_costmap_params.yaml
   global_frame: odom
   robot_base_frame: base_link
   update_frequency: 1.0  --- 全局地图更新频率
   publish_frequency: 0 --- 发布频率,若使用静态地图则不需要发布
   static_map: true   --- 是否为静态地图,全局一般为静态
   rolling_window: false  --- 更新局部地图,与上一个参数相反
   resolution: 0.01 --- 全局地图分辨率
   transform_tolerance: 1.0  --- tf等待时间
   map_type: costmap
local_costmap_params.yaml
   global_frame: odom
   robot_base_frame: base_link
   update_frequency: 3.0
   publish_frequency: 1.0
   static_map: false --- 是否为静态地图,局部地图一般为动态
   rolling_window: true
   width: 6.0 --- 更新的局部地图的X维长度
   height: 6.0 --- 更新的局部地图的Y维长度
   resolution: 0.01 --- 全局地图分辨率
   transform_tolerance: 1.0  --- tf等待时间
   map_type: costmap

(四)设置空地图

在move_base的launch文件中,需要传入先验地图。但是常常我们只想让他在未知先验地图的情况下使用。那么该怎么办呢?

那么就强行塞给他一个空地图。空地图同样需要拥有pgm文件和yaml文件。下面介绍二者的建立:

参考连接:https://blog.csdn/qq_34213260/article/details/107057644

pgm文件

首先下载gimp:

sudo apt-get install gimp

在终端输入gimp打开后,选择“文件”—“新建”

上述设置将得到一张30m*30m,分辨率为0.01m的地图。
按照上图修改设置,单击确定。然后点击“文件”—“Export”,保存为pgm格式即可。

yaml文件

我的yaml文件如下:

image: 3000_0.01.pgm
resolution: 0.01
origin: [-15, -15, 0]
occupied_thresh: 0.65
free_thresh: 0.196 # Taken from the Willow Garage map in the turtlebot_navigation package
negate: 0

image: 3000_0.01.pgm 指向上述步骤建立的pgm文件。

origin: [-15, -15, 0]设定了机器人相对于全局空白地图的初始位置。[-15, -15, 0]代表机器人在全局空白地图的中间。

本文标签: 注意事项rosmovebase