导航、路径规划、SLAM
2017-10-17 14:58
525 查看
主要涉及到3个基本包
用于让机器人在制定框架内移动到目标位置的move_base包。
用于从激光扫描仪、深度摄像机来绘制地图的gmapping包。
用于在现有的地图中定位的amcl包。
先阅读
http://wiki.ros.org/navigation/Tutorials/RobotSetup
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 fra
4000
me_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
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方向上的最大加速度
等等
footprint:[[x0, y0], [x1, y1], [x2, y2], [x3, y3], etc]列表中的每一个坐标代表机器人的边上的一点,机器人的中心设为[0, 0]。单位时米。按照顺时针活着逆时针排列。
inflateon_radius:0.3 --地图上的障碍物的半径,单位为米。如果你的机器人不能很好地通过窄门或其他狭窄的地方,则稍微减少这个值。相反的,如果经常碰撞,则增大这个值。
robot_base_frame:/base_footprint --这个通畅不是/base_link就是/base_footprint。对于TurtleBot应设为/base_footprint。
update_frequency:1.0--根据传感器数据,全局地图更新的瓶绿,单位为赫兹。这个数值越大你的计算机cpu负担就会越重。特别对于全局地图,通常会设定一个相对较小、在1.0到5.0之间的值。
等等
robot_base_frame:/base_foot_print--这个通常不是/base_link就是/base_footprint。对于TurtleBot应设为/base_footprint。
等等
roslaunch rbx1_bringup fake_turtlebot.launch
roslaunch rbx1_nav fake_move_base_blank_map.launch
rosrun rviz rviz -d
会在屏幕上出现
这里我们构建了一张没有障碍物的地图。我们想发送如下命令让机器人前进,并回到原点。
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,存在同样的问题。先放一下。回头再仔细研究。
取得虽然机器人还会乱转,但收敛速度变快了。
然后准备打开virtualbox的3d加速,但是打开时,运行rviz时报错了。
OpenGL Warning: No pincher, please callcrStateSetCurrentPointers() in your SPU
Segmentation fault (core dumped)
但是如果不打开,虚拟机显示流畅性大大降低。
尝试了几次发现,更新到最新版本的virtualbox并在启动后安装虚拟机增强工具,该报错就会消失。但是重启又会出现。
roslaunch rbx1_nav fake_move_base_blank_map.launch
rosrun rviz rviz -d
rosrun rbx1_nav move_base_square.py
并执行以下命令
roslaunch rbx1_bringup fake_turtlebot.launch
rosparam delete /move_base
roslaunch rbx1_nav fake_move_base_map_with_obstacles.launch
rosrun rviz rviz -d
rosrun rbx1_nav move_base_square.py
执行效果如下图,还不错。
roslaunch rbx1_nav fake_amcl.launch map:=test_map.yaml
rosrun rviz rviz -d
效果如下图,机器人有点喝醉了,目前我认为还是与机器性能有关。
用于让机器人在制定框架内移动到目标位置的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 fra
4000
me_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
会在屏幕上出现
这里我们构建了一张没有障碍物的地图。我们想发送如下命令让机器人前进,并回到原点。
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并在启动后安装虚拟机增强工具,该报错就会消失。但是重启又会出现。
使用move_base走正方形
roslaunch rbx1_bringup fake_turtlebot.launchroslaunch 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
执行效果如下图,还不错。
gmapping
用一张地图地图和amcl来导航与定位
roslaunch rbx1_bringup fake_turtlebot.launchroslaunch rbx1_nav fake_amcl.launch map:=test_map.yaml
rosrun rviz rviz -d
rospack find rbx1_nav/amcl.rviz
效果如下图,机器人有点喝醉了,目前我认为还是与机器性能有关。
相关文章推荐
- 路径规划A*算法及SLAM自主地图创建导航算法
- ROS学习(五)导航、路径规划、SLAM
- PX4四旋翼mavros与offboard模式在避障实时路径规划(SLAM)方面的应用培训班
- ROS探索总结(十三)(十四)(十五)——导航与定位框架 move_base(路径规划) amcl(导航与定位)
- Android百度地图实例详解之仿摩拜单车APP(包括附近车辆、规划路径、行驶距离、行驶轨迹记录,轨迹回放,导航等)
- 导航中路径规划模块与算法
- App外部跳转百度地图,高德地图,进行导航,路径规划等
- 导航中路径规划模块与算法
- android GoogleMap画导航线路图 路径规划
- APM固件自动巡航车测评与SLAM路径规划
- 仿摩拜单车APP(包括附近车辆、规划路径、行驶距离、行驶轨迹记录,导航等)
- android和ios GoogleMap画导航线路图 路径规划(Directions)
- 导航中路径规划模块与算法
- android GoogleMap画导航线路图 路径规划(Directions)
- 百度地图SDK导航(路径规划+实时导航)
- 推荐一个非常实用的导航路径规划网站
- 安卓调用百度地图网页版进行路径规划与导航,只需提供地名
- 接收导航包全局规划路径话题
- 调起地图App实现路径规划导航等