学习hector_slam(三)随手记录:hector_mapping

hector_mapping是hector_slam的重要部分之一。map就是rviz上的输出地图。

package 摘要

    hector_mapping是一种SLAM方法,可以在没有里程表的情况下使用,也可以在显示(传感器、平台或两者的)侧倾/俯仰运动的平台上使用。它利用现代LIDAR系统(如Hokuyo UTM-30LX)的高更新率,并以传感器的扫描速率(对于UTM-30LX为40Hz)提供2D姿态估计。虽然系统不提供明确的闭环能力,但对于许多真实世界场景来说它足够准确。 该系统已成功应用于无人机地面机器人,无人地面车辆,手持式地图绘制设备以及来自四旋翼无人机的记录数据。



Overview 概述
示例视频链接:http://www.youtube.com/playlist?list=PL0E462904E5D35E29



硬件需求
    想用hector_mapping,你需要sensor_msgs/LaserScan数据源(例如Hokuyo UTM-30LX LIDAR或是包文件)。这个节点用tf转换扫描到的数据,所以LIDAR(激光探测与测量)不必与指定的base frame相关确定。也不需要里程计数据。
    注:LiDAR——Light Detection And Ranging,即激光探测与测量。是利用GPS(Global Position System)和IMU(Inertial Measurement Unit,惯性测量装置)机载激光扫描。




ROS API(应用程序编程接口)
    
    1.hector_mapping
      hector_mapping是一个基于LIDAR的SLAM的节点,没有里程计和低计算资源。为了简单起见,下面详细介绍的ROS API从用户角度提供了常用选项的信息,但不是所有可用于调试的选项。
    (1)订阅话题
   >>scan(sensor_msgs/LaserScan):通过SLAM系统使用激光扫描
     sensor_msgs/LaserScan.msg
     从平面激光测距仪进行单次扫描。如果您有另一个具有不同行为的测距设备(例如声纳阵列),请找到或创建不同的消息,因为应用程序将对此数据做出相当激光特定的假设。
     紧凑的消息定义:
         std_msgs/Header header    #header中的时间标记是扫描中第一条射线的采集时间。在帧frame_id中,围绕正Z轴测量角度(逆时针,如果Z向上),零角度沿着x轴向前
         float32 angle_min         #扫描起始角[rad]
         float32 angle_max         #扫描终止角[rad]
         float32 angle_increment   #测量之间的角距离[rad]
         float32 time_increment    #测量之间的时间[秒] - 如果扫描仪正在移动,则在三维点插值位置使用 
         float32 scan_time         #扫描间隔时间
         float32 range_min         #最小范围值[m]
         float32 range_max         #最大范围值[m]
         float32[] ranges          #范围数据[m](值          float32[] intensities     #强度数据[设备特定单位]。 如果您的设备不提供强度,请将数组留空。


   >>syscommad(std_msgs/String):system command.如果序列string等于'reset',则地图和机器人的姿态都重置到最初的状态。


    (2)发布话题
  >>map_metadata (nav_msgs/MapMetaData):从话题得到锁定的地图数据并定期更新
    注:nav_msgs/MapMetaData.msg   这保存了占用率栅格的特性的基本信息
    紧凑的消息定义:
        time map_load_time             #地图加载时间
        float32 resolution             #地图分辨率[m/cell]
        uint32 width                   #地图宽度[cells]
        uint32 height
        geometry_msgs/Pose origin      #地图的原点[m,m,rad].这是地图中单元格(0,0)的真实世界姿态。geometry_msgs/Pose 姿态在自由空间中的表示,由位置(point position)和方向(Quaternion orientation)组成。


   >>map(nav_msgs/OccupancyGrid):从话题得到锁定的地图数据并定期更新
    nav_msgs/OccupancyGrid.msg
    原始消息定义:
    Header header  # 这代表了一个2D的栅格地图,其中每个单元都代表被占用的概率
    MapMetaData info      # 地图的原始数据
    int8[] data   # 地图数据,行优先顺序,从(0,0)开始;占用概率在[0,100]范围内
    紧凑的消息定义:
    std_msgs/Header header  #std_msgs/Header.msg通常用于传递时间标记数据在特定坐标系中。uint32 seq    time stamp     string frame_id
    nav_msgs/MapMetaData info  #nav_msgs/MapMetaData.msg保存OccupancyGrid的特性的基本信息 长×宽建立地图[m,m,rad]包含位置和方向信息
    int8[] data


  >>slam_out_pose (geometry_msgs/PoseStamped):没有协方差的情况下估计机器人的姿态
    geometry_msgs/PoseStamped.msg  具有参考坐标系和时间标记的姿态
    紧凑的消息定义:std_msgs/Header header    #用于高级标记数据类型的标准元数据。这通常用于在特定坐标系中传送时间标记的数据。 与此数据相关联的frame 0:no frame 1:global frame
                   geometry_msgs/Pose pose   #姿态在空闲空间中表示,由位置和方向组成。


  >>poseupdate (geometry_msgs/PoseWithCovarianceStamped):根据高斯估计的不确定性估计机器人的姿态
    geometry_msgs/PoseWithCovarianceStamped.msg 表达具有参考坐标帧和时间标记的姿态估计
    紧凑的消息定义:std_msgs/Header header
                   geometry_msgs/PoseWithCovariance pose   #这代表了一个在具有不确定性的空闲空间的姿态。定义:geometry_msgs/Pose pose  float64[36] covariance  #6×6协方差矩阵的行优先表示,方向参数用固定轴表示,参数依次为:(x,y,z,rotation about X axis,rotation about Y axis,rotation about Z axis)


    (3)Services 服务
    dynamic_map (nav_msgs/GetMap):调用此服务以获取地图数据
    nav_msgs/GetMap.srv 定义:nav_msgs/OccupancyGrid map
    nav_msgs/OccupancyGrid.msg
    原始消息定义:
    Header header  # 这代表了一个2D的栅格地图,其中每个单元都代表被占用的概率
    MapMetaData info      # 地图的原始数据
    int8[] data   # 地图数据,行优先顺序,从(0,0)开始;占用概率在[0,100]范围内
    紧凑的消息定义:
    std_msgs/Header header  #std_msgs/Header.msg通常用于传递时间标记数据在特定坐标系中。uint32 seq    time stamp     string frame_id


    (4)Parameters参数
    ~base_frame (string, default: base_link):机器人基本坐标系base_frame,用于定位和用于激光扫描数据的变换的坐标系
    ~map_frame (string, default: map_link):map的坐标系
    ~odom_frame (string, default: odom):里程计坐标系
    ~map_resolution (double, default: 0.025):地图的分辨率[m]这是每个栅格单元边缘的长度
    ~map_size (int, default: 1024):地图的大小(每个轴的单元格数量)。地图是有栅格单元的正方形的(map_size * map_size)
    ~map_start_x (double, default: 0.5):/map坐标系在x轴上相对于栅格地图的原点[0.0,1.0]的位置,0.5在中间。
    ~map_start_y (double, default: 0.5):/map坐标系在y轴上相对于栅格地图的原点[0.0,1.0]
    ~map_update_distance_thresh (double, default: 0.4):执行地图更新的阈值[m].平台必须以米为单位传播,或者从之前最后一次更新到下一次地图更新发生之前经过map_update_angle_thresh参数所描述的角度变化。
    ~map_update_angle_thresh (double, default: 0.9):执行地图更新的阈值[rad].平台必须从之前最后一次更新到下一次地图更新发生之前通过行程参数描述的那样经过一次角度的变化
    ~map_pub_period (double, default: 2.0):地图发布期[s]
    ~map_multi_res_levels (int, default: 3):地图多分辨率栅格级数
    ~update_factor_free (double, default: 0.4):用于更新范围[0.0,1.0]中的空闲单元格的地图更新修改器。 值0.5表示没有变化。
    ~update_factor_occupied (double, default: 0.9):用于在范围[0.0,1.0]中更新被占用单元的地图更新修改器。 值0.5表示没有变化。
    ~laser_min_dist (double, default: 0.4):系统使用的激光扫描端点的最小距离[m]。 距离此值更近的扫描端点将被忽略。
    ~laser_max_dist (double, default: 30.0):系统使用的激光扫描端点的最大距离[m]。 超出此值的扫描端点将被忽略。
    ~laser_z_min_value (double, default: -1.0):相对于激光扫描仪框架的最小高度[m],用于系统使用的激光扫描终点。 低于此值的扫描端点将被忽略。
    ~laser_z_max_value (double, default: 1.0):相对于激光扫描仪框架的最大高度[m],用于系统使用的激光扫描终点。 高于此值的扫描端点将被忽略。
    ~pub_map_odom_transform (bool, default: true):决定系统是否应该发布map->odom转换
    ~output_timing (bool, default: false):通过ROS_INFO处理每个激光扫描的输出时序信息。
    ~scan_subscriber_queue_size (int, default: 5):扫描用户的队列大小。 如果日志文件以比实时速度更快的速度回放到hector_mapping,则应将此值设置为高值(例如50)。
    ~pub_map_scanmatch_transform (bool, default: true):决定是否应将扫描匹配器映射到地图转换发布到tf。 帧名称由“tf_map_scanmatch_transform_frame_name”参数确定。
    ~tf_map_scanmatch_transform_frame_name (string, default: scanmatcher_frame):发布扫描匹配器到地图转换时的坐标系名称,如上述参数中所述。


    (5)请求tf转换
    → base_frame
    将坐标系与扫描的数据联系起来 得到base_frame
    通常是一个固定的值,由robot_state_publisher或tf static_transform_publisher定期广播。
    注:1.robot_state_publisher:此包允许您将机器人的状态发布到tf。 一旦状态发布,它可用于系统中所有也使用tf的组件中。 该包利用机器人的关节角作为输入,并且使用机器人的运动树模型来发布机器人链接的3D姿态。 该包既可用作库,也可用作ROS节点。 这个包已经过良好的测试,代码是稳定的。 在不久的将来不计划进行重大改变。robot_state_publisher使用由参数robot_description指定的URDF和来自话题joint_states的关节位置来计算机器人的前向运动学,并通过tf发布结果。参考链接[在自己的robot上使用robot state publisher]:http://wiki.ros.org/robot_state_publisher/Tutorials/Using%20the%20robot%20state%20publisher%20on%20your%20own%20robot
    2. static_transform_publisher
    static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
    使用x / y / z偏移量(以米为单位)和偏航/俯仰/滚动(以弧度为单位)将静态坐标变换发布到tf。 (偏转是绕Z的旋转,俯仰是绕Y的旋转,滚动是绕X的旋转)。 周期(以毫秒为单位)指定发送转换的频率。 100ms(10hz)是一个很好的值。
    static_transform_publisher x y z qx qy qz qw frame_id child_frame_id  period_in_ms
    使用以米和四元数为单位的x / y / z偏移量将静态坐标变换发布到tf。 周期(以毫秒为单位)指定发送转换的频率。 100ms(10hz)是一个很好的值。
    tatic_transform_publisher设计为手动使用的命令行工具,以及在roslaunch文件中用于设置静态变换。 例如:  
 1
 2

 3

launch可以聚合节点,很好用。



    (6)提供tf转换

    map → odom :在地图坐标系内的机器人姿态的当前估计(仅当参数“pub_map_odom_transform”为真时提供)


你可能感兴趣的:(hector_slam,翻译网络存档)