PeaceSheep's blog PeaceSheep's blog
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)

PeaceSheep

以最简洁、易懂的话解决问题
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)
  • 多智能体控制

    • AIRSIM安装与Demo运行
      • 概述
      • 环境安装
        • 1. 安装虚幻引擎
        • 2.下载VS2022
        • 3. 克隆项目
        • 4. 安装AirSim
        • 5. 安装python airsim库
        • 遇到的问题:
        • 问题
        • 解决方案:
      • 关键代码
      • 效果与总结
        • 流程演示
        • 总结
  • 网络

  • 数据库

  • 云计算

  • 课程
  • 多智能体控制
PeaceSheep
2022-06-18
目录

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()
1
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轴,时长,控制对象) ,水平速度控制(指定高度)
1
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)       # 释放控制权
1
2
3
4
5
6
7
8
9
10
11

# 效果与总结

# 流程演示

初始状态:

起飞:

由于我是用的是AirSim默认场景Blocks,里面有很多立方体,使用学长给的代码起飞直接撞墙...所以我将我人机的高度调高了一些。

飞行途中:

到达终点:

降落:

由于没有调整降落时的位置,导致一部分无人机降落直接降落在立方体上了。

结束:

可以看到由一架无人机降落到了地上,其他的降落到立方体上了。

# 总结

虚幻引擎很早就想玩了,但是一直没有机会,这次终于玩了一次。这次实验让我学会了使用AirSim进行多无人机控制的全部流程。

虽然安装的过程中遇到了一些小问题,但是有学长给的文档很清楚,所有问题都解决了。运行的时候感觉自己显卡不太够,有很明显的卡顿。

我之前总以为控制无人机是一件很麻烦的事,今天才知道原来只用python几行代码就行,模拟器把很多东西都帮我们做了,我们不用自己制作无人机的3D模型,也不用自己写碰撞的反弹这种物理效果。我们只需要计算一下无人机的坐标,速度,然后直接调用API就可以了。

控制算法这块学长写的理论非常清楚,一开始有一点不太理解,但是代码非常非常清楚,直接看代码就能看懂了。由于我使用的场景有很多障碍勿,看着学长的注释很快就能把路径重新调整好。

由于我之前没有研究过这个方向,所以没办法用自己代码,只能简单调整学长的代码,也算是有点遗憾了。以后想要多做一些类似的研究,如果能用自己的无人机集群算法应该会很好玩。

编辑 (opens new window)
#课程#多智能体控制
上次更新: 2025/04/15, 10:52:45
setsockopt不起作用的解决方案

setsockopt不起作用的解决方案→

最近更新
01
ubuntu安装g++显示已有但是输入g++又找不到命令
04-15
02
使用cloudflare-r2搭建webdav
04-08
03
LLM聚合平台客户端对比
03-29
更多文章>
Theme by Vdoing | Copyright © 2022-2025 PeaceSheep
冀ICP备2022004632号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式