AIRSIM安装与Demo运行
虚幻引擎很早就想完了,正好借着这次课程实验学习一下。
# 概述
这次的多智能体实验需要我们使用AirSim模拟器,运行一个多无人机的控制算法,在模拟器中实时预览我们的控制算法。学长已经给了一个demo,我们在此基础上修改就可以,无需从头去自己写多无人机控制算法。
# 环境安装
官方的安装教程见:https://microsoft.github.io/AirSim/build_windows/ (opens new window)。参照官方教程和学长给的Word,很容易就可以装好。
# 1. 安装虚幻引擎
电脑重装系统之后一直都没有安装Epic,这次正好有理由安装了。首先安装EpicGames。点击左边虚幻引擎,根据官方说明,需要安装4.27及以上版本,由于5.0.2版本太大而且怕兼容性不好,因此直接安装4.27。安装完成后界面如图所示:
# 2.下载VS2022
由于我之前使用的是VS2019,官方要求使用VS2022,为了避免出现问题,所以选择了卸载2019安装2022。 需要注意的是安装时需要勾选Windows SDK以及最新的.NET Framework SDK。
# 3. 克隆项目
使用git clone https://github.com/Microsoft/AirSim.git
克隆整个项目。
# 4. 安装AirSim
打开Developer Command Prompt for VS 2022
,运行build.cmd
。等一会就直接OK了。
# 5. 安装python airsim库
直接用pip install airsim
会报错,是由于一些库的版本依赖冲突引起的,根据报错很快就能解决。
# 遇到的问题:
这个问题就是学长提到的,由于我一开始没有进行这个步骤,就报错了。
# 问题
Get-ItemProperty: Cannot find path 'HKEY_CLASSES_ROOT\Unreal.ProjectFile\shell\rungenproj' because it does not exist.
# 解决方案:
先将Epic Games launcher 退出,然后重新打开Epic launcher, 然后会自动跳出 fix of associate project 的选项。
# 关键代码
代码基本上就是学长的,只做了一些简单的修改。
起飞:
for i in range(9):
name = "UAV"+str(i+1)
client.enableApiControl(True, name) # 开启Api控制UAVi
client.armDisarm(True, name) # 解锁螺旋桨
if i != 8: # 起飞
client.takeoffAsync(vehicle_name=name)
else:
client.takeoffAsync(vehicle_name=name).join()
# Async methods returns Future.
# Call join() to wait for task to complete.
for i in range(9): # 全部都飞到同一高度层3m
name = "UAV" + str(i + 1)
if i != 8:
client.moveToZAsync(-30, 5, vehicle_name=name)
# moveToZAsync(z, velocity, vehicle_name)
# 是高度控制 API,第一个参数是高度,第二个参数是速度,第三个是控制的目标
else:
client.moveToZAsync(-30, 5, vehicle_name=name).join() # .join()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
飞往目标地点:
for t in range(50):
for i in range(9): # 计算每个无人机的速度指令
name_i = "UAV"+str(i+1)
pos_i = get_UAV_pos(client, vehicle_name=name_i) # 拿到无人机的位置
r_mig = pos_mig - pos_i
v_mig = k_mig * r_mig / np.linalg.norm(r_mig)
v_sep = np.zeros([2, 1])
v_coh = np.zeros([2, 1])
N_i = 0
for j in range(9):
if j != i:
N_i += 1
name_j = "UAV"+str(j+1)
pos_j = get_UAV_pos(client, vehicle_name=name_j)
if np.linalg.norm(pos_j - pos_i) < r_max:
r_ij = pos_j - pos_i
v_sep += -k_sep * r_ij / np.linalg.norm(r_ij)
v_coh += k_coh * r_ij
v_sep = v_sep / N_i
v_coh = v_coh / N_i
v_cmd[:, i:i+1] = v_sep + v_coh + v_mig
for i in range(9): # 每个无人机的速度指令执行
name_i = "UAV"+str(i+1)
client.moveByVelocityZAsync(v_cmd[0, i], v_cmd[1, i], -30, 0.1, vehicle_name=name_i)
# client.moveByVelocityZAsync(vx, vy, z, duration,
# drivetrain = DrivetrainType.MaxDegreeOfFreedom, yaw_mode = YawMode(), vehicle_name = '')
# (x轴速度,Y轴速度,Z轴,时长,控制对象) ,水平速度控制(指定高度)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
降落:
client.simPause(False) # Pauses simulation
for i in range(9):
name = "UAV"+str(i+1)
if i != 8: # 降落
client.landAsync(vehicle_name=name)
else:
client.landAsync(vehicle_name=name).join()
for i in range(9):
name = "UAV" + str(i + 1)
client.armDisarm(False, vehicle_name=name) # 锁定,关闭螺旋桨
client.enableApiControl(False, vehicle_name=name) # 释放控制权
2
3
4
5
6
7
8
9
10
11
# 效果与总结
# 流程演示
初始状态:
起飞:
由于我是用的是AirSim默认场景Blocks,里面有很多立方体,使用学长给的代码起飞直接撞墙...所以我将我人机的高度调高了一些。
飞行途中:
到达终点:
降落:
由于没有调整降落时的位置,导致一部分无人机降落直接降落在立方体上了。
结束:
可以看到由一架无人机降落到了地上,其他的降落到立方体上了。
# 总结
虚幻引擎很早就想玩了,但是一直没有机会,这次终于玩了一次。这次实验让我学会了使用AirSim进行多无人机控制的全部流程。
虽然安装的过程中遇到了一些小问题,但是有学长给的文档很清楚,所有问题都解决了。运行的时候感觉自己显卡不太够,有很明显的卡顿。
我之前总以为控制无人机是一件很麻烦的事,今天才知道原来只用python几行代码就行,模拟器把很多东西都帮我们做了,我们不用自己制作无人机的3D模型,也不用自己写碰撞的反弹这种物理效果。我们只需要计算一下无人机的坐标,速度,然后直接调用API就可以了。
控制算法这块学长写的理论非常清楚,一开始有一点不太理解,但是代码非常非常清楚,直接看代码就能看懂了。由于我使用的场景有很多障碍勿,看着学长的注释很快就能把路径重新调整好。
由于我之前没有研究过这个方向,所以没办法用自己代码,只能简单调整学长的代码,也算是有点遗憾了。以后想要多做一些类似的研究,如果能用自己的无人机集群算法应该会很好玩。