今年的要求较前两年有明显不同,前两年只是简单的仿真,而今年则是直接仿真国赛部分内容
在阅读指南之前,希望大家明确几个点
第一,在开始之前一定要先去读一读赛事方的规则,而且要仔细读,不然很有可能做出来的东西并不符合赛事方的要求
第二,省赛部分的难度其实尚可,本质是对AI工具的灵活运用,所以这次讲的思路,实际上也只是如何利用好AI的思路
第三,阅读指南时,如有不解或困惑,一定要及时提问
第四,参考文件还存在诸多不完美之处,仅供参考,目前已知的缺陷是避障功能欠缺,导致导航成功率不是100%,但也还好,在七八成左右
第五,文件到手记得自己编译下,如果你忘了,那你告诉我你学了个啥
下面开始分析本次省赛的核心要求,用简单明了的话说,就是完成一个仿真任务,一辆小车在一张特定的地图中,先完成建图,后完成自动定点导航,以及在特定区域对人物的准确识别,这是大体的需求,接下来掰开了讲详细需求
首先,需要有一张地图,赛方的规则里给出了这张地图的模型及尺寸,但是是以图片的形式,需要我们自己去转化为可用的三维模型,并在gazebo里加载,这里有一个注意点,想要在导航的时候对人物进行识别,就需要提前在地图里放好人物的贴图(后面会讲怎么放);剩下的就是需要一辆仿真小车,赛方明确表示使用开源小车只得基础分,说的很明白,用开源小车的分数就是没有别人高,只不过当下时间紧任务重,怎么选择看你们自己。这个小车需要实现几个目标,一是需要能动起来,完成跑图的任务,同时不能乱跑,需要定位手段实现路径规划和避障,雷达就是必不可少的定位装置,当然还有一个不可或缺的定位装置就是机器人的地盘——轮式里程计,通过机器人走了多少路粗略估计机器人的位移变化。最后就是实现人物的识别功能,思路很简单,拍下仿真场景的照片(当然是由小车在仿真环境中自己拍摄),在跑完导航后对得到的照片进行识别,这就需要在小车上放虚拟摄像头。最后就是整合这些要求所需要的文件——gazebo仿真的world文件、小车的urdf及xacro文件(包含了小车的建模和功能实现)、建图的launch文件、定点导航的launch文件和用于自动导航和拍照识别的script脚本
下面开始具体操作,操作中所用到的文件内容都可以在群里找到
第一步,完成地图的建模并导入gazebo

首先在建模软件中(SW,Inventor等)完成对地图的三维建模,注意赛方给出的地图图片中,墙体是存在厚度的,随后将地图模型另存为STL文件
- 注意
保存出来的文件为xxx.STL,请将大写的STL改为小写的stl再导入Ubuntu虚拟机中,否则gazbeo无法识别
gazbo本身并不直接识别stl文件,事实上sdf文件才是gazebo的模型文件,我们可以通过固定的代码和文件框架,实现把stl变为sdf模型的功能
在导入之前先讲一下gazeb模型库的文件结构
一个总的文件夹gazebo_model,代表了这个模型库的库名,这个名字并不是十分重要,可以任意命名,下面的几个分文件夹,每一个文件夹对应了一种模型,地图就是其中一个模型
我们打开map文件夹,看到里面有三个文件,一个是我们导出的stl文件,一个是model.config,是对模型文件信息的一些描述,比如作者、邮箱、描述等,不算是一个重要的文件,重要的文件是后面的sdf文件,受限于篇幅和水平,没有办法详细讲解sdf文件的细节,大家如果使用的是自己的stl,需要替换下图两个地方的路径
如何查看自己的stl在什么地方,这里可以使用终端查看,在stl所在的目录下右键,点击Open in Terminal,如图,会在当前目录下打开终端
终端中的蓝字部分就是当前文件夹所在的路径,比如图中的就是~/Desktop/gazebo_model/map,这里最前面的~符号,我们并不能在文件中直接这么写,实际上,~对应的路径是/home/你的用户名,这个用户名是创建系统时输入的用户名,也可以在桌面上看到
比如这里就是/home/wb,再把后面的地址拼接起来,最后你需要在sdf文件里替换的路径就变成了/home/wb/Desktop/gazebo_model/map/xxx.stl(注意stl不论是文件还是sdf里都要改成小写),注意有两处路径需要改
顺便讲一下贴图是怎么在gazebo里实现的,实际上是生成了一个厚度很小的立方体,把图片写成material文件形式,给这个立方体的六个面都贴上material,就实现了贴图功能,比如砖块就是正方体贴上砖块材质的贴图而来,有兴趣的同学可以研究一下贴图的文件结构,这里就不赘述了
得到了所有需要使用的模型文件之后,我们需要导入gazebo,并保存为world
我们打开gazebo,点击左上角的Insert,随后点击Add Path,添加我们自己的模型库的路径
- 注意导入时选择的是文件夹,我们直接选择整个库文件夹即可

点击gazebo_model,然后点击右上角的Open
顺利的话会在左边一栏里看到导入的模型
随后点击其中的map,鼠标拖动到右边的仿真世界中,顺利的话会出现地图的模型文件
鼠标移动可以带动模型文件动,按住ctrl移动鼠标可以使地图吸附网格,这对后面可能需要的平移旋转操作同样适用,随后再次点击鼠标左键即可放下地图
放贴图的过程和放地图的过程别无二致 - 很多人会存在地图是竖着放置或是贴图是倒过来的情况,可以使用gazebo自带的操作工具,平移和旋转之后,得到正常的模型

- 完成之后我们点击右上角的File,在展开的选项中我们选择Save World As,以文件形式保存,可以放在自己工具包的worlds目录下面,命名随意,但注意保存成xxx.world,这个.world的扩展名需要自己手动加
第二步 完成仿真机器人的建模和功能实现
本次比赛的一大难关已经度过,接下来是更难的一关,自建机器人,如果是使用开源模型则可以跳过这一段,当然有些开源机器人不含摄像头,要自己想办法加一下
描述机器人的模型也有三种格式urdf,xacro和sdf,没错又是sdf,不过这次用不到,讲前两个urdf是通用的机器人描述格式,而xacro可以理解为是urdf的增强版本,对机器人的一些变量做了宏定义,方便我们后期更改尺寸之类的一些参数
首先来生成urdf,在赛方给出的实验指导中,直接把问AI的话术都给你写好了
直接用AI生成urdf即可,可以在rviz中加载自己的机器人模型检查是否正常,对应我发的包的launch文件夹内的display.launch,记得把里面urdf的路径改成自己的,urdf和xacro我习惯放在工具包下一个urdf的文件夹,方便调用和管理,urdf只是负责大体建模,如果需要修改的尺寸,请直接让AI重新生成urdf,不要在urdf文件中修改尺寸,urdf的特性是牵一发而动全身,另一种思路就是用AI将urdf写成xacro后再通过xacro修改尺寸,会简单一点,但要学会自己看参数
同时,我们需要实现的各种功能,也可以通过再xacro中注入gazebo仿真插件实现,这些都可以靠AI完成,当然查阅gazebo或者ros官方的wiki也可以,前提是你有时间和代码基础
xacro中有很大一部分是形状、尺寸的定义,以及各个物体之间如何组合在一起的关系,涉及到xyz的坐标和RPY的旋转,还涉及到关节绕哪个轴旋转,所以说自己的模型哪里有问题都可以通过改上面那些参数修改,可以自己尝试修改,并查看变化,这部分确实可以让AI帮你修改,但是AI不一定会判断对轴,比如你要旋转90°,但是AI不一定会按着正确的旋转轴旋转,这时候需要自己有判断能力
我的xacro文件在urdf文件夹下的1.xacro,有兴趣可以研究下,本着赛方的不抄袭不雷同原则,还请各位把尺寸什么的改一下,思路可以打开,比如圆盘车身改成矩形车身等
第三步,完成建图
先说建图的大概原理,通过建图算法,融合小车的里程计和雷达,在移动小车的过程中扫描地图,最后保存地图
这里我们用比较传统的slam_gmapping算法,当然建图的算法不止一种,我这种谈不上出色,但是足够稳定,类似的算法有hector_slam,纯激光建图,但是在空旷的地方建图效果并不理性,感兴趣的同学可以试试别的建图算法
建图还有比较重要的是编写launch文件,都给你们写好了
有几个关键的地方,一个是world的路径,这里的(find test)代表查找test工具包的根目录,后面的内容相信大家看得懂,就是这个目录下有worlds文件夹,而world文件就在这个文件夹下面
机器人的xacro文件路径同理,在spwan robot这里,可以修改xyz的值,改变机器人在gazebo中生成的位置
在gmapping中,如果是你们自己建的urdf和xacro,很有可能你们的base_frame不是chassis,而是其他的比如base_link或是base_footprint,详细不清楚可以问AI
文件编辑好后就可以启动launch文件了,如何启动launch文件有在去年的指南中提到,属于是基础问题,roslaunch test(工具包名) mapping.launch(launch文件名)
在launch文件中我集成了键盘控制,如果想要移动小车,需要保持终端在前台,也就是鼠标点一下终端,可以往上翻一翻看到按键指南,这里面的"i"是前进、","是后退,J和L分别是左转和右转,q和z可以改变最大速度,K可以原地停下
建图时,看着gazebo的仿真页面,同时保持终端在前台,尽量不要让小车太快,也不要让小车撞墙,以免降低建图效果,建图完成后,确认rviz中的地图效果还不错的情况下,打开新的终端,输入保存地图的命令rosrun map_server map_saver -f ~/map/my_map
-f后面的参数是地图保存的路径,~代表什么前面讲过了,我习惯存在工具包下的maps文件夹内方便调用和管理
一定要看到终端保存成功的信息再关掉所有程序
第四步,完成定点导航和识别
翻过了前三座大山,接下来就都没那么难了,关于机器人的定点导航,怎么定点,也是有讲究的,两点之间不应距离太远,除非两点之间地形很单一,比如出发的那一条直路,可以定一个点
其次就是定点不应太过靠近障碍物,否则会导致小车无法到达的问题,导致导航失败
关于如何定点,这里引用机器人工匠阿杰的视频,里面介绍了一个非常高效的定点工具
点击跳转
在完成所有标点后,会得到一个waypoint.xml文件,里面记录了所有点的位置信息
我会把这个文件挪动到工具包下waypoints文件夹内,方便调用和管理
这之后就是导航了,我们可以用一个python文件实现读取xml,并自动发点导航,得益于ros的话题发布和订阅机制,机器人只有到位之后,python文件才会发布下一个航点
同时我在脚本里写了,到指定点位后进行拍照的操作,存在工具包内的images文件夹内
最后再跑完所有航点的情况下,会运行识别程序,需要用到训练好的模型,也就是.pt文件,我把它和py文件放在了一起,都在scripts文件夹下,但是在detect_cpu文件夹里,模型,图片的路径大家都要替换成自己的绝对路径
- detect_cpu.py运行需要一定的环境,直接运行会报错,大家做到这一步之后可以来问我
- 导航的launch文件我放在了launch文件夹下的nav.launch里,记得自己改相关路径,涉及到AMCL导航算法,讲起来过于复杂,有兴趣了解的可以移步机器人工匠阿杰的视频
最后的运行流程:打开两个终端,一个运行roslaunch 包名 nav.launch,另一个运行rosrun包名 nav.py,rosrun可以运行包内的python文件
评论