之前博文《ROS学习笔记之——Navigation Stack》已经学习过了ROS中的导航包了,本博文来学习一下amcl定位与gmapping
目录
概述
在导航中,不可缺少的便是地图与定位。需要知道机器人当前的位置坐标(定位),然后根据已经建立好的地图,通过路径规划来规划出合理的路径

gmapping 建图
gmapping的作用是根据激光雷达和里程计(Odometry)的信息,对环境地图进行构建,并且对自身状态进行估计。因此它得输入应当包括激光雷达和里程计的数据,而输出应当有自身位置和地图。
源码的地址:https://github.com/ros-perception/slam_gmapping
gmapping是一个比较完善的地图构建开源包,使用激光和里程计的数据来生成二维地图。
要采用gmapping需要机器人拥有odometry数据以及laser range-finder。slam_gmapping节点会尝试将输入的激光雷达扫描的数据转换到odom frame下。
slam_gmapping采用sensor_msgs/LaserScan Message(http://docs.ros.org/en/api/sensor_msgs/html/msg/LaserScan.html)来构建地图并且发布nav_msgs/OccupancyGrid Message出来(http://docs.ros.org/en/api/nav_msgs/html/msg/OccupancyGrid.html)
注意在地图消息中,存在了原点的pose,包括了位置与方向

订阅话题
1、tf message (http://docs.ros.org/en/api/tf/html/msg/tfMessage.html)目的是为了实现laser,base,odometry之间的变换
<the frame attached to incoming scans> → base_link
usually a fixed value, broadcast periodically by a robot_state_publisher, or a tf static_transform_publisher.
base_link → odom
usually provided by the odometry system (e.g., the driver for the mobile base)
/tf以及/tf_static: 坐标变换,类型为第一代的tf/tfMessage或第二代的tf2_msgs/TFMessage 其中一定得提供的有两个tf,一个是base_frame与laser_frame之间的tf,即机器人底盘和激光雷达之间的变换;一个是base_frame与odom_frame之间的tf,即底盘和里程计原点之间的坐标变换。odom_frame可以理解为里程计原点所在的坐标系。
2、sensor_msgs/LaserScan Message(http://docs.ros.org/en/api/sensor_msgs/html/msg/LaserScan.html)激光雷达数据,类型为sensor_msgs/LaserScan
/scan很好理解,Gmapping SLAM所必须的激光雷达数据,而/tf是一个比较容易忽视的细节。尽管/tf这个Topic听起来很简单,但它维护了整个ROS三维世界里的转换关系,而slam_gmapping要从中读取的数据是base_frame与laser_frame之间的tf,只有这样才能够把周围障碍物变换到机器人坐标系下,更重要的是base_frame与odom_frame之间的tf,这个tf反映了里程计(电机的光电码盘、视觉里程计、IMU)的监测数据,也就是机器人里程计测得走了多少距离,它会把这段变换发布到odom_frame和laser_frame之间。
因此slam_gmapping会从/tf中获得机器人里程计的数据。
发布话题
1、nav_msgs/MapMetaData Message (http://docs.ros.org/en/api/nav_msgs/html/msg/MapMetaData.html)这是map_metadata,
2、nav_msgs/OccupancyGrid Message(http://docs.ros.org/en/api/nav_msgs/html/msg/OccupancyGrid.html)这是map。感觉跟1的区别是,真在发布的消息,是这个,因为里面还包含了header之类了,除了header外,还有nav_msgs/MapMetaData,就是1了~
3、~entropy (std_msgs/Float64)(http://docs.ros.org/en/api/std_msgs/html/msg/Float64.html)这个是代表了机器人位姿分布的不确定性。
在之前博客《ROS学习笔记之——激光雷达SLAM建图》中也谈到了,通过运行下面命令即可实现slam建图
roslaunch turtlebot3_slam turtlebot3_slam.launch
那么具体地,我们来看看这个launch文件的组成(/home/kwanwaipang/catkin_ws/src/turtlebot3/turtlebot3_slam/launch/turtlebot3_slam.launch)
<launch>
<!-- Arguments -->
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<arg name="slam_methods" default="gmapping" doc="slam type [gmapping, cartographer, hector, karto, frontier_exploration]"/>
<arg name="configura


2万+

被折叠的 条评论
为什么被折叠?



