这一期接上一期安装ros的教程,请安装完ros的同学来看这一章博客
首先我们来分析一下省赛仿真部分需要我们做什么
这里要纠正一下前面省赛指南文档里的一些问题,里面的分析是针对实机的,与我们仿真部分并没有太大的关系,大家可以先不看那个指南
我们可以看到仿真部分的要求,我来一一解剖
首先,使用gazebo仿真出任意场地,gazebo是安装ros时一并被安装的一个仿真软件,可以用于仿真场地的制作,我们需要按照省赛给的要求来制作场地,仔细阅读需求,可以知道,我们需要制作的一共有6个区域,我方区域,ABCD四个战场,还有一个等待区域
然后,我们要使用机器人进行建图,注意,这里的建图和上面的制作场地不是一回事,用机器人建图的目的是为了后面的机器人定点导航,而定点导航使用的地图就是这一步建出来的地图,我们需要用到的建图算法叫做slam_gmapping,后面会提到
建完图之后,我们就要对机器人进行定点导航,那什么是定点导航呢,就是通过程序给机器人发送地图中的目标点,可以是坐标形式,机器人根据路径规划算法,自行计算出最合理路径,并且按照规划出的路径运动,直到到达目标点,我们要做的就是把这些所谓的定点坐标找出来
下一步就是构建服务端和客户端,要求在客户端输入点位,比如ABCD四个点位,输入A,服务端能接收到这个A并且能给机器人发送A所对应的点位,并执行相应逻辑,即让机器人能自动从等待区域前往A战场,等待3-5s后,默认带上伤员前往我方区域,停留3-5s,默认放下伤员,最后返回等待区域
当然对于机器人的模型,没有作限制,可以自己找开源模型
以上任务看起来很多,实际上,我们可以找到开源的示教项目,对其进行一些修改,便能完成我们的省赛仿真要求
先放上该开源项目的地址,国内的用户可能会打不开,没有关系,我会把需要的文件发给大家
点击前往wpr_simulation
我们可以看到,这个项目里包含了开源机器人模型、关于建图和导航的实例,我们可以修改这些现成的实例来满足省赛仿真的需求
在开始之前,我们最后再梳理一次,我们有什么以及我们没有什么
我们有了开源机器人模型,有了建图和导航的半成品
我们没有任意符合要求的场景,需要自己使用gazebo建造
我们没有服务端与客户端,涉及到一点python知识,实在不会可以使用AI辅助
接下来我们开始仿真的教程,以及正式开始接触ros相关应用
首先,再开始之前,我们需要了解一些最基础的知识
1.有关ros的工作目录
顾名思义,跟ros有关的项目文件都放在ros工作目录里
但是ros的工作目录有严格的格式限制
图中,最顶层的是catkin_workspace,这是一个文件夹,也是工作目录的根文件夹,可以由自己命名,它的下一层有三个文件夹,我们只需要知道src即可,另外的devel和build为编译生成的文件夹,在src的下面,放着许多的packages,也就是工具包,而这些package里面还有更加细分的文件夹,如launch文件夹,我们想要启动一个综合的ros应用,就要用到launch文件夹里的launch文件,还有后面我们会用到的world文件夹,里面放着我们需要在gazebo仿真环境里加载的world场景文件
而我们需要掌握的是,知道什么东西该放在哪里,以及知道怎么创建一个最基本的工作空间,拿省赛仿真举例子,我们需要新建一个工作空间,我们打开ros虚拟机,默认在桌面上右键,选择New Folder新建文件夹,作为我们的工作根目录,例如我起名为robot_ws,如图所示
随后我们打开该文件夹,在这个文件夹下面新建一个src文件夹,用于存放将来需要用到的工具包,我们同样右键,选择New Folder,命名为src,这个名字是严格规定的,不可以修改
这样一个最基本的工作空间结构,我们就创建好了
接下来,我们需要拉取我们所需要的开源项目文件,这一部分的文件,我同样会给你们
根据开源项目页面的提示,我们首先要进入src目录,随后右键,选择open in Terminal,在终端中打开,终端中的目录就会显示为当前目录
随后在终端中执行官网给的clone指令,本质是通过网络下载文件,注意,一定要在src目录下执行下面的命令,如果你直接有我发给你的文件夹,请放在src文件夹下,我在群里发了压缩包,wpr_sim.zip,请大家解压出来,放在和图中一样的位置
git clone https://github.com/6-robot/wpr_simulation.git
git clone https://github.com/6-robot/wpr1.git
git clone https://github.com/6-robot/waterplus_map_tools.git
git clone https://github.com/6-robot/xfyun_waterplus.git
执行效果如下,我们会发现在src目录下多了四个包,也就是四个文件夹,在使用这些包之前,我们需要对其配环境,并配置工作空间,而这个开源项目给了我们一键配环境的脚本,在Ubuntu里,.sh结尾的文件被称之为脚本文件,可以通过终端来执行,具体到实际操作,我们打开终端
学习几个常用的终端命令
如果我们要进入一个目录,也就是打开一个文件夹,我们需要使用cd命令
cd+空格+文件夹名
如cd wpr_simulation,同时我们可以使用键盘上的tab键来自动补全路径
比如我们输入cd wpr,此时按下tab键,如果该目录下有wpr_simulation文件夹,系统就会自动把wpr补全成wpr_simulation,注意,一定要输入到你输入的部分在这个目录下只有一个符合这个前缀的文件夹才可以按下tab
ls命令可以让我们直观的看到该目录下有哪些文件和文件夹
对于.sh文件,我们只需要在终端中以sh开头,以sh结尾,比如我们要用到的sh install_for_noetic.sh
由于我们安装的时Ubuntu20.04LTS,使用的ROS版本是ROS Noetic,所以我们就要运行给Noetic配环境的脚本,也就是上面的sh命令
随后我们按下回车,等待环境自动配好即可
会提示输入密码,我们输入并回车即可
随后我们需要编译该工作空间,我们需要返回到该工作目录的根目录,也就是robot_ws这个目录,那么如何在终端里返回上一级路径呢,我们需要用到cd ..命令,也就是cd+空格+两个点
可以看到,当前我们以及处于robot_ws这个根目录下
我们就可以执行编译命令了
注意:可能会出现编译的时候出现缺文件的问题,根据反馈建议大家在编译之前先运行sudo apt-get install -y ros-noetic-sound-play,补全一下可能缺失的文件再编译
我们在终端输入catkin_make,然后回车,系统就会自己开始编译项目,我们需要耐心等待一会儿
等待进度走到100%,没有提示任何红色报错字样,也就意味着我们的编译是成功的
最后我们还需要配置工作空间,也就是让这个系统知道你的工作空间里都有些什么,我们在终端执行source devel/setup.bash命令即可,执行成功不会有任何的反馈,注意:每新打开一个终端,都要在工作空间根目录执行一次source devel/setup.bash
至此,我们对开源项目的初始化就完成了,现在我们就可以正式调用这个开源项目了
我们可以按照官方文档先运行一个简单的实例来看看
我们在终端输入roslaunch wpr_simulation wpr1_simple.launch,注意,由于我们配置了工作空间,所以我们可以在任何目录下执行该命令,但是配置工作空间仅单次有效,如果我们重新启动了系统,我们需要重新配置工作空间
执行后会弹出gazebo的仿真界面,里面加载了一个空的场景、一个机器人模型和一个柜子的模型
在我们执行的命令里,我们可以发现,我们最终启动的是一个launch文件,这个文件里写明了ros需要调用哪些东西,拿这个简单的实例来说,这个launch文件可以调用gazebo,同时可以指定gazebo加载的world和在gazebo里生成的东西
如何关闭该实例呢,我们只需要找到正在运行的对应终端,在里面按下Ctrl+C键,稍等片刻等gazebo被关闭之后即可
下面我们要开始在gazebo中创建一个六区域的world,用于之后的建图工作,首先我们打开gazbo,打开桌面左下角的show applications按钮,点击all,随后找到gazebo11,单击打开,注意:请勿同时启动多个gazebo或多个ros实例
打开之后我们会看到一个空的世界,而我们需要自己创建世界,所以我们找到左上角的Edit,随后选择Building Editor,进入世界编辑
整个应用就会被分为三个部分,左边一块是材质部分,中间偏上的白色网格是2D图层,而中间偏下的部分就是我们的三维世界,我们在二维图层上编辑,会实时反应到三维世界上去
根据要求,我们只需要划出六个区域即可,可自由发挥,没有美观性需求
我们选择左边Create Walls中的Wall,单机选中,我们的光标就会变成一个十字,此时我们就可以在二位网格中绘制墙体了
在二维网格中我们可以通过鼠标滚轮来调整比例尺,如图所示
我们调整至一个合适的比例尺(2.5m左右)之后,就可以开始画图了,画图的方式类似于AutoCAD,也十分简单
画完的效果如图所示,大家不必按照我这个画,只要明确能看出有六个区域即可,画完后可以拖动下方的三维世界查看建好之后的样子
那么我们如何保存这个世界呢,我们选择左上角的File,随后点击Exit Building Editor
随后会提示你一旦退出就无法再编辑,我们点击Save and Exit,会弹出一个Save Model的页面,这里保存的并不是我们需要的world文件,而是Model文件,我们不需要这个文件,但是我们还是保存这个Model文件
我们修改一下Model Name,起自己喜欢的名字即可,然后修改一下保存的位置Location,我们点击右边的Browse,随后选择Desktop,选择choose即可
最后点Save即可
之后,在桌面上会出现一个名为123的文件夹,而gazebo也会回退到纯三维世界的界面,这个时候我们就可以保存这个world了,但是在保存之前,我们还需要做一步操作,我们选择拖动命令,然后拖动我们制作的场景,使得这个世界的坐标轴和这个场景的等待区域重合,这样,我们在之后启动导航的时候,机器人就默认在等待位置待命,随后我们点击左上角的File,选择Save World As,将世界另存为
随后我们依然双击选择Desktop,在最上方的Name框中,我们起一个名字,格式为xxx.world,后面的.world必不可少,这是ros可以识别的后缀,例如我这里命名为123.world,最后点击save即可保存
之后我们就可以关闭gazebo了,我们点击左上角的File,选择Quit退出gazebo,不出意外,在桌面上会出现一个123.world的文件
至此呢,我们的场景就准备好了
下面开始建图,建图就是让机器人在这个仿真的场景里走一圈,通过激光雷达等传感器对地图进行扫描得到一张地图的过程,前面我们提到,建图用到的算法是slam-gmapping,我们前往这个开源项目的launch文件夹,位于robot_ws/src/wpr_simulaiton/launch,在这个文件夹里,我们能找到有关gmapping的launch文件,这就是官方给的建图launch文件,启动它,我们就可以开始建图,但是在启动之前,我们需要进入这个文件看一看,我们需要修改些什么东西,我们直接双击打开它就可以
首先我们可以看到这一行,这一行的作用就是加载world文件,$(find wpr_simulation)表示ros会寻找一个wpr_simulation的工具包,在我们配置了工作空间后,ros便能找到这个工具包,否则会提示找不到,如果找到了这个包,它会顺着后面的路径找到world文件
我们可以看到,它的路径在wpr_simulation/worlds文件夹下,在这个文件夹里我们可以看到许多world文件,那如何启动我们自己做好的world文件呢,我们只需要把桌面上的123.world复制到这个worlds文件夹里
随后我们需要修改launch文件里调用的world,改成我们自己的world文件
我们继续往下看
可以看到Spawn the objects into Gazebo,它会在gazebo里生成一些物品,如里面提到的bed,sofa,tea table等,而其实我们并不需要这些物品,因此我们可以把这些生成物品的代码删除了,一直可以删除到33行,即的上面,如图
高亮部分的代码我们都不需要,直接删除即可
我们继续往下看,下面是关于生成机器人的代码
可以看到,这行代码调用了一个机器人model,即一个机器人模型,决定了这个机器人长什么样子,后面还有一个X坐标和一个Y坐标,决定了这个机器人在gazebo中的初始坐标,我们可以按自己需要修改初始坐标,这里我把它们都改成0
后面的代码部分,暂时不需要我们看,然后我们一定要按下Ctrl+S或者点击右上角的save保存这个文件,直到正上方文件名左边的星号消失,代表保存成功
随后我们可以关闭这个窗口,打开终端,快捷键为Ctrl+Alt+T,或者也可以手动打开Terminal,在终端里执行roslaunch wpr_simulation wpr1_gmapping.launch,这一行指令由三个部分组成,roslaunch,这是ros启动launch文件的标准命令,后面要跟上两个参数,一个是工具包名,也就是wpr_simulation,另一个就是launch文件名,要包含.launch后缀,也就是我们刚才修改好的wpr1_gmapping.launch
然后我们回车,不出意外,我们的场景会在gazebo里被打开,里面会出现一个机器人,同时一个叫做rviz的程序会被打开,打开时还附带了一个警告
意思就是ROS1已经在2025年5月31日起停止被支持,我们不必理会,选择ok即可
我们来到gazebo,发现里面确实有个机器人,理论上机器人会在等待区域
随后我们找到左边一个没有图标的程序,也就是rviz,我们的建图和导航都由rviz进行生成,保存和读取
我们在右边框里看到的灰色部分和黑色部分,就是生成的地图,之所以现在地图不完整,只是因为机器人无法一次性扫描到整个地图,所以我们需要让机器人动起来,至少扫描完整张地图一遍,注意:在gazebo里的机器人移动和rviz里是实时同步的
那,如何让机器人动起来呢,我们需要打开终端,在终端执行sudo apt-get install ros-noetic-teleop-twist-keyboard,安装一个有关机器人移动的包,安装完成之后我们可以启动这个包,在终端输入rosrun teleop_twist_keyboard teleop_twist_keyboard.py
执行后可以看到这样的界面,其中I是前进,k是急停,J是原地左转,L是原地右转,<是后退
注意:我们在操控机器人的时候一定要保持这个终端在最前端,也就是要用鼠标点一下这个终端我们可以同时把gazebo打开,查看机器人的运动情况
可以看到,我已经成功把机器人移动到了另一个位置,这时我们打开rviz,可以发现,rviz里建成的地图较前面有了扩展,所以接下来我们只需要操控机器人在整个地图里跑一圈,确保地图的所有墙都被扫描到,那我们的建图就算是完成了,注意:建图时尽量保持gazebo、rviz和终端三个框都能看到,这样能直观地看到建图的效果,依然要注意操控机器人时终端必须在最前端
建好之后,大概的效果如图所示
之后,我们需要把我们建的图保存下来,这里需要用到ros的mapserver包,我们打开一个新的终端,在终端里执行rosrun map_server map_saver -f ~/Desktop/map,回车,我们就会在桌面上得到map.pgm和map.yaml,这是保存地图的两个形式,一个是图片格式,另一个是ros能读懂的格式
随后我们就可以开始对机器人进行定点导航了,我们找到wpr_simulation/launch文件夹中的wpr1_navigation.launch文件,这个就是示例定点导航launch文件,同样,我们需要对它进行一些修改,依然把world改成自己的world,把生成物品的代码全都删掉,修改机器人的初始坐标
最重要的是加载自己的地图,我们可以看到,地图的路径在wpr_simulation/maps文件夹下的yaml文件,这不正和我们刚才保存的yaml文件是同一个格式吗,所以我们把桌面上的map.yaml文件复制到maps文件夹下,并在launch文件里把文件名改成自己的map.yaml
随后我们保存文件,然后就可以打开终端,运行roslaunch wpr_simulation wpr1_navigation.launch
运行后,ros启动了gazebo和rviz,我们可以在rviz里看到我们之前建的地图
我们可以使用2D Nav Goal来实现对小车的手动发点导航
我们点击上面的2D Nav Goal,之后在地图的任意位置按住鼠标左键,随后拖动鼠标,箭头会朝向你鼠标的位置,这就是机器人最终的朝向,随后松手,你会发现,机器人奇迹般自己动了起来,朝着你给定的目的地前进
至此,导航部分就完成了,但是我们还需要进行定点导航,这一部分和接下来的服务端与客户端编写有很强的关联性
下面我们就来编写服务端和客户端,还是要先了解一点基础知识
在编写服务端之前,我们先需要定义服务,我们需要在工作目录src文件夹下新建一个我们自己的包,可以命名为server,我们需要用ros专用的新建工具包的命令,注意:不可以直接新建文件夹,这是一个工具包,但是工具包下的目录可以直接创建
打开终端,进入src目录,输入catkin_create_pkg server rospy std_msgs geometry_msgs message_generation
我们进入server文件夹,需要在里面自定义一个服务文件,是一个.srv结尾的文件,如何创建呢,我们在这个路径下打开终端,输入nano GoToPoint.srv,前面的nano是文本编辑器的命令,后面的GoToPoint是文件名.srv是文件扩展名,.srv也是严格规定的,不可以修改,随后我们在nano文件里粘贴如下内容
string target_point
bool success
string message
随后我们要保存文件
按下Ctrl+X,随后按两下回车即可
随后我们要编写服务端和客户端文件,基于python,是.py文件,所以我们需要在srv文件夹同级目录下创建scripts文件夹,放入我提供的server.py和client.py,在群里server_client.zip同样按照图中放置
然后我们要打开server.py,关键需要修改的地方就是点位的坐标
那怎么知道我们需要的坐标是多少呢,我们运行之前的navigation,并打开rviz
在左边一栏下滑找到RobotModel,展开里面的Links,再展开base_link,里面有一个Position,我们需要的就是这个坐标,被两个分号分隔开的分别表示XYZ三个坐标,我们只需要前两个X和Y,第三个Z永远为0
接下来我们只需要手动导航机器人到指定的点位,并记下点位对应的坐标,在server.py里修改即可
修改完成后,我们就可以启动服务端和客户端了,在启动之前,我们需要返回工作根目录,对其进行一次编译,编译完成后,我们需要依次启动导航,也就是wrp1_navigation.launch文件,然后我们需要打开新终端,在配置完工作空间后,我们先启动服务端
rosrun server server_node.py
随后继续打开一个新的终端,配置工作空间,随后运行客户端
rosrun server client_node.py
之后我们就可以在客户端终端里输入我们想要去的点
评论