引言
大家好,最近新入手了一台myAGV JN这是elephant robotics在myAGV升级后的版本。最近有对SLAM相关知识感兴趣,想深入了解一些关于ROS中SLAM的一些算法和规划,跟据官方提供的gitbook,主要使用到了gmapping算法来建图导航实现功能的。
本篇得到文章主要探讨如何通过调整gmapping算法和其他软件层面的优化来提升myagv的精度,在不依靠硬件的条件情况下。
产品介绍
myAGV-Jetson Nano
这是第二代的myAGV,第一代的只有raspberry Pi 4B版本,算力方面有所欠缺,在二代的时候推出了一Jetson Nano为主控的版本,能够满足ROS 大部分的需求,Jetson Nano 能够满足大部分的嵌入式机器人的算力需求。
对比之前还多了很多的配件,可以搭载3D摄像头做一些视觉的建图,一块显示屏安装在车身上比较方便操作,还有额外的增加了一块储能电池,比之前更耐用了(之前的1h差不多就趴窝了),因为都是看过raspberry 第一版的测评和使用情况,对这个升级版本还是很大的期待的。
搭配了一个雷达,高性能的行星直流无刷电机,保留了竞赛级别的万向轮,在原有的基础上开放了python 的控制接口,适配了图形化编程等软件。最让我心动的是,主控板为此提供了强大的图形处理能力,并且还支持3D建图和导航。
Jetson Nano B01
NVIDIA Jetson Nano B01是一款小型但强大的嵌入式计算开发板,专为人工智能(AI)和机器学习(ML)应用设计。
主要性能:
- NVIDIA Maxwell架构的GPU,包含128个CUDA核心。
- 四核ARM Cortex-A57 CPU,主频为1.43 GHz。
- 4GB LPDDR4内存,位宽为64位,频率为1600MHz。
基于这些性能Jetson Nano BO1 适用于各种AI和嵌入式应用场景,尤其是机器人方面的自动导航,运动控制,路径规划等等。
gmapping
gmapping是一种SLAM(Simultaneous Localization and Mapping)常用的算法,他使用粒子波率方法在机器人移动的过程中同事构建环境地图并且估计机器人的位置和姿态。
过程
使用的过程
进入的界面是Ubuntu系统,方便了使用ROS进行操作,具我所了解,主机里原本就已经配置好了一些相关的基础建图信息。
对于初次使用类似这种机器人来说非常的友好,提供了一个UI界面哪里不会点哪里。
一顿鼠标点下来,不用几分钟,就可以打开雷达运行gmapping来进行环境建图了。
这个UI界面非常友好,功能相对来说还是比较完善的,但是只基于最基础的建图和导航功能,如果说是要做其他的一些项目开发,就没有太大的用处了,只适用于初学者,想要快速上手。
之后就开始可以建图了。用VNC进行远程链接,通过键盘控制myAGV在所要导航的环境中进行建图。
目前为止,所有的环节都是顺利的,如果不想用UI也可以 自行输入命令行来执行环境建图的功能,以下内容都是大象机器人封装好的功能,以下命令都要在命令行当中运行。
# 启动雷达
roslaunch myagv_odometry myagv_active.launch
#运行gmapping建图文件
roslaunch myagv_navigation myagv_slam_laser.launch
# 开启键盘控制
roslaunch myagv_teleop myagv_teleop.launch
#完成建图步骤之后需要进行保存map
rosrun map_server map_saver
在导航的功能包中,更改刚建图的路径。
关闭建图的终端,运行导航的命令。
roslaunch myagv_navigation navigation_active.launch
这个时候,关键点来了,最好吧myagv放置在建图时候小车出发的为止,或者在RViz当中进行更改,确保Myagv在地图中的位置和实际环境中的位置相同才能够保证导航的时候能够正确的前往目的地。
点击顶部工具栏的“2D Pose Estimate” 进行调整,使得Rviz界面的小车和实现的小车可对应上,此时终端会返回小车相对于地图的坐标和航向角。
甚至还可以进行分布导航,记录下要前往的导航点的参数,xy坐标与航向角yaw,但是在导航的过程中发现了一些问题,很关键原因就是他不是特别的精准,导航10次,10次都会根据原来的路径有一定的偏差。
提出的问题并解决
为什么会出现偏差的问题?是什么原因导致出现偏差?
主要有两方面的原因,1是硬件方面传感器的误差,2是软件方面算法的局限性。
以下是我解决的方法,都是根据ROS官方给出的参数进行调整。
gmapping - ROS Wiki
- 通过修改雷达的参数,主要有一下几个参数
- maxRange和maxUrange
maxRange:设置激光雷达的最大探测距离。确保此值与激光雷达的实际测量范围相匹配。
maxUrange:用于构建地图的最大有效距离。一般比maxRange稍小,设置成实际测量距离的一个合理值。
- sigma
表示激光雷达测量的标准差。数值越小,表示测量越精确。
根据激光雷达的实际性能调整该值,以减少测量噪声的影响。
- kernelSize
表示扫描匹配的窗口大小。较大的值可以增加匹配的鲁棒性,但也会增加计算量。
调整该参数以平衡计算时间和匹配精度。
- lstep和astep
lstep:线性步长,表示在扫描匹配过程中,平移步长的大小。
astep:角度步长,表示在扫描匹配过程中,旋转步长的大小。
减小这些步长可以提高扫描匹配的精度,但也会增加计算负担。
- particles
粒子的数量。更多的粒子可以提高定位的准确性和稳定性,但也会增加计算开销。
在计算资源允许的情况下,适当增加粒子数量。
- xmin、ymin、xmax、ymax
设置地图的边界,确保这些值能够涵盖机器人运行的整个区域。
适当调整地图边界,可以减少无效区域的计算,提高整体效率。
<launch>
<arg name="scan_topic" default="scan" />
<node pkg="gmapping" type="slam_gmapping" name="gmapping" output="screen" clear_params="true">
<param name="base_frame" value="base_footprint"/>
<param name="odom_frame" value="odom"/>
<!--param name="odom_frame" value="odom_combined"/-->
<param name="map_update_interval" value="0.1"/>
<!-- Set maxUrange < actual maximum range of the Laser -->
<param name="maxRange" value="5.0"/>
<param name="maxUrange" value="4.5"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="0"/>
<param name="srr" value="0.01"/>
<param name="srt" value="0.02"/>
<param name="str" value="0.01"/>
<param name="stt" value="0.02"/>
<param name="linearUpdate" value="0.5"/>
<param name="angularUpdate" value="0.436"/>
<param name="temporalUpdate" value="-1.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="80"/>
<param name="xmin" value="-1.0"/>
<param name="ymin" value="-1.0"/>
<param name="xmax" value="1.0"/>
<param name="ymax" value="1.0"/>
<param name="delta" value="0.05"/>
<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.01"/>
<param name="lasamplerange" value="0.005"/>
<param name="lasamplestep" value="0.005"/>
<remap from="scan" to="$(arg scan_topic)"/>
</node>
</launch>
- 调整里程计的参数
里成计模型:
- 校准里程计模型参数,确保其准确反映机器人的运动特性。
- 检查并调整轮子的半径、轴距等参数,减少模型误差。
传感器结合:
- 结合IMU数据,通过扩展卡尔曼滤波器(EKF)等方法进行传感器数据融合,提高定位精度。
- 确保里程计和IMU数据的时间同步,减少时序误差。
3gmapping算法调整:
- 粒子滤波误差:Gmapping使用粒子滤波算法,粒子的数目和分布会影响精度。如果粒子数量不足或分布不合理,可能导致误差。
- Gmapping算法中的参数(如粒子数、步长、噪声模型等)设置不当,会影响定位和建图的精度。
调节这些参数来提高SLAM算法的精度,在实践当中就可以确保myAGV运行的时候误差不会太大。
需要根据周围的环境,进行大量的调节参数,然后进行测试,才能够确保建图的精准只有在建图精准了,导航也才能够保证精准。
总结
总的来说,我觉得myAGV表现还是挺不错的,无论是性能、使用体验,还是配套资料,都让人觉得友好,对初学者来说很容易上手。目前,我还在不断地使用和熟悉这个产品,之后打算做一些有趣的项目,希望能充分利用Jetson Nano BO1的潜力,把AI和大模型结合起来。如果你有任何好的建议,随时分享!