【Ubuntu 18.04 LTS】AirSim 仿真基礎配置(v1.3.1+UE 4.24)
- 1.虛幻引擎4安裝
- 2.AirSim安裝
- 3.虛幻引擎仿真環境的準備
- 3.1 內置的Blocks場景位於.../AirSim/Unreal/Environments/Blocks路徑下,雙擊Blocks.uproject即打開虛幻引擎場景。
- 3.2 對其做以簡單的設置,點擊Play右側的向下的小三角,而後點擊Advanced Settings,搜索CPU,取消後臺運行時使用較少CPU的勾選,如下圖所示。
- 3.3 點擊Play,即可看到一架無人機出現在場景中,並且已經解鎖,下面使用代碼進行測試
- 3.4 打開終端,更改路徑到Python控制程序(AirSim內置,根據自己防止的AirSim進行適當修改)處:
- 參考文獻:
對於Linux系統,目前AirSim官方測試過的系統版本爲Ubuntu 18.04LTS,推薦使用該版本。
1.虛幻引擎4安裝
1.1 在虛幻引擎4官方網站,註冊並登錄Epic Games賬戶
網址:https://www.unrealengine.com/
1.2 賬號關聯
在個人設置中,關聯自己的GitHub帳號,之後GitHub中的Epic Games會團隊會邀請加入到開發團隊中,之後即可查看或者下載Unreal Engine
網址:https://github.com/EpicGames/UnrealEngine
1.3.安裝(AirSim官方當前官方支持的虛幻引擎版本爲4.24,其他版本並不建議,可能會出現不兼容的情況)
git clone -b 4.24 https://github.com/EpicGames/UnrealEngine.git
cd UnrealEngine
./Setup.sh
./GenerateProjectFiles.sh
make
2.AirSim安裝
git clone https://github.com/Microsoft/AirSim.git
cd AirSim
./setup.sh
./build.sh
在執行./setup.sh時,會下載car_assets.zip,這可能會花費很長時間,如果僅進行無人機仿真的話,可以使用下面的命令來代替:
./setup.sh --no-full-poly-car
3.虛幻引擎仿真環境的準備
AirSim已經準備了一個稱之爲Blocks的簡單仿真環境,當然,這並不一定滿足您的需求,您還可以自行購買或者創建自己的仿真環境,不過值得一提的是,如果要購買仿真場景的話,只能在Windows的虛幻商城中下載,之後可以遷移到Ubuntu中。
如果您需要自行創建或者配置自己的仿真場景,可以參考:
https://qiuming.blog.csdn.net/article/details/104327689
下面我們對使用內置的Blocks場景進行簡單的介紹:
3.1 內置的Blocks場景位於…/AirSim/Unreal/Environments/Blocks路徑下,雙擊Blocks.uproject即打開虛幻引擎場景。
3.2 對其做以簡單的設置,點擊Play右側的向下的小三角,而後點擊Advanced Settings,搜索CPU,取消後臺運行時使用較少CPU的勾選,如下圖所示。
3.3 點擊Play,即可看到一架無人機出現在場景中,並且已經解鎖,下面使用代碼進行測試
3.4 打開終端,更改路徑到Python控制程序(AirSim內置,根據自己防止的AirSim進行適當修改)處:
cd ~/AirSim/PythonClient/multirotor/
python hello_drone.py
此時可能出錯:
No module named msgpackrpc
執行下面的命令安裝缺少的包:
pip install msgpack-rpc-python
而後,重新執行python hello_drone.py
,即可看到終端輸出
fire@fire-P7xxTM1:~/AirSim/PythonClient/multirotor$ python hello_drone.py
Connected!
Client Ver:1 (Min Req: 1), Server Ver:1 (Min Req: 1)
state: <instance> { u'collision': <instance> { u'has_collided': False,
u'impact_point': <instance> { u'x_val': 0.0,
u'y_val': 0.0,
u'z_val': 0.0},
u'normal': <instance> { u'x_val': 0.0,
u'y_val': 0.0,
u'z_val': 0.0},
u'object_id': -1,
u'object_name': u'',
u'penetration_depth': 0.0,
u'position': <instance> { u'x_val': 0.0,
u'y_val': 0.0,
u'z_val': 0.0},
u'time_stamp': 0},
u'gps_location': <instance> { u'altitude': 123.34492492675781,
u'latitude': 47.64197914136834,
u'longitude': -122.14017833284416},
u'kinematics_estimated': <instance> { u'angular_acceleration': <instance> { u'x_val': 0.0,
u'y_val': 0.0,
u'z_val': 0.0},
u'angular_velocity': <instance> { u'x_val': 0.0,
u'y_val': 0.0,
u'z_val': 0.0},
u'linear_acceleration': <instance> { u'x_val': 0.0,
u'y_val': 0.0,
u'z_val': 0.0},
u'linear_velocity': <instance> { u'x_val': 0.0,
u'y_val': 0.0,
u'z_val': 0.0},
u'orientation': <instance> { u'w_val': 1.0,
u'x_val': 0.0,
u'y_val': 0.0,
u'z_val': 0.0},
u'position': <instance> { u'x_val': 0.0,
u'y_val': 0.0,
u'z_val': 0.6750681400299072}},
u'landed_state': 0,
u'rc_data': <instance> { u'is_initialized': False,
u'is_valid': False,
u'left_z': 0.0,
u'pitch': 0.0,
u'right_z': 0.0,
u'roll': 0.0,
u'switches': 0,
u'throttle': 0.0,
u'timestamp': 0,
u'vendor_id': u'',
u'yaw': 0.0},
u'timestamp': 1591066842833506816}
imu_data: <instance> { u'angular_velocity': <instance> { u'x_val': -0.001506683649495244,
u'y_val': 0.0007826467626728117,
u'z_val': -0.0007805040804669261},
u'linear_acceleration': <instance> { u'x_val': 0.04153737053275108,
u'y_val': -0.050786156207323074,
u'z_val': -9.817627906799316},
u'orientation': <instance> { u'w_val': 1.0,
u'x_val': 0.0,
u'y_val': 0.0,
u'z_val': 0.0},
u'time_stamp': 1591066842836506880}
barometer_data: <instance> { u'altitude': 123.32682800292969,
u'pressure': 99851.5859375,
u'qnh': 1013.25,
u'time_stamp': 1591066842824506624}
magnetometer_data: <instance> { u'magnetic_field_body': <instance> { u'x_val': 0.24743011593818665,
u'y_val': 0.03551159054040909,
u'z_val': 0.36682388186454773},
u'magnetic_field_covariance': [ ],
u'time_stamp': 1591066842824506624}
gps_data: <instance> { u'gnss': <instance> { u'eph': 0.3000044822692871,
u'epv': 0.40000447630882263,
u'fix_type': 3,
u'geo_point': <instance> { u'altitude': 123.34492492675781,
u'latitude': 47.64197914136834,
u'longitude': -122.14017833284416},
u'time_utc': 1591066842608502,
u'velocity': <instance> { u'x_val': 0.0,
u'y_val': 0.0,
u'z_val': 0.0}},
u'is_valid': True,
u'time_stamp': 1591066842608502016}
Press any key to takeoff
我們即可根據終端信息提示,進行操作,下面是一張飛行截圖
hello_drone.py的代碼如下:
# ready to run example: PythonClient/multirotor/hello_drone.py
import airsim
# connect to the AirSim simulator
client = airsim.MultirotorClient()
client.confirmConnection()
client.enableApiControl(True)
client.armDisarm(True)
# Async methods returns Future. Call join() to wait for task to complete.
client.takeoffAsync().join()
client.moveToPositionAsync(-10, 10, -10, 5).join()
# take images
responses = client.simGetImages([
airsim.ImageRequest("0", airsim.ImageType.DepthVis),
airsim.ImageRequest("1", airsim.ImageType.DepthPlanner, True)])
print('Retrieved images: %d', len(responses))
# do something with the images
for response in responses:
if response.pixels_as_float:
print("Type %d, size %d" % (response.image_type, len(response.image_data_float)))
airsim.write_pfm(os.path.normpath('/temp/py1.pfm'), airsim.getPfmArray(response))
else:
print("Type %d, size %d" % (response.image_type, len(response.image_data_uint8)))
airsim.write_file(os.path.normpath('/temp/py1.png'), response.image_data_uint8)