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