在AirSim中如何获取三维环境真值

在仿真测试中,环境的三维地图真值十分重要,可以作为各类建图算法的评价依据,也可以用来调试三维路径规划、避障等算法。然而很多时候仿真环境的三维真值不容易获取。

在2020年12月,AirSim添加了一项新功能:直接从仿真环境获取指定范围和精度的voxel grid,以binvox格式保存,而binvox格式的文件又可以很容易转换成octomap,方便用户进一步使用。

以下是该功能的使用测试。

  • 系统配置:ubuntu 16.04 (ros kinetic), Python 3.6.13, UE 4.24, AirSim版本见下文

升级python

ubuntu 16.04自带的python版本是3.5+,虽然AirSim在文档中说自己的python接口可以兼容2.7和3.5,但是经过我测试使用起来还是会碰到3.5没有的特性,所以首先需要把python升级到3.6以上(如果是比16.04更高版本的ubuntu应该就不会有此问题)。

依照链接:ubuntu升级python版本(3.5->3.6)执行升级后会出现terminal打不开的情况,按照此链接Ubuntu16.04TLS 中终端(Terminal)无法打开的解决办法提供的方法即可解决。

升级了python以后,诸如numpy、msgpack-rpc-python、opencv-python等常用包需要重新安装。

获取AirSim

添加了三维真值获取功能的pr是:#3209,而在此之后不久(pr#3227),AirSim就全面升级成了支持UE 4.25。如果你像我一样之前使用的是UE 4.24,又暂时不想做升级,那么merge到#3209这个commit就好了。之后的编译过程不再赘述。

获取viewvox

viewvox是一个查看voxel grid的工具,下载linux版本后可以直接使用。(需先执行chmod赋予可执行程序权限)

viewvox可能会需要的前置安装:

sudo apt-get install python3.6-gdbm

使用测试

测试的python脚本如下(与pr相比有改动):

import setup_path
import airsim

c = airsim.VehicleClient()
center = airsim.Vector3r(0,0,0)
c.simCreateVoxelGrid(center,100,100,100,0.5,"map.binvox")

需要注意的一点是:因为我的系统里有ros-kinetic,所以有对应python 2.7的opencv,直接运行以上脚本会遇到类似

ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type

的错误,显然是py路径上python 2.7的opencv挡路了,所以在程序里import cv2时会报错。

解决办法是找到AirSim脚本里第一次的import cv2,在前面把python 2.7的路径去掉就行了。比如在这里就是,打开/AirSim/PythonClient/airsim/utils.py,在import cv2前面加入:

sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')

即可。

启动Unreal Engine,打开Blocks仿真环境并运行,执行以上脚本,就会生成一个名为“map.binvox”的voxel grid文件,默认保存路径为:/UnrealEngine/Engine/Binaries/Linux/map.binvox

使用viewvox打开后效果如下:

以上是下图右侧显示的Blocks仿真环境的三维地图真值。

你可能感兴趣的:(AirSim,airsim,微软,仿真)