提问 发文

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

微微菌

| 2024-04-01 17:31 850 0 0

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


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


2. Windows端环境配置
2.1 下载Epic Game游戏软件和Unreal Engine
下载Epic Game游戏软件

界面如下


点击左侧Unreal Engine->Library选择对应的UE版本,我选择4.27。
UE引擎下载完毕后,在Marketplace界面选择目标场景下载(须与刚下载的引擎兼容)并创建工程。
右键点击工程的uproject文件,Generate Visual Studio Projectfiels,生成C++项目,以和AirSim源码一起生成。
2.2 UE工程配置AirSim插件
仿照 1.1 AirSim插件配置在Windows平台下载、setup、编译AirSim插件;
以下内容参考了——AirSim配置Unreal Environment
将编译后AirSimRootDir/Unreal/Plugins文件夹复制到UE工程根目录(此目录下存在UEProjectName.uproject文件);
使用记事本打开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
}
]
}


在UE工程根目录下,使用记事本打开Config\DefaultGame.ini文件并在末尾添加
+MapsToCook=(FilePath="/AirSim/AirSimAssets")
目的是将AirSim的content添加到UE工程。
打开文档/AirSim/settings文件,添加"SimMode":"Multirotor"设置,将仿真节点设置为无人机。该文件可以用来配置仿真环境中无人机/车的各种物理参数,留待后续研究。
打开工程,点击编辑/项目设置/地图和模式将默认地图模式选择为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测试

待补充完善。

本文为二次转载。

收藏 0
分享
分享方式
微信

评论

游客

全部 0条评论

10603

文章

10.5W+

人气

19

粉丝

1

关注

官方媒体

轻松设计高效搭建,减少3倍设计改稿与开发运维工作量

开始免费试用 预约演示

扫一扫关注公众号 扫一扫联系客服

©Copyrights 2016-2022 杭州易知微科技有限公司 浙ICP备2021017017号-3 浙公网安备33011002011932号

互联网信息服务业务 合字B2-20220090

400-8505-905 复制
免费试用
微信社区
易知微-数据可视化
微信扫一扫入群