智能无人机开发教程(一)在无人机上跑slam之hector slam

前言

在使用了肖坤老师的xtdrone教程加上我自己的研究之后,可以在无人机+激光雷达的硬件基础上使用了slam算法,并且彻底掌握怎么使用与搭配的方法
本文的基础是xtdrone的例程,但是不局限于此例程,而是添加程序控制与自动运行的部分,并且讲清楚其内部逻辑。
我假定阅读者都有良好的ros基础(熟悉通讯方式、TF、仿真等),不会对基础的地方做详细说明,如果阅读者未有良好ros基础,请自行学习

框架概述

一点注意事项

可能很多人跟随古月居或者赵虚左老师的教程跑过一些激光slam的东西,比如说gmapping什么的,大家可能好奇,无人机是在三维空间中运动的,不像基础版本的无人车是在二维空间中运动的(这里指的是地图是二维的),会不会不匹配?答案是肯定的,不会特别匹配,尤其是在复杂三维环境下,二维激光slam与二维激光雷达的方法完全不适合无人机。
因为二维激光雷达一般旋转然后不断测距,这样就可以扫描到一个平面上各个障碍物到雷达中心点的距离,但是在复杂三维空间环境下,这种方法就不怎么合适了,比如说在树林里面,可能在激光雷达所扫描的平面里面并没有障碍,但是实际上在这个平面的下面就有一个树枝,这种情况会发生什么大家就应该清楚,会容易炸鸡的。
所以如果想在三维空间中使用二维激光slam方法,就需要简单的三维空间环境,什么叫简单的三维空间环境呢?比如说在无人机飞行高度内,各个高度的横截面形状基本上一致,这种就适合二维激光slam运行(毕竟三维激光雷达也贵很多,不是人人买得起的)
在这里插入图片描述
这是肖坤老师的一个例程里面的仿真环境,大家可以发现,这个环境就很符合简单的定义,如果无人机不飞过墙的高度,那么在同一个地点的任何一个高度所扫描到的数据都是一样的,这种情况下我们完全可以使用二维激光slam。
这里有人会问,无人机运动的时候会有倾斜,不会导致扫描到的数据不准确吗?实际上这个是会有的,比如说无人机俯仰的时候,前后方扫描到的距离就会变长,如果想纠正这个误差,那么只能想办法让激光雷达维持水平或者让它具备自动校准功能,在我印象里面思岚某款四千多的雷达可以有自动倾斜补偿功能,在小角度的倾角的情况下可以自动补偿,使得数据准确,但是这个贵,另一种不算方法的方法就是减小无人机的运动加速度和速度的最大值,这样就可以限制无人机运动时候的倾角,从而减小误差,这种技巧在简单三维环境下是可行的,毕竟经费有限的情况下要什么自行车对不对(超小声),如果有更高要求那就只能上三维激光雷达和三维slam算法了。

框架选择原因

因为无人机的里程计是三维形式的,目前还不知道能不能直接用在二维算法上,就选了一个不需要里程计的slam算法,那就是hector slam,这个算法虽然不适合复杂环境和高速运动,但是考虑我们也不会让无人机运动太快和大地图里面跑,这个算法就相当于没有缺点了。

配置slam

安装hector

我是ros melodic版本,所以进行如下安装

sudo apt install ros-melodic-hector-slam*

hector配置与注意事项

首先注意一下,hector slam是不需要里程计的,所以我们要把其launch文件里面的odom_frame和base_frame都修改为机器人坐标系中的base_link
这里参考了另一位博主的博文
速腾聚创Robosense16线激光雷达SLAM建图(一)————Hector建图
我的TF树如下
在这里插入图片描述
虽然不知道为什么mavros节点发布了一堆变换,但是我们只需要注意map->base_link-> (lidar frame)就可以,这里的(lidar frame)大家要换成自己的雷达坐标系,比如说在这个例程里面就是iris_0/lidar_2d
好像xtdrone的例程里面没有机器人基础坐标系到雷达坐标系的转换,这样大家根据雷达的相对位姿自己发布一个变换即可,我这里发布的变换中,只有z是0.1(表示激光雷达在机器人中心的正上方0.1m),其他的参数都是0,如果在实际无人机飞行中,大家自行测量激光雷达相对于无人机中心(应该是飞控)的位姿然后进行发布。

未完待续

猜你喜欢

转载自blog.csdn.net/qq_46202265/article/details/129565147