Airsim仿真

AirSim是微软在2017年发布的无人机无人车仿真框架,基于虚幻引擎开发。最初的开发目的用于生成机器学习的数据,不过随着这几年功能不断完善,作为机器视觉实验平台和任务仿真的工具也是一个不错的选择。特别是和Pixhawk通过MAVlink链接后可以进行SITL和HITL,可以简单的从仿真环境移植到真实的无人机。

本文将分享一些AirSim的使用体验,然后简单介绍AirSim仿真环境的搭建,最后介绍AirSim仿真和PX4的SITL的连接。

AirSim体验

关于AirSim的使用,有三种方式。推荐在Win平台上跑AirSim,局域网里另外一台电脑跑SITL。

  1. 下载github编译好的release,不过场景比较有限

  2. 在win中编译环境,编译出的binary可以直接的复制到其他的win pc中运行,支持Airsim的SimpleFlitht和PX4.的SITL+HITL。大概不能交叉编译,尝试了没成功,也可能是方法不对。

  3. 在Linux中编译环境,不过不太推荐这么干,UE引擎得编译安装而且编译出来的binary不支持PX4.的相关仿真。不过在之前斯东大佬沟通开了新分支修复了相关的bug,没整合到官方master中。(时间关系,没尝试过用该分支编译环境)

2020年4月AirSim进行了一波大更新,2月的时候用的master分支还是VS2017+UE4.18,前几天更新的时候就迁移到了VS2019+UE4.24。主要的改动如下

  1. VS版本更新,开发环境变化,不过同时安装VS2017和VS2019似乎会导致程序打包的时候出错。

  2. UE版本变动,新版本的UE使用了Vulkan驱动,让仿真场景更加丝爽润滑,但也更吃硬件。下面的表格对比了不同环境的图像和IMU频率(v1.3.1的Realse),测试环境(i5-7300+1050TI笔记本)对比实际D435i相机和Euroc数据集的频率仿真的频率还是偏低(也可能是电脑太辣鸡)。

    而对于编译的环境,Airsim版本更新的提升还是有一些的,但感觉没预想中那么大。

  3. PX4的固件从v1.8.2更新到v1.10.1,主要影响的是仿真接口,仿真器的链接从UDP转为了TCP,其他的UDP端口略有变化。

    更新之后不再支持v1.8.2固件的SITL,这个影响对使用WSL的开发者影响比较大,v1.8之后的SITL因为WSL的bug会因为没有权限创建一个链接,导致仿真没法进行,尝试在脚本里用root权限运行不过不太好使的亚子。可以考虑WSL2/虚拟机/分布式开发。

AirSim环境搭建

关于AirSim的环境搭建网上已经有不少详细的教程,我就不具体写了。最主要的困难大概就是需要一把稳固的梯子。AirSim插件编译好后可以下载各种UE的素材建立自己的任务环境。

官方文档:https://microsoft.github.io/AirSim/build_windows/

知乎@aaron20127的教程:https://zhuanlan.zhihu.com/p/43245459

AirSim+SITL

AirSim的贴图和纹理对比Gazebo更接近真实场景,跑图像识别和SLAM之类的也比较有优势。AirSim有自带的SampleFlight模式,可以比较方便的验证视觉控制的算法。不过要与实际情况更接近的话还是带上PX4的SITL会好一些。下面列举几个AirSim+SITL的配置,下面的例子是在v1.8.2环境下,v1.10.1修改对应的端口即可。

  1. WSL运行SITL+主机运行AirSim

个人更推荐这种方式,Win平台下可以方便的使用UE搭建任务场景,编译出二进制程序后不管是本机运行还是拷贝到其他的电脑上运行都很方便。而编译飞控相关的可以使用WSL,WSL和主机共享IP,通过127.0.0.1可以相互访问。(WSL2就是IP独立,相当于一个Hyper-V虚拟机)

首先修改AirSim的配置文件,"UseSerial": false,表明使用SITL而不是HITL,设定相关的端口同上图,若设置集群对应修改飞机和端口号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"SeeDocsAt": "https://github.com/Microsoft/AirSim/blob/master/docs/settings.md",
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"Vehicles":{
"mav_00": {
"VehicleType": "PX4Multirotor",
"X": 0, "Y": 0, "Z": -1,
"UseSerial": false,
"SitlIp": "127.0.0.1",
"SitlPort": 14556,
"UdpIp": "127.0.0.1",
"UdpPort": 14560,
"QgcHostIp": "127.0.0.1",
"QgcPort": 14550
}

}

然后在WSL里面运行SITL,使用对应版本的编译指令,例如1.8.2的make posix none_iris

先打开QGC地面站,最后打开编译好的环境。AirSim会给QGC发一个HB然后QGC发送一些初始化信息给SITL完成初始化,当初在这里卡了半天。

这块有一点疑问就是,AirSim的机头朝向正北的时候SITL的数据会有偏差,比如上图所示的yaw为9°。

  1. Linux运行SITL+AirSim

个人感觉挺蛋疼的,在Linux上开发UE。各种FBX格式的模型在Win上建模和制作更顺手来着,而且Linux的虚幻得从源码编译安装,挺费事的。。。反正直观体验不是太好,Ubuntu18.04环境,下载UE源码一个晚上,编译一个晚上,最后在Ubuntu上搭建环境啥的流畅度还不如在Win上。个人极力不推荐。

  1. 分布式架构

终于到重头戏了,分布式是我觉得最舒服的开发和仿真方式。笔记本是常用机,双系统,Win开发好了UE的任务环境打包出二进制文件,拷贝到台式机运行。然后笔记本切到Ubuntu,跑ROS和SITL相关的玩意。

分布式的注意事项和之前的差不多,记得先开GCS,不过配置文件需要修改IP地址,其中LocalHostIp为运行AirSim环境的台式机的IP,UdpIpSitlIp是跑SITL和ROS的笔记本的IP。其他的端口我修改过,若有自定义,对应修改即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"SeeDocsAt": "https://github.com/Microsoft/AirSim/blob/master/docs/settings.md",
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"Vehicles":{
"mav_00": {
"VehicleType": "PX4Multirotor",
"X": 0, "Y": 0, "Z": -1,
"UseSerial": false,
"LocalHostIp": "192.168.3.2",
"UdpIp": "192.168.3.1",
"UdpPort": 16200,
"SitlIp": "192.168.3.1",
"SitlPort": 16100,
"QgcHostIp": "192.168.3.1",
"QgcPort": 14550
}
}

}
文章目录
  1. 1. AirSim体验
  2. 2. AirSim环境搭建
  3. 3. AirSim+SITL
|