Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Weather API crash #3009

Merged
merged 2 commits into from
Jul 23, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions PythonClient/environment/setup_path.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Import this module to automatically setup path to local airsim module
# This module first tries to see if airsim module is installed via pip
# If it does then we don't do anything else
# Else we look up grand-parent folder to see if it has airsim folder
# and if it does then we add that in sys.path

import os,sys,inspect,logging

#this class simply tries to see if airsim
class SetupPath:
@staticmethod
def getDirLevels(path):
zimmy87 marked this conversation as resolved.
Show resolved Hide resolved
path_norm = os.path.normpath(path)
return len(path_norm.split(os.sep))

@staticmethod
def getCurrentPath():
cur_filepath = os.path.abspath(inspect.getfile(inspect.currentframe()))
return os.path.dirname(cur_filepath)

@staticmethod
def getGrandParentDir():
cur_path = SetupPath.getCurrentPath()
if SetupPath.getDirLevels(cur_path) >= 2:
return os.path.dirname(os.path.dirname(cur_path))
return ''

@staticmethod
def getParentDir():
cur_path = SetupPath.getCurrentPath()
if SetupPath.getDirLevels(cur_path) >= 1:
return os.path.dirname(cur_path)
return ''

@staticmethod
def addAirSimModulePath():
# if airsim module is installed then don't do anything else
#import pkgutil
#airsim_loader = pkgutil.find_loader('airsim')
#if airsim_loader is not None:
# return

parent = SetupPath.getParentDir()
if parent != '':
airsim_path = os.path.join(parent, 'airsim')
client_path = os.path.join(airsim_path, 'client.py')
if os.path.exists(client_path):
sys.path.insert(0, parent)
else:
logging.warning("airsim module not found in parent folder. Using installed package (pip install airsim).")

SetupPath.addAirSimModulePath()
10 changes: 8 additions & 2 deletions Unreal/Plugins/AirSim/Source/WorldSimApi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -377,15 +377,21 @@ bool WorldSimApi::setObjectScale(const std::string& object_name, const Vector3r&

void WorldSimApi::enableWeather(bool enable)
{
UWeatherLib::setWeatherEnabled(simmode_->GetWorld(), enable);
UAirBlueprintLib::RunCommandOnGameThread([this, enable]() {
UWeatherLib::setWeatherEnabled(simmode_->GetWorld(), enable);
},
true);
}

void WorldSimApi::setWeatherParameter(WeatherParameter param, float val)
{
unsigned char param_n = static_cast<unsigned char>(msr::airlib::Utils::toNumeric<WeatherParameter>(param));
EWeatherParamScalar param_e = msr::airlib::Utils::toEnum<EWeatherParamScalar>(param_n);

UWeatherLib::setWeatherParamScalar(simmode_->GetWorld(), param_e, val);
UAirBlueprintLib::RunCommandOnGameThread([this, param_e, val]() {
UWeatherLib::setWeatherParamScalar(simmode_->GetWorld(), param_e, val);
},
true);
}

std::unique_ptr<std::vector<std::string>> WorldSimApi::swapTextures(const std::string& tag, int tex_id, int component_id, int material_id)
Expand Down