AirSim笔记7:AirSim中的天气系统

Dec 6,2021   5636 words   21 min

Tags: Simulation

在之前的博客中,我们已经介绍了各种环境下的数据采集,但这些都是在默认的“晴空万里”的天气下进行的。事实上,真实世界中天气多变,不可能永远只有晴天。所以仿真环境也应该具备能够模拟不同天气条件的能力。更进一步而言,这也是我们需要仿真环境的原因之一。很多时候 我们正是因为无法方便的在真实世界中获得不同的天气,才会使用仿真环境。所以本篇博客主要介绍AirSim中天气系统的相关内容。

1.支持哪些天气

官方文档中,给出了支持修改的天气类型,如下。 包括:下雨(Rain)、地面潮湿(Roadwetness)、下雪(Snow)、地面积雪(RoadSnow)、落叶(MapleLeaf)、地面落叶(RoadLeaf)、灰尘(Dust)、雾(Fog)。当然,还包括对于风(Wind)的模拟。

2.如何控制

2.1 手动控制

如下图所示,AirSim启动以后,可以按F10进入天气设置界面。 通过手动设置百分比即可修改强度。但是在我的电脑上启动预编译环境后,按F10无法弹出天气设置界面。所以可以通过代码控制。

2.2 API控制

AirSim提供了控制天气的API,使用起来也非常简单。首先通过client.simEnableWeather(True)将天气系统打开(默认是关闭的)。设置天气的核心函数是client.simSetWeatherParameter()。这个函数需要输入两个参数,第一个参数是天气类型,第二个参数是强度,范围为从0到1。不同类型的天气只需要修改第一个参数即可。官方给出了一个代码示例,感兴趣可以查看。

(1) 下雨

控制下雨的代码如下所示。

# coding=utf-8
import airsim

if __name__ == '__main__':
    # 连接到AirSim
    client = airsim.VehicleClient()
    client.confirmConnection()

    # 设置打开天气控制
    client.simEnableWeather(True)

    # 范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.Rain, 1)

运行AirSim以后再执行上面的脚本,就可以模拟下雨天气,如下所示。

(2) 地面潮湿

控制地面潮湿的代码如下。

# coding=utf-8
import airsim

if __name__ == '__main__':
    # 连接到AirSim
    client = airsim.VehicleClient()
    client.confirmConnection()

    # 设置打开天气控制
    client.simEnableWeather(True)

    # 范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.Roadwetness, 1)

运行AirSim以后再执行上面的脚本,就可以模拟地面潮湿,如下所示。 可以看到,地面上出现了倒影的效果。

(3) 下雪

控制下雪的代码如下。

# coding=utf-8
import airsim

if __name__ == '__main__':
    # 连接到AirSim
    client = airsim.VehicleClient()
    client.confirmConnection()

    # 设置打开天气控制
    client.simEnableWeather(True)

    # 范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.Snow, 1)

运行AirSim以后再执行上面的脚本,就可以模拟大雪纷飞,如下所示。

(4) 地面积雪

模拟地面积雪代码如下。

# coding=utf-8
import airsim

if __name__ == '__main__':
    # 连接到AirSim
    client = airsim.VehicleClient()
    client.confirmConnection()

    # 设置打开天气控制
    client.simEnableWeather(True)

    # 范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.RoadSnow, 1)

运行AirSim以后再执行上面的脚本,就可以模拟地面积雪,如下所示。

(5) 落叶

模拟落叶代码如下。

# coding=utf-8
import airsim

if __name__ == '__main__':
    # 连接到AirSim
    client = airsim.VehicleClient()
    client.confirmConnection()

    # 设置打开天气控制
    client.simEnableWeather(True)

    # 范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.MapleLeaf, 1)

运行AirSim以后再执行上面的脚本,就可以模拟落叶效果,如下所示。

(6) 地面落叶

模拟地面堆积的落叶代码如下。

# coding=utf-8
import airsim

if __name__ == '__main__':
    # 连接到AirSim
    client = airsim.VehicleClient()
    client.confirmConnection()

    # 设置打开天气控制
    client.simEnableWeather(True)

    # 范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.RoadLeaf, 1)

运行AirSim以后再执行上面的脚本,就可以模拟落叶堆积效果,如下所示。

(7) 灰尘

模拟灰尘效果代码如下。

# coding=utf-8
import airsim

if __name__ == '__main__':
    # 连接到AirSim
    client = airsim.VehicleClient()
    client.confirmConnection()

    # 设置打开天气控制
    client.simEnableWeather(True)

    # 范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.Dust, 1)

运行AirSim以后再执行上面的脚本,就可以模拟灰尘效果,如下所示。

(8) 雾

模拟雾的代码如下。

# coding=utf-8
import airsim

if __name__ == '__main__':
    # 连接到AirSim
    client = airsim.VehicleClient()
    client.confirmConnection()

    # 设置打开天气控制
    client.simEnableWeather(True)

    # 范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.Fog, 1)

运行AirSim以后再执行上面的脚本,就可以模拟雾的效果,如下所示。

(9) 风

这里,我们直接把官方的示例搬过来,如下。

import airsim
import time

client = airsim.MultirotorClient()
client.confirmConnection()
client.enableApiControl(True)

client.armDisarm(True)

print("Setting wind to 10m/s in forward direction")  # NED
wind = airsim.Vector3r(10, 0, 0)
client.simSetWind(wind)

# Takeoff or hover
landed = client.getMultirotorState().landed_state
if landed == airsim.LandedState.Landed:
    print("taking off...")
    client.takeoffAsync().join()
else:
    print("already flying...")
    client.hoverAsync().join()

time.sleep(5)

print("Setting wind to 15m/s towards right")  # NED
wind = airsim.Vector3r(0, 15, 0)
client.simSetWind(wind)

time.sleep(5)

# Set wind to 0
print("Resetting wind to 0")
wind = airsim.Vector3r(0, 0, 0)
client.simSetWind(wind)

运行AirSim以后再执行上面的脚本,就可以模拟风的效果,如下所示。 需要注意的是,风属性对Car是不起作用的。

(10) 光照

当然,虽然AirSim中并不把光照作为天气的一种。但其实光照也会间接影响环境的。在AirSim中我们并不能直接设置光照,而是设置时间和地理位置,AirSim会根据这些信息计算出当前应该是上午/下午/晚上,从而给出对应的光照。关于光照的具体设置参考这篇博客,已经介绍过了。当然了AirSim也提供了API接口,叫做client.simSetTimeOfDay()

上述所有代码还是都放在了Github项目中,点击查看

3.实际场景模拟

上面我们介绍了各种可以模拟的效果。但只是模拟单个天气很多时候看起来不真实,比如下雨的时候还是晴空万里。所以我们可以把上面的各种效果组合起来,形成更加真实的场景。下面简单列举几个实例。

3.1 暴雨城市

主要涉及到下雨、地面潮湿和雾这三个因素,场景基于CityEnviron。仿真代码如下。

# coding=utf-8
import airsim

if __name__ == '__main__':
    # 连接到AirSim
    client = airsim.VehicleClient()
    client.confirmConnection()

    # 设置打开天气控制
    client.simEnableWeather(True)

    # 下雨,范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.Rain, 1)

    # 地面潮湿,范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.Roadwetness, 1)

    # 雾,范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.Fog, 0.5)

运行AirSim以后再执行上面的脚本,模拟效果如下所示。

3.2 飘雪小镇

主要涉及到下雪、地面积雪和雾这三个因素,场景基于AirSimNH。仿真代码如下。

# coding=utf-8
import airsim

if __name__ == '__main__':
    # 连接到AirSim
    client = airsim.VehicleClient()
    client.confirmConnection()

    # 设置打开天气控制
    client.simEnableWeather(True)

    # 下雪,范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.Snow, 1)

    # 地面积雪,范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.RoadSnow, 1)

    # 雾,范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.Fog, 0.5)

运行AirSim以后再执行上面的脚本,模拟效果如下所示。

3.3 迷雾海岸

主要涉及到雾这一个属性,场景基于Coastline。仿真代码如下。

# coding=utf-8
import airsim

if __name__ == '__main__':
    # 连接到AirSim
    client = airsim.VehicleClient()
    client.confirmConnection()

    # 设置打开天气控制
    client.simEnableWeather(True)

    # 雾,范围为0到1,1表示最强
    client.simSetWeatherParameter(airsim.WeatherParameter.Fog, 1)

运行AirSim以后再执行上面的脚本,模拟效果如下所示。

3.4 飘渺仙境

和迷雾海岸一样,还是涉及到雾这个属性,场景基于Zhangjiajie。效果如下。

上面的代码也都上传到了Github项目中,点击查看

4.参考资料

  • [1] https://microsoft.github.io/AirSim/apis/#weather-apis
  • [2] https://microsoft.github.io/AirSim/#weather-effects
  • [3] https://github.com/Microsoft/AirSim/blob/master/PythonClient/environment/weather.py
  • [4] https://github.com/Microsoft/AirSim/blob/master/PythonClient/multirotor/set_wind.py

本文作者原创,未经许可不得转载,谢谢配合

返回顶部