原创:王稳钺
资料来源:肖老师
本文主要介绍搭建一个无人机仿真平台所需的软件及其简介。
1. ROS简介及安装
ROS是一个比较复杂的概念。在ROS WiKi中,ROS的定义为:一个开放源代码的机器人元操作系统。这里有个比较关键的概念就是元操作系统,它和常见的Windows、Linux、安卓等系统不同,它相当于是在更底层的操作系统之上做了进一步的封装。ROS提供了我们对于操作系统期望的服务,包括硬件抽象、低级设备控制常用功能的实现、进程间的消息传递以及功能包管理。它还提供用于在多台计算机之间获取、构建、编写和运行代码的工具和库。换句话来说,ROS包括一个类似于操作系统的硬件抽象,但它不是一个传统的操作系统,它具有可用于异构硬件的特性。此外它也是一个机器人的软件平台,提供了专门为机器人开发应用程序的各种开发环境。无人机的外号叫空中机器人,所以无人机本质上也是一个机器人。而且随着无人机现在智能化成程度越来越高,更多的开发者其实已经在关注无人机的上层控制,也就是常说的智能化的一些相关算法。所以将底层部分拿走之后只关注上层的话,那对于无人机的智能开发跟对机器人的智能开发是非常类似的。所以就把ROS这个机器人领域用的最多的一个开源的元操作系统拿来,用于在无人机上做上层的控制。
其实选择ROS还有很多其他的原因。首先ROS它原本就集成好了很多高端的功能,包括SLAM,AMCL,Movelt!等。这些功能在ROS的开源社区内,已经有其他的开发者完成开发了,想用的时候很方便的直接拿来用就好,不需要自己去把这些复杂的功能全部开发一遍。第二点是ROS具有大量的工具。比如常用于调试的rqt、可视化工具rviz、用于仿真的Gazebo等。集成了大量好用的工具,就可以便于开发者非常方便的去实现想要实现的功能。第三,从硬件层面上来说,大多数的机器人开发者不太熟悉嵌入式开发,尤其是对于传感器、执行器驱动的开发,这些驱动的开发也是ROS帮助完成了。市面上主流的传感器和执行器大多数都有ROS库,这样的话使用ROS就可以直接的获取传感器的信息和对执行器进行操作,而不需要再去考虑驱动的问题。第四是多语言的支持。编程有非常多的语言,每个人习惯的语言不同,ROS一大优点就是它具有对于多种语言支持的特性,主要支持C++、Python、LISP。对于C++和Python来说,ROS就相当于是它们的一个库,下面有很多相应的类和方法,直接去使用就可以。第五是模块化,不同的任务去用不同的模块来实现,这样的话可以便于解耦,一个模块出了问题之后不会影响到别的模块。第六是资源并发处理。最后也是ROS最关键的一点就是它有非常活跃的开源社区,所有的命令在官网上都有文档说明,而且有非常非常多的已经开发好的开源机器人项目,可以直接使用。
接下来介绍一下ROS的组件,下图展示了主要组件。最下面是硬件接口层,也就是驱动,和传感器、执行器打交道的,像相机驱动、GPS/IMU的驱动、深度相机的驱动、音频的驱动等等。再往上一层是通信层,也就是信息传递的时候所涉及到的一些层级,其中包括ros话题,ros服务等。再往上面是机器人的应用框架,这些框架在实际做机器人开发的时候不用自己开发了,已经提供好了。比如说用的比较多的TF,主要用来解决坐标系之间的变换关系。如果自己去用变换矩阵推的话,比较麻烦,还可能推错。但是TF就把坐标系的变换关系用一个库来帮助计算,很容易的实现坐标系之间的变换。再往上是机器人的应用。如果想要实现某个功能,可以先去ROS中找,很多时候都不需要自己实现, ROS就已经帮助集成好了。最上面这一层就是所谓的编程语言,对于ROS来说,编程语言就称之为语言客户层了。
下图展示了ROS的文件系统。因为ROS主要运行在Linux系统下,而Linux将所有东西的看作是文件。
下面介绍ROS计算图,其实就是ROS的工作流程。
图中node1、node 2 等一共有五个节点,也就是有五个进程,一般来说一个节点来完成一个核心的功能。节点跟节点之间是通过特定的消息信息传递方式去来沟通的,也或者说是叫交互。信息传递的方式主要有主题或者话题 (topic)、服务(service)、动作(action)、参数服务器(parameter server)等。节点1和节点3之间的通信就是通过服务器的需求与响应,那对应的就是客户端向服务器发起需求,然后服务服务器向客户端去进行反馈这样的一个过程。在无人机中一些比较关键的操作是用服务来实现的。比如给无人机解锁和上锁,因为解锁和上锁就直接决定了无人机是不是要飞了。如果解锁的时候旁边有人,那可能螺旋桨一转起来就会伤到人。所以解锁和上锁是比较重要的,它是用服务来实现的,一定要有一个反馈,代表这个解锁和上锁是成功了还是失败了。话题或者主题只发布消息,消息发送之后,至于其他节点收到了没有,执行的情况怎么样,就不再关心了。发出消息后,中间像是一个话题池子(topic 1、topic2、topic 3),等待其他节点去订阅这些话题,然后就收到了这些消息了。参数服务器存储了整个计算图中的节点所需要用到的参数。ROS就通过使用节点把代码跟功能解耦,提高了系统的容错力和可维护性。在写程序的时候,最好是让每一个节点都具有单一的功能,而不是要写一个特别大的节点,这个节点把所有的事都包了。这并不是一个很好的软件开发的一个方式,因为一旦有一个程序崩溃,这整个节点就全废了,机器人肯定就会有比较严重的问题。有这么多节点,就需要有一个管理器来管理这些节点,这个就是节点管理器(master),它用于节点的名称注册和查找,也负责设置节点间的通信。
ROS的安装可以参照 http://wiki.ros.org/Installation/Ubuntuguan 官网安装,下图的网站中也有一些安装的说明。
2. Gazebo简介及安装
Gazebo是一个基于物理仿真的3D机器人模拟器,能够对于复杂的室内外环境精确的模拟一个或多个机器人的运动,对机器人设计、场景测试都十分有用。下图展示了Gazebo真实界面。
图中的中间的部分,就是交互的场景。通过这场景可以看出这应该是一个室内场景。一般来说室内场景都不封顶,因为封顶了的话,摄像头就不能够很好地看到全局了。所以通常Gazebo的室内场景都是不做封顶的,默认的话就是把天花板的都打开了。其中一片蓝色区域其实是有一个无人机,它使用的是一个二维的激光雷达,激光线用蓝色做了可视化,就实现了这样的效果,这个就是Gazebo的一个交互场景。左边是一些像模型光线、风、环境等物理引擎的一些设置,它的一些属性也可以看到,可以通过 insert 去在使用过程中去人为的添加一些物体。在图中最下面,可能看得不是很清楚,有一个实时因子(real time factor),它表明的就是仿真时间和真实的流逝时间的比值。因为仿真其实是可以加速和减速的,如果这个因子是1代表实际的时间流过一秒,仿真时间也流过过一秒,它是完全模拟实际场景。后面还有一个数值是FPS(每秒的帧数),这个主要是由显卡性能决定的,一般到六十几基本上就是Gazebo渲染速度的上限了,显卡再好也不可能超过这个速度了。但如果显卡比较差,然后仿真场景也比较的大的话,FPS可能就会比较低,这样就会导致在执行视觉相关的算法时,仿真会出现问题。还有像激光雷达,尤其是三维激光雷达,它的获取点云的是需要大量的计算量的。Gazebo的插件是允许使用GPU 来做激光雷达数据的获取。在这种情况下,如果GPU不行,那激光雷达的数据获取可能也有问题。所以说一个好的显卡对于仿真也是很有必要的。
下图的链接中有详细的Gazebo安装说明。因为在装ROS的时候,它会自带的把Gazebo装上,默认装的Gazebo的版本比较低,有些地方适配性不是很好,所以要先把之前装的卸载。卸载之后,就可以按照Gazebo的官网进行安装。Gazebo安装完成后,按照链接的说明文档继续安装插件及模型文件。
3. MAVROS简介及安装
MAVROS是个比较重要的一个功能包。下图展示了真实无人机和仿真两种情况,这有助于理解ROS和PX4的关系以及MAVROS的作用。
真实无人机我这里头有三个模块。首先第一个模块是在Pixhawk中跑的PX4程序,这个就是飞行控制器。其实就是装在无人机上的一个小盒子,它又外接了电机、一些传感器、遥控器的接收机等等,它主要负责底层控制的部分。那上层控制是在哪跑的呢?上层控制是在上位机,比如说英伟达TX2,通常就是更强大,比如英特尔的芯片等。这些芯片它们的算力比较高,在这上面可以运行更复杂的一些程序,比如对图像的处理等等程序。这部分就是ROS发挥特长的地方了。像TX2等一般装的都是Linux 系统,ROS就可以就在里面跑一些高级的程序。但如果程序想要给底层的控制器发指令,这是两个硬件,这两个硬件之间怎么通信呢?一般来说是通过串口通信,连个 USB 线就能通信了。通信这是硬件连接,那还需要有软件的协议,这个协议就是MAVLink协议。但MAVLink协议比较复杂,人们认为ROS比较简单,就使用了MAVROS,MAVROS是ROS的一个功能包,它把MAVLink协议给封装成了ROS协议。这是它的一部分功能,这样的话在上位机发一个话题,比如说发一个速度指定的话题,然后通过MAVROS就能够传到PX4,然后它就会按照这个速度去飞,这就是MAVROS的功能。MAVROS还有一个功能,它提供了一个 UDP 的桥接。QGroundControl是地面站,在地面上去监测无人机的一些数据,那这个通信往往就是无线通信了,因为飞机在天上飞,地面站是在地面端,它就要通过无线通信。这会通过UDP的方式来通信,但也需要有对应的协议,也可以使用MAVROS。
在仿真时,仿真无人机跟真实无人机其实非常的相像,但是有些地方做了有对应的映射。首先PX4通过在Linux中编译,编译出了一套飞行控制器。这套飞行控制器模拟了Pixhawk上的PX4,但从外界的直观感受上来说是一样的,无论是参数的调节,消息的输入输出,给人的直观感受都是一模一样的。第二点不一样的就是模拟物理环境了,因为真实的无人机,它的螺旋桨跟大气的交互,传感器跟环境的交互,这些都是在真实世界中发生的。电脑中没有这些东西,所以需要通过Gazebo来去模拟真实世界中发生的这些物理过程,去模拟无人机动力传感器获得的数据等等。最后就是模拟的上位机,比如说本来的上位机可能是在TX2上或者是英特尔的UC上,在这些小型的电脑主机上运行的。那仿真时电脑主机就变成了笔记本或者是台式机了。那因为都是运行的 Linux 系统,系统是完全一样的,所以说写的程序没有什么区别。在ROS程序仿真中, ROS程序也就是在这个所谓的模拟上位机中运行,然后通过ROS话题的发布、 服务的请求,然后去经由MAVROS转到MAVLink去做通信。
但其实MAVROS和MAVLink是存在着坐标系差异的,这在使用中需要非常注意。
4. PX4简介及源码编译
PX4的定义是一个开源自动驾驶飞行栈,简单理解它就是一个飞行控制软件。下图展示了PX4的特点。
PX4的另一个定义把PX4分成了两部分——飞行栈和中间件。飞行栈就是飞行控制软件,包括了状态估计,也就是通过传感器的数据来估计无人机现在的位置、姿态、速度、角速度、加速度等。飞行控制就是去让无人机飞的稳定,飞行方向等。中间件它是一个通用的机器人层,它是跟底层的硬件打交道的,还包括硬件之间或者说不同的模块之间的通信。
PX4是如何编译的呢?因为PX4没有办法像前面的那些可以直接从Ubuntu的 App库中装,这就需要自己源码编译。通过下图链接中的说明文档就可以很快解决。
5. XTDrone配置
这么多软件,它们之间的关系是什么样的呢?是如何联系在一起的呢?下图做了展示。
XTDrone的源码下载也有说明文档,按照下图链接中的说明文档就可以成功下载。
其实本文中出现的说明文档写的非常详细,还有很多本文中没有提到的内容。感兴趣的同学可以仔细阅读,希望可以成功搭建出无人机仿真平台。