移动机器人激光SLAM导航(三):Hector SLAM 篇

参考引用

  • Hector_Mapping ROS-Wiki
  • 从零开始搭二维激光SLAM
  • 机器人工匠阿杰
  • wpr_simulation

移动机器人激光SLAM导航(文章链接汇总)

1. 基于滤波器的 SLAM 问题

1.1 什么是 SLAM

  • 什么是SLAM

  • SLAM 就是为了构建地图用的,这个地图可以保存下来,用于后续的定位及导航避障中,也有一些 SLAM 作为里程计在使用,始终提供估计的位姿,目前主流 SLAM 的结构分为前端里程计,后端优化,回环检测三个大模块

    • 前端里程计:始终累加位姿,作为里程计使用
    • 后端优化:使用图的结构模型,优化整体位姿,减小前端里程计产生的累计误差
    • 回环检测:可以提供一个更强烈的图结构的约束,能够更好的减小累计误差

1.2 SLAM 问题的数学表述

  • 运动方程(提供对状态 x x x 的先验 x k − 1 x_{k-1} xk1,正向推理)
    • 其中 x x x 位姿, k − 1 / k k-1/k k1/k 时刻, u u u 控制器输入/运动测量, w w w 噪声

x k = f ( x k − 1 , u k , w k ) x_k=f(x_{k-1}, u_k, w_k) xk=f(xk1,uk,wk)

  • 观测方程(提供对状态 x x x 的后验 x k x_k xk,由果溯因)
    • 其中 z z z 传感器读数, y y y 路标, j j j 路标编号, v v v 噪声

z k , j = h ( y j , x k , v k , j ) z_{k,j}=h(y_j, x_k, v_{k,j}) zk,j=h(yj,xk,vk,j)

  • 已知量:上一时刻位姿 x k − 1 x_{k-1} xk1,控制器输入/运动测量 u k u_k uk,当前时刻对路标 j j j 的观测 z k , j z_{k,j} zk,j
  • 估计量:当前时刻机器人位姿 x k x_k xk(定位),路标 j j j 的位置 y j y_j yj(建图)

1.3 SLAM 概率模型

  • SLAM(Simultaneous Localization and Mapping):给定传感器数据情况下,同时进行机器人位姿和地图估计

    • 得到一个精确的位姿需要与地图进行匹配
    • 得到一个良好的地图需要有精确的位姿
  • SLAM 条件联合概率分布

    • 1 : t 1:t 1:t 表示从起始到 t 时刻
    • z 1 : t z_{1:t} z1:t 表示传感器观测数据(如 /scan)
    • u 1 : t u_{1:t} u1:t 表示里程计测量数据(如 /odom)
    • m m m 表示地图, x 1 : t x_{1:t} x1:t 表示机器人轨迹/位姿估计(定位)

p ( x 1 : t , m ∣ z 1 : t , u 1 : t − 1 ) p(x_{1:t},m|z_{1:t},u_{1:{t-1}}) p(x1:t,mz1:t,u1:t1)

2. Hector_Mapping

2.1 简介

  • Hector_Mapping 是一种无需里程计数据的 SLAM 方法,利用激光雷达获得二维姿态估计,虽然没有回环检测功能,但对于大多真实场景,它是较准确的,该系统已用于无人地面机器人/车辆、手持测绘设备、四旋翼无人机

  • 硬件要求

    • 需要高精度的激光扫描仪(SICK、hokuyo 等),扫描周围环境时,节点会使用 TF 变换,因此无需将雷达固定,并且不需要里程计数据

2.2 话题节点

  • 订阅的话题(Topic)
    • scan (sensor_msgs/LaserScan):订阅 2D 激光雷达扫描数据
    • syscommand (std_msgs/String):如果字符串等于 “reset”,则地图和机器人姿态将重置为初始状态
  • 发布的话题(Topic)
    • map_metadata (nav_msgs/MapMetaData):发布 Meta 地图数据(存储地图描述信息
    • map (nav_msgs/OccupancyGrid):发布占据栅格地图数据
    • slam_out_pose (geometry_msgs/PoseStamped):原始的机器人位姿(无协方差)
    • poseupdate (geometry_msgs/PoseWithCovarianceStamped):校正后的机器人位姿(具有不确定性的高斯估计)
  • Service
    • dynamic_map (nav_msgs/GetMap):获取地图数据
    • reset_map (std_srvs/Trigger):调用这个服务来重置地图,Hector_Mapping 将从头开始一张全新的地图。注意,这不会重新启动机器人的姿势,而是会从上次记录的姿势重新开始
    • pause_mapping (std_srvs/SetBool):调用此服务来停止/开始处理激光扫描
    • restart_mapping_with_new_pose (hector_mapping/ResetMapping):调用此服务来重置地图、机器人的姿势并恢复建图(如果暂停)

2.3 TF 变换

  • 必要的 TF 变换

    • <scan frame> → base_frame:通常为固定值,激光雷达坐标系 与 基坐标系 之间的变换,一般由 robot_state_publisher 或 static_transform_publisher 发布
  • 发布的 TF 变换

    • map → odom:地图坐标系 与 里程计坐标系 之间的变换,估计机器人在地图中的位姿(仅在参数 “pub_map_odom_transform” 为 true 时提供)
  • ROS 中常用坐标系

    • map:地图坐标系,也被称为世界坐标系,是静止不动的
    • odom:里程计坐标系,相对于 map 来说一般是静止的,有些情况下会变动(定位节点为了修正机器人的位姿从而改变了 map->odom 间的坐标变换)
    • base_footprint:位于机器人底盘中心在地面的投影,不提供高度信息,代表机器人的 2D 位姿
    • base_link:位于机器人几何中心,与机器人刚性连接,相对于 base_stabilized 坐标系增加了横滚角和俯仰角
    • base_stabilized:坐标系添加了机器人相对于 map/odom 层的高度信息(对于没有横滚/俯仰运动的平台,base_stabilized 等价于 base_link)
    • laser_link:激光雷达的坐标系,相对于base_link来说是静止的,因为雷达装在机器人上
      在这里插入图片描述

2.4 建图测试

在这里插入图片描述

本小节使用 移动机器人激光SLAM导航(二):运动控制与传感器篇 中安装的测试环境 wpr_simulation(hector_mapping 已在此环境中通过脚本安装)

  • 在 wpr_ws 工作空间新建功能包 slam_pkg
    $ cd ~/wpr_ws/src
    $ catkin_create_pkg slam_pkg roscpp rospy std_msgs
    $ code .      # 在 VSCode 中编辑
    
  • 在 slam_pkg 中新建 launch 文件夹,并在 launch 文件夹中新建 hector.launch 文件
    <launch><!-- 载入机器人和 SLAM 仿真环境 --><!-- 如果使用实体机器人,则将下行代码替换为启动激光雷达和底盘控制的 launch 文件即可 --><include file="$(find wpr_simulation)/launch/wpb_stage_slam.launch" /><!-- Hector SLAM 节点 --><node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" /><!-- rviz 显示 --><!-- 其中 args 是运行该 launch 文件并在 rviz 中添加相关选项后保存的配置文件 --><node pkg="rviz" type="rviz" name="rviz" args="-d $(find slam_pkg)/rviz/slam.rviz" /><!-- 机器人运动控制节点 --><node pkg="rqt_robot_steering" type="rqt_robot_steering" name="rqt_robot_steering" />
    </launch>
    
  • 编译并启动 hector.launch 建图
    $ cd ~/wpr_ws
    $ catkin_make
    $ source devel/setup.bash
    $ roslaunch slam_pkg hector.launch
    

在这里插入图片描述

2.5 建图参数设置 Parameters

  • ~map_update_distance_thresh (double, default: 0.4)

    • 地图更新的移动距离阈值 [单位:米],越小则更新越快
    • 每次地图更新后,机器人必须移动超过这个阈值,或满足 map_update_angle_thresh 参数描述的位移角度变化,才会再次更新地图
  • ~map_update_angle_thresh (double, default: 0.9)

    • 地图更新的旋转角度闯值 [单位:弧度],越小则更新越快
    • 每次地图更新后,机器人必须转动超过这个阈值,并产生超过 map_update_distance_thresh 阈值的位移才会再次更新地图
  • ~map_pub_period (double, default: 2.0)

    • 地图发布的周期 [单位:秒]
<launch><include file="$(find wpr_simulation)/launch/wpb_stage_slam.launch" /><!-- Hector SLAM 节点 --><node pkg="hector_mapping" type="hector_mapping" name="hector_mapping"><param name="map_update_distance_thresh" value="0.1" /><param name="map_update_angle_thresh" value="0.1" /><param name="map_pub_period" value="0.1" /></node><node pkg="rviz" type="rviz" name="rviz" args="-d $(find slam_pkg)/rviz/slam.rviz" /><node pkg="rqt_robot_steering" type="rqt_robot_steering" name="rqt_robot_steering" /></launch>

其他参数请参考 Hector_Mapping ROS-Wiki

  • 调参效果对比 wpb_hector_comparison.launch
<launch><!-- 第一个 Hector_Mapping 建图节点 --><group ns="slam_1"><node pkg="hector_mapping" type="hector_mapping" name="hector_mapping_1"><param name="map_update_distance_thresh" value="0.5"/><param name="map_update_angle_thresh" value="0.5" /><param name="map_pub_period" value="0.2" /><param name="map_frame" value="slam_1/map" /><param name="base_frame" value="slam_1/base_footprint" /><param name="odom_frame" value="slam_1/odom" /></node></group><!-- 第二个 Hector_Mapping 建图节点 --><group ns="slam_2"><node pkg="hector_mapping" type="hector_mapping" name="hector_mapping_2"><param name="map_update_distance_thresh" value="0.1"/><param name="map_update_angle_thresh" value="0.1" /><param name="map_pub_period" value="0.2" /><param name="map_frame" value="slam_2/map" /><param name="base_frame" value="slam_2/base_footprint" /><param name="odom_frame" value="slam_2/odom" /></node></group><!-- **************************** 分割线 **************************** --><!-- 载入 SLAM 的仿真场景 --><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" value="$(find wpr_simulation)/worlds/slam_simple.world"/><arg name="paused" value="false"/><arg name="use_sim_time" value="true"/><arg name="gui" value="true"/><arg name="recording" value="false"/><arg name="debug" value="false"/></include><!-- 载入 1号机器人 --><include file="$(find wpr_simulation)/launch/wpb_slam_template.launch"><arg name="robot_namespace" value="slam_1" /> <arg name="local_x" value="0" /> <arg name="local_y" value="-0.3" /> <arg name="local_yaw" value="0" /> </include><!-- 载入 2号机器人 --><include file="$(find wpr_simulation)/launch/wpb_slam_template.launch"><arg name="robot_namespace" value="slam_2" /> <arg name="local_x" value="0" /> <arg name="local_y" value="0.3" /> <arg name="local_yaw" value="0" /> </include><!-- 运动控制 --><node pkg="rqt_robot_steering" type="rqt_robot_steering" name="rqt_robot_steering"/><!-- 速度话题分流 --><node pkg = "topic_tools" type = "relay" name = "relay_1" args="/cmd_vel /slam_1/cmd_vel" /><node pkg = "topic_tools" type = "relay" name = "relay_2" args="/cmd_vel /slam_2/cmd_vel" /></launch>

3. TF 和 里程计

3.1 TF 系统

  • 地面移动机器人在地图中的位姿描述方式(x, y, yaw)
    在这里插入图片描述

  • ROS 中通过 TF(TransForm,坐标系变换) 来获取机器人具体的定位/位姿数值

    • TF 主要用于描述两个坐标系之间的空间关系
    • TF 关系由特定的 ROS 节点以消息包的形式发布到 /tf 话题中去,其他节点通过订阅这个 /tf 话题来查询坐标系
  • 案例测试

    # 利用 2.4 小节创建的 hector 建图包
    $ cd ~/wpr_ws
    $ source devel/setup.bash
    $ roslaunch slam_pkg hector.launch
    

在这里插入图片描述

  • 查看 /tf 话题类型
    $ rostopic type /tf
    tf2_msgs/TFMessage
    

在这里插入图片描述


在这里插入图片描述

  • 查看 /tf 话题数值

    $ rostopic echo /tf
    ...
    ---
    transforms: - header: seq: 0stamp: secs: 780nsecs: 481000000frame_id: "map"child_frame_id: "scanmatcher_frame"transform: translation: x: 2.27857303619y: 1.645611763z: 0.0rotation: x: 0.0y: 0.0z: -0.352547165132w: 0.935794045908
    ...
    
  • 查看 TF 关系树

    $ rosrun rqt_tf_tree rqt_tf_tree
    

在这里插入图片描述

3.2 里程计

本小节使用 移动机器人激光SLAM导航(二):运动控制与传感器篇 中安装的测试环境

  • hector_mapping 在长直走廊建图
    • 由于缺少参照物特征的变化,导致机器人无法估计自己的位移,建图失败
    • 解决办法:轮子转过的圈数×轮子周长=走过的距离(轮子里程计算法
    $ cd ~/wpr_ws
    $ source devel/setup.bash
    $ roslaunch wpr_simulation wpb_corridor_hector.launch
    

在这里插入图片描述

  • GMapping 在长直走廊建图
    • 由于 GMapping 自带里程计算法,在里程计的帮助下,激光 SLAM 有效克服了建图过程中位移特征缺失的问题
    $ cd ~/wpr_ws
    $ source devel/setup.bash
    $ roslaunch wpr_simulation wpb_corridor_gmapping.launch
    

在这里插入图片描述

  • 激光雷达和里程计输出的 TF 坐标变换关系
    • 激光雷达:map --> base_footprint
    • 里程计:odom --> base_footprint
    • GMapping 的核心算法:先使用里程计推算机器人的位移,再使用激光雷达点云配准算法来修正里程计误差(如:轮子打滑) map --> odom --> base_footprint
      在这里插入图片描述

更直观化的里程计演示请查看视频 什么是里程计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将word中插入的zotero文献转为latex引用样式

在word中&#xff0c;可以使用zotero插件插入和管理参考文献。 例如&#xff1a; 若需要将这段内容移植到latex&#xff0c;就需要将对应的引用编号用\cite{}替换。手动替换非常麻烦且容易出错。要实现自动转换&#xff0c;可在zotero中定制一种新的引文格式&#xff0c;自动将…

常见的6种软件测试用例设计方法

常见的软件测试用例设计方法&#xff0c;个人认为主要是下面这6种&#xff1a; 流程图法&#xff08;也叫场景法&#xff09;等价类划分法边界值分析判定表正交法错误推测法 这6种常见方法中&#xff0c;我分别按照定义、应用场景、使用步骤、案例讲解这4个部分进行讲解。 所…

实习|基于SSM的实习管理系统设计与实现(源码+数据库+文档)

实习管理系统目录 目录 基于SSM的实习管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能介绍 &#xff08;1&#xff09;管理员登录 &#xff08;2&#xff09;实训方向管理 &#xff08;3&#xff09;公告信息管理 &#xff08;4&#xff0…

STM32MP135开发板助力电力行业,IEC61850协议移植笔记

1.概述 IEC61850是变电站自动化系统&#xff08;SAS&#xff09;中通信系统和分散能源&#xff08;DER&#xff09;管理的国际标准。它通过标准的实现&#xff0c;实现了智能变电站的工程运作标准化。使得智能变电站的工程实施变得规范、统一和透明&#xff0c;在电力和储能系…

(java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~

目录 冒泡排序(BubbleSort)&#xff1a; 代码详解&#xff1a; 冒泡排序的优化&#xff1a; 选择排序(SelectSort)&#xff1a; 代码详解&#xff1a; 插入排序&#xff08;InsertSort&#xff09;&#xff1a; 代码详解&#xff1a; 希尔排序(ShellSort)&#xff1a; 法一…

Java中的常用API

常用API Object类浅克隆与深克隆 ObjectsObjects中的equals 包装类StringBuilder和StringBufferStringBuilder是可变字符串对象StringBuffer线程安全案例![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/87649c20e6464113a42aee5f16f1ee22.png) StringJoiner Object…

关于ZYZ旋转和XYZ旋转

ZYZ旋转和XYZ旋转 概述1、XYZ旋转2、ZYZ旋转 概述 以下公式默认为右手坐标系&#xff1b;ZYZ通常可以避免死解情况&#xff0c;因此在六轴末端解算时常被用到&#xff1b;参考文章 1、XYZ旋转 XYZ旋转一般是绕固定轴旋转(外旋)&#xff0c;旋转矩阵的构成为&#xff1a;RzRy…

软考 系统分析师系列知识点之需求管理(3)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之需求管理&#xff08;2&#xff09; 所属章节&#xff1a; 第11章. 软件需求工程 第8节. 需求管理 11.8.4 需求跟踪 根据IEEE的定义&#xff0c;可跟踪性包含两个层面的含义&#xff1a;一个是开发过程的两个或多个产品之…

无广告iOS获取设备UDID 简单方便快捷

ps&#xff1a; 为啥不用蒲公英了&#xff0c;就是因为有广告了&#xff0c;获取个UDID还安装游戏&#xff0c;真恶心?&#xff0c;所以找了新的获取UDID都方法&#xff0c;网页直接获取就可以&#xff0c;不会安装软件。 UDID 是一种 iOS 设备的特殊识别码。除序号之外&…

(1)cpu0简介

一、cpu0介绍 cpu032位架构16位通用寄存器&#xff0c;协处理器和其他特殊寄存器 &#xff08;1&#xff09;通用寄存器 全局指针寄存器&#xff1a;"Global Pointer register"&#xff08;全局指针寄存器&#xff09;是一个在某些处理器架构中存在的专用寄存器&…

单臂路由实验(思科)

一&#xff0c;实验目的 在路由器的一个接口上通过配置子接口的方式&#xff0c;实现相互隔离的不同vlan之间互通。 二&#xff0c;设备配置 Switch1 Switch>enable 全局模式 Switch#configure terminal 配置模式 Switch(config)#vlan 10 …

【leetcode】20. 有效的括号

有效的括号 题目链接 // 栈结构 typedef char valuetype; typedef struct {valuetype* arr;int top;int capacity; } Stack;void Init(Stack* stack);void Push(Stack* stack, valuetype value); void Pop(Stack* stack);valuetype Top(Stack* stack); int Size(Stack* stack…

嵌入式中C 语言中的三块技术难点

C 语言在嵌入式学习中是必备的知识&#xff0c;甚至大部分操作系统都要围绕 C 语言进行&#xff0c;而其中有三块技术难点&#xff0c;几乎是公认级别的“难啃的硬骨头”。 今天就来带你将这三块硬骨头细细拆解开来&#xff0c;一定让你看明白了。 0x01 指针 指针是公认最难理…

26元/月起!腾讯云一键自动搭建4核16G幻兽帕鲁服务器

腾讯云无需任何配置自动搭建幻兽帕鲁游戏联机服务器&#xff0c;游戏24小时在线&#xff0c;4核16G游戏联机服务器低至26元/月起&#xff0c;新手小白也能一键搭建属于自己的幻兽帕鲁游戏联机服务器&#xff01; 第一步&#xff1a;购买游戏联机服务器 购买入口&#xff1a;htt…

Django知识随笔

目录 1.如何再ajax中传输post数据&#xff1f; 2.在form表单中使用jquery序列化&#xff0c;input框过多。 1.如何再ajax中传输post数据&#xff1f; 在ajax传递的那个网址&#xff0c;会调用你路由的视图函数&#xff0c;在视图函数上面加一句 csrf_exempt 。写上之后会有提…

Android:RecyclerView跨行跨列的LayoutManager:Spannedgridlayoutmanager

前言&#xff1a; RecyclerView可以使用GridLayoutManager实现跨行&#xff0c;但是不能跨列&#xff1b;瀑布流布局可以跨列但是又不能跨行。原生自带的各个LayoutManager中并没有可以又跨行又能跨列的。网上搜寻了一番&#xff0c;找到了一个亲测可行好用的三方库&#xff1…

DL/T1578-2021电力线路多旋翼无人机巡检系

DL/T1578-2021电力线路多旋翼无人机巡检系 DL/T 1578—2021标准的发布和实施对于架空电力线路的巡检工作具有里程碑式的意义。它不仅填补了多旋翼无人机巡检系统在行业标准方面的空白&#xff0c;还为电力行业提供了一套完整、科学的测试和评估方法。这将有助于提高架空电力线…

使用apifox创建一个Mock Server Api 接口

安装 下载 Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能&#xff0c;接口开发、测试、联调效率&#xff0c;提升 10 倍。最好用的接口文档管理工具&#xff0c;接口自动化测试工具。 创建mock api项目中使用 创建项…

构建LLM辅助生物威胁制造预警系统 人类越发展获取的超能力越大,破坏力越大,威胁越大。我们需要什么样的预警系统?既克服威胁又具有超能力 安全基础

https://openai.com/research/building-an-early-warning-system-for-llm-aided-biological-threat-creation 人类越发展获取的超能力越大&#xff0c;破坏力就越大&#xff0c;威胁越大。 人工智能就是为了赋予人人都能有超能力&#xff0c;而一旦被恶意或无意使用又威胁到人…

生产问题排查系列——未知404状态接口请求

引言 我们的产品主打金融服务领域&#xff0c;以B端客户为我们的核心合作伙伴&#xff0c;然而&#xff0c;我们的服务最终将惠及C端消费者。在技术实现上&#xff0c;我们采用了公司自主研发的微服务框架&#xff0c;该框架基于SpringBoot&#xff0c;旨在提供高效、可靠的服…