主要涉及到3个基本包
先阅读
http://wiki.ros.org/navigation/Tutorials/RobotSetup
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上搜索对应的文件名。
运行如下命令
roslaunch rbx1_bringup fake_turtlebot.launch
roslaunch rbx1_nav fake_move_base_blank_map.launch
rosrun rviz rviz -drospack find rbx1_nav
/nav.rviz
这里我们构建了一张没有障碍物的地图。我们想发送如下命令让机器人前进,并回到原点。
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能力不足的问题,然后问题得到了缓解,但是依然无法满足要求,问题主要出在旋转上,只要有运动中旋转的,机器人总是无法自己停下来。如图。
比较困惑,感觉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并在启动后安装虚拟机增强工具,该报错就会消失。但是重启又会出现。
roslaunch rbx1_bringup fake_turtlebot.launch
roslaunch rbx1_nav fake_move_base_blank_map.launch
rosrun rviz rviz -drospack find rbx1_nav
/nav.rviz
rosrun rbx1_nav move_base_square.py
使用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 -drospack find rbx1_nav
/nav_obstacles.rviz
rosrun rbx1_nav move_base_square.py
roslaunch rbx1_bringup fake_turtlebot.launch
roslaunch rbx1_nav fake_amcl.launch map:=test_map.yaml
rosrun rviz rviz -drospack find rbx1_nav
/amcl.rviz
效果如下图,机器人有点喝醉了,目前我认为还是与机器性能有关。