ROS学习(五)导航、路径规划、SLAM

主要涉及到3个基本包

  • 用于让机器人在制定框架内移动到目标位置的move_base包。
  • 用于从激光扫描仪、深度摄像机来绘制地图的gmapping包。
  • 用于在现有的地图中定位的amcl包。

先阅读
http://wiki.ros.org/navigation/Tutorials/RobotSetup

move_base

move_base包是使用MoveBaseActionGoal消息类型来指定目标的。

he@he-VirtualBox:~/catkin_ws/src/my_robot_name_2dnav$ rosmsg show MoveBaseActionGoal
[move_base_msgs/MoveBaseActionGoal]:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
actionlib_msgs/GoalID goal_id
time stamp
string id
move_base_msgs/MoveBaseGoal goal
geometry_msgs/PoseStamped target_pose
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w

看上去很复杂,实际使用中指定move4base目标时只需要设定某几个项就可以了。

在move_base节点运行前需要四个配置文件。定义了野果障碍物的代价、机器人半径、路径规划时要考虑未来多长的路、移动速度等等。在rbx1_nav包的config子目录下可以找到:

base_local_planner_params.yaml
costmap_common_params.yaml
global_costmap_params.yaml
local_costmap_params.yaml

配置文件

以下的参数直接可以在wiki上搜索对应的文件名。

base_local_planner_params

  • controller_frequency: 3.0 每3秒一次重新规划路径
  • max_vel_x: 0.3 机器人的最大线速度
  • min_vel_x: 0.05机器人的最小线速度
  • max_rotation_vel: 1.0最大旋转速度
  • min_in_place_vel_theta: 0.5最小旋转速度
  • escape_vel: 机器人逃时速度。必须为负数,这样才能反向移动。
  • acc_lim_x: 2.5 x方向上的最大加速度
  • 等等

costmap_common_params.yaml

  • robot_radius: 0.165--对于圆形机器人这个时机器人的半径,单位时米。对于非圆形机器人来说,你可以用到接下来说到的footprint参数。
  • footprint:[[x0, y0], [x1, y1], [x2, y2], [x3, y3], etc]列表中的每一个坐标代表机器人的边上的一点,机器人的中心设为[0, 0]。单位时米。按照顺时针活着逆时针排列。
  • inflateon_radius:0.3 --地图上的障碍物的半径,单位为米。如果你的机器人不能很好地通过窄门或其他狭窄的地方,则稍微减少这个值。相反的,如果经常碰撞,则增大这个值。

global_costmap_params.yaml

  • global_frame:/map --对于全局代价地图,我们用map框架作为global框架。
  • robot_base_frame:/base_footprint --这个通畅不是/base_link就是/base_footprint。对于TurtleBot应设为/base_footprint。
  • update_frequency:1.0--根据传感器数据,全局地图更新的瓶绿,单位为赫兹。这个数值越大你的计算机cpu负担就会越重。特别对于全局地图,通常会设定一个相对较小、在1.0到5.0之间的值。
  • 等等

local_costmap_params.yaml

  • global_frame:/odom--对于本地代价地图来说,我们使用odometry框架来作为global框架。
  • robot_base_frame:/base_foot_print--这个通常不是/base_link就是/base_footprint。对于TurtleBot应设为/base_footprint。
  • 等等

简单的测试move_base。

运行如下命令

roslaunch rbx1_bringup fake_turtlebot.launch
roslaunch rbx1_nav fake_move_base_blank_map.launch
rosrun rviz rviz -d rospack find rbx1_nav/nav.rviz

会在屏幕上出现
ROS学习(五)导航、路径规划、SLAM_第1张图片

这里我们构建了一张没有障碍物的地图。我们想发送如下命令让机器人前进,并回到原点。

rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped ‘{ header: { frame_id: “map” }, pose: { position: { x: 1, y: 0, z: 0 }, orientation: { x: 0, y: 0, z: 0, w: 1 } } }’

rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped ‘{ header: { frame_id: “map” }, pose: { position: { x: 0, y: 0, z: 0 }, orientation: { x: 0, y: 0, z: 0, w: 1 } } }’

这里我遇到了一个问题
运行的过程中出现如下警告。

[ WARN] [1482245396.760593833]: Map update loop missed its desired rate of 3.0000Hz… the loop actually took 0.8265 seconds
[ WARN] [1482245396.767846009]: Control loop missed its desired rate of 3.0000Hz… the loop actually took 0.8340 seconds

网上的解释是配置文件配置过高,活着机器cpu能力不足。我使用的是mac 13寸标准版,配置文件并未改过。

这样运行的结果是机器人一直在目标点附近打转,始终无法停下来。我思考的原因,可能是由于计算能力不足,运动控制器无法在合适的时间来及时停止机器人或改变角度,所以总会出现运动偏差。

所以,我将控制频率降低为1,并将移动速度与旋转速度都降低,想来弥补cpu能力不足的问题,然后问题得到了缓解,但是依然无法满足要求,问题主要出在旋转上,只要有运动中旋转的,机器人总是无法自己停下来。如图。
ROS学习(五)导航、路径规划、SLAM_第2张图片

比较困惑,感觉move_base没有想象中的那么智能。

后面还有一个跨越障碍物的demo,存在同样的问题。先放一下。回头再仔细研究。

补充

取得了一些进展,参数还是原始参数,我调大了virtual box的cpu数量到2和内存大小到3gb。
取得虽然机器人还会乱转,但收敛速度变快了。

然后准备打开virtualbox的3d加速,但是打开时,运行rviz时报错了。
OpenGL Warning: No pincher, please callcrStateSetCurrentPointers() in your SPU
Segmentation fault (core dumped)
但是如果不打开,虚拟机显示流畅性大大降低。

尝试了几次发现,更新到最新版本的virtualbox并在启动后安装虚拟机增强工具,该报错就会消失。但是重启又会出现。

使用move_base走正方形

roslaunch rbx1_bringup fake_turtlebot.launch
roslaunch rbx1_nav fake_move_base_blank_map.launch
rosrun rviz rviz -d rospack find rbx1_nav/nav.rviz
rosrun rbx1_nav move_base_square.py

使用move_base 运行避开障碍物

使用ctrl+c停止之前的运行
并执行以下命令

roslaunch rbx1_bringup fake_turtlebot.launch
rosparam delete /move_base
roslaunch rbx1_nav fake_move_base_map_with_obstacles.launch
rosrun rviz rviz -d rospack find rbx1_nav/nav_obstacles.rviz
rosrun rbx1_nav move_base_square.py

执行效果如下图,还不错。
ROS学习(五)导航、路径规划、SLAM_第3张图片

gmapping

用一张地图地图和amcl来导航与定位

roslaunch rbx1_bringup fake_turtlebot.launch
roslaunch rbx1_nav fake_amcl.launch map:=test_map.yaml
rosrun rviz rviz -d rospack find rbx1_nav/amcl.rviz

效果如下图,机器人有点喝醉了,目前我认为还是与机器性能有关。

ROS学习(五)导航、路径规划、SLAM_第4张图片

你可能感兴趣的:(ROS)