无人机仿真环境配置初探(Unreal Engine + AirSim Plugin)

概要

AirSim插件配合Unreal Engine游戏引擎的3D渲染能力,可以实现比较逼真的环境渲染效果,具备Camera、Lidar和GNSS三种导航数据供供导航程序使用,其代码架构如下(参考自知乎文章
:AirSim仅支持UE4,对于UE5,需要下载https://github.com/CodexLabsLLC/Colosseum对应的UE版本的Colosseum(AirSim的successor),后续步骤类似。
AirSim代码框架
因此,无人机仿真环境由两部分组成:Windows平台上使用UE+AirSim插件搭建无人机飞行场景,配置无人机物理参数,为导航模块提供图像、激光雷达和GNSS测量数据;NVIDIA JETSON ORIN板卡运行导航程序,接收Windows传输的测量数据、进行导航解算并输出控制指令至Windows平台控制无人机移动。
本文内容是在Windows和ORIN两个平台的环境配置和数据传输测试。

1. ORIN端环境配置

1.1 AirSim插件配置

  1. Github-AirSim下载AirSim源码,我选择1.8.0-Linux;
  2. 找到AirSimRootDir/setup.sh文件,根据命令中网址下载rpclib-2.3.0文件(解压后命名为rpclib-2.3.0文件并复制到AirSimRootDir/external/rpclib/路径下)、下载Eigen库(找到eigen/Eigen文件夹并复制到AirSimRootDir/AirLib/deps/eigen3/ 路径下);
  3. 进入AirSim目录,命令行执行./setup.sh --no-full-poly-car (我仅使用无人机,因此不用下载汽车模型);
  4. 如果出现clang-8安装失败(底层库不兼容问题),将setup.sh文件中sudo apt-get install -y clang-8 clang++-8 libc++-8-dev libc++abi-8-dev删除,使用aptitude工具手动安装,将不兼容的库降级使用;
  5. 在AirSimRootDir命令行执行./build.sh构建AirSim,对应生成的插件文件在AirSimRootDir/Unreal/Plugins/AirSim中。

1.2 AirSim-ROS2-Wrapper配置

  1. ROS2的源码位于AirSimRootDir/ros2处,AirSim貌似仅支持ROS2-galatic(不太确定,可在Github的issues处查看);
  2. 参考Github/AirSim-Add ROS2 wrapper链接,依次运行 How to test it yourself? 处命令以编译ROS2包、启动airsim_node节点。

2. Windows端环境配置

2.1 下载Epic Game游戏软件和Unreal Engine

  1. 下载Epic Game游戏软件

界面如下

  1. 点击左侧Unreal Engine->Library选择对应的UE版本,我选择4.27。
  2. UE引擎下载完毕后,在Marketplace界面选择目标场景下载(须与刚下载的引擎兼容)并创建工程。
  3. 右键点击工程的uproject文件,Generate Visual Studio Projectfiels,生成C++项目,以和AirSim源码一起生成。

2.2 UE工程配置AirSim插件

  1. 仿照 1.1 AirSim插件配置在Windows平台下载、setup、编译AirSim插件;
    以下内容参考了——AirSim配置Unreal Environment
  2. 将编译后AirSimRootDir/Unreal/Plugins文件夹复制到UE工程根目录(此目录下存在UEProjectName.uproject文件);
  3. 使用记事本打开UEProjectName.uproject,添加AirSim依赖和AirSim插件,最终效果如下
{
   "FileVersion": 3,
   "EngineAssociation": "4.27",
   "Category": "Samples",
   "Description": "",
   "Modules": [
       {
           "Name": "LandscapeMountains",
           "Type": "Runtime",
           "LoadingPhase": "Default",
           "AdditionalDependencies": [
               "AirSim"
           ]
       }
   ],
   "TargetPlatforms": [
       "MacNoEditor",
       "WindowsNoEditor"
   ],
   "Plugins": [
       {
           "Name": "AirSim",
           "Enabled": true
       }
   ]
}
  1. 在UE工程根目录下,使用记事本打开Config\DefaultGame.ini文件并在末尾添加
    +MapsToCook=(FilePath="/AirSim/AirSimAssets")
    目的是将AirSim的content添加到UE工程。
  2. 打开文档/AirSim/settings文件,添加"SimMode":"Multirotor"设置,将仿真节点设置为无人机。该文件可以用来配置仿真环境中无人机/车的各种物理参数,留待后续研究。
  3. 打开工程,点击编辑/项目设置/地图和模式将默认地图模式选择为AirSimGameMode,点击运行即可开始仿真。

3. 测试ROS2与AirSim地图的数据传输结果

对ROS2-wrapper和ROS2不熟悉,使用如下方法进行简单测试,后续填坑。

3.1 ORIN使用python-airsim控制无人机起飞

参考知乎专栏

#作者:宁子安
#链接:https://zhuanlan.zhihu.com/p/359214411
#来源:知乎
#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

"""
 airsim 四旋翼飞圆形
 """
import airsim
import numpy as np
import math
import time
​
​
client = airsim.MultirotorClient()  # connect to the AirSim simulator
client.enableApiControl(True)       # 获取控制权
client.armDisarm(True)              # 解锁
client.takeoffAsync().join()        # 起飞
client.moveToZAsync(-3, 1).join()   # 第二阶段:上升到2米高度
​
center = np.array([[0], [5]])    # 圆心设置
speed = 2                        # 速度设置
radius = 5                       # 半径设置
clock_wise = True                # 顺时针或逆时针设置
​
pos_reserve = np.array([[0.], [0.], [-3.]])# 速度控制
for i in range(2000):
    # 获取无人机当前位置
    state = client.simGetGroundTruthKinematics()
    pos = np.array([[state.position.x_val], [state.position.y_val], [state.position.z_val]])
    # 计算径向速度的方向向量
    dp = pos[0:2] - center
    if np.linalg.norm(dp) - radius > 0.1:
        vel_dir_1 = -dp
    elif np.linalg.norm(dp) - radius < 0.1:
        vel_dir_1 = dp
    # 计算切向速度的方向向量
    theta = math.atan2(dp[1, 0], dp[0, 0])
    if clock_wise:
        theta += math.pi / 2
    else:
        theta -= math.pi / 2
    v_dir_2 = np.array([[math.cos(theta)], [math.sin(theta)]])
    # 计算最终速度的方向向量
    v_dir = 0.08 * vel_dir_1 + v_dir_2
    # 计算最终速度指令
    v_cmd = speed * v_dir/np.linalg.norm(v_dir)
    # 速度控制
    client.moveByVelocityZAsync(v_cmd[0, 0], v_cmd[1, 0], -3, 1)
    # 画图
    point_reserve = [airsim.Vector3r(pos_reserve[0, 0], pos_reserve[1, 0], pos_reserve[2, 0])]
    point = [airsim.Vector3r(pos[0, 0], pos[1, 0], pos[2, 0])]
    point_end = pos + np.vstack((v_cmd, np.array([[0]])))
    point_end = [airsim.Vector3r(point_end[0, 0], point_end[1, 0], point_end[2, 0])]
    client.simPlotArrows(point, point_end, arrow_size=8.0, color_rgba=[0.0, 0.0, 1.0, 1.0])
    client.simPlotLineList(point_reserve+point, color_rgba=[1.0, 0.0, 0.0, 1.0], is_persistent=True)
    # 循环
    pos_reserve = pos
    time.sleep(0.02)

结果为:Windows平台下的无人机成功起飞并按照圆形来飞行。

使用ROS2-Wrapper测试

待补充完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值