Skip to content
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
7 changes: 3 additions & 4 deletions AirLib/include/common/AirSimSettings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -430,10 +430,9 @@ struct AirSimSettings {
{
auto it = vehicles.find(vehicle_name);
if (it == vehicles.end())
throw std::invalid_argument(Utils::stringf("VehicleSetting for vehicle name %s was requested but not found",
vehicle_name.c_str()).c_str());
else
return it->second.get();
// pre-existing flying pawns in Unreal Engine don't have name 'SimpleFlight'
it = vehicles.find("SimpleFlight");
return it->second.get();
}

private:
Expand Down
4 changes: 2 additions & 2 deletions AirLib/include/vehicles/multirotor/RotorParams.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ namespace msr {
max_speed_square = pow(max_speed, 2.0f);

real_T nsquared = revolutions_per_second * revolutions_per_second;
max_thrust = static_cast<real_T>(C_T * air_density * nsquared * pow(propeller_diameter, 4));
max_torque = static_cast<real_T>(C_P * air_density * nsquared * pow(propeller_diameter, 5) / (2 * M_PI));
max_thrust = C_T * air_density * nsquared * static_cast<real_T>(pow(propeller_diameter, 4));
max_torque = C_P * air_density * nsquared * static_cast<real_T>(pow(propeller_diameter, 5)) / (2 * M_PIf);
}

};
Expand Down
93 changes: 54 additions & 39 deletions Unreal/Plugins/AirSim/Source/SimMode/SimModeBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,16 +91,28 @@ void ASimModeBase::BeginPlay()

//get player start
//this must be done from within actor otherwise we don't get player start
APlayerController* player_controller = this->GetWorld()->GetFirstPlayerController();
TArray<AActor*> pawns;
getExistingVehiclePawns(pawns);
bool have_existing_pawns = pawns.Num() > 0;
AActor* fpv_pawn = nullptr;
// Grab player location
FTransform player_start_transform = player_controller->GetViewTarget()->GetActorTransform();
FVector player_loc = player_start_transform.GetLocation();
FTransform player_start_transform;
FVector player_loc;
if (have_existing_pawns) {
fpv_pawn = pawns[0];
}
else {
APlayerController* player_controller = this->GetWorld()->GetFirstPlayerController();
fpv_pawn = player_controller->GetViewTarget();
}
player_start_transform = fpv_pawn->GetActorTransform();
player_loc = player_start_transform.GetLocation();
// Move the world origin to the player's location (this moves the coordinate system and adds
// a corresponding offset to all positions to compensate for the shift)
this->GetWorld()->SetNewWorldOrigin(FIntVector(player_loc) + this->GetWorld()->OriginLocation);
// Regrab the player's position after the offset has been added (which should be 0,0 now)
player_start_transform = player_controller->GetViewTarget()->GetActorTransform();
global_ned_transform_.reset(new NedTransform(player_start_transform,
// Regrab the player's position after the offset has been added (which should be 0,0,0 now)
player_start_transform = fpv_pawn->GetActorTransform();
global_ned_transform_.reset(new NedTransform(player_start_transform,
UAirBlueprintLib::GetWorldToMetersScale(this)));

UAirBlueprintLib::GenerateAssetRegistryMap(this, asset_map);
Expand Down Expand Up @@ -548,42 +560,45 @@ void ASimModeBase::setupVehiclesAndCamera()
{
TArray<AActor*> pawns;
getExistingVehiclePawns(pawns);

bool haveUEPawns = pawns.Num() > 0;
APawn* fpv_pawn = nullptr;

//add vehicles from settings
for (auto const& vehicle_setting_pair : getSettings().vehicles)
{
//if vehicle is of type for derived SimMode and auto creatable
const auto& vehicle_setting = *vehicle_setting_pair.second;
if (vehicle_setting.auto_create &&
isVehicleTypeSupported(vehicle_setting.vehicle_type)) {

//compute initial pose
FVector spawn_position = uu_origin.GetLocation();
Vector3r settings_position = vehicle_setting.position;
if (!VectorMath::hasNan(settings_position))
spawn_position = getGlobalNedTransform().fromGlobalNed(settings_position);
FRotator spawn_rotation = toFRotator(vehicle_setting.rotation, uu_origin.Rotator());

//spawn vehicle pawn
FActorSpawnParameters pawn_spawn_params;
pawn_spawn_params.Name = FName(vehicle_setting.vehicle_name.c_str());
pawn_spawn_params.SpawnCollisionHandlingOverride =
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
auto vehicle_bp_class = UAirBlueprintLib::LoadClass(
getSettings().pawn_paths.at(getVehiclePawnPathName(vehicle_setting)).pawn_bp);
APawn* spawned_pawn = static_cast<APawn*>( this->GetWorld()->SpawnActor(
vehicle_bp_class, &spawn_position, &spawn_rotation, pawn_spawn_params));

spawned_actors_.Add(spawned_pawn);
pawns.Add(spawned_pawn);

if (vehicle_setting.is_fpv_vehicle)
fpv_pawn = spawned_pawn;

if (haveUEPawns) {
fpv_pawn = static_cast<APawn*>(pawns[0]);
} else {
//add vehicles from settings
for (auto const& vehicle_setting_pair : getSettings().vehicles)
{
//if vehicle is of type for derived SimMode and auto creatable
const auto& vehicle_setting = *vehicle_setting_pair.second;
if (vehicle_setting.auto_create &&
isVehicleTypeSupported(vehicle_setting.vehicle_type)) {

//compute initial pose
FVector spawn_position = uu_origin.GetLocation();
Vector3r settings_position = vehicle_setting.position;
if (!VectorMath::hasNan(settings_position))
spawn_position = getGlobalNedTransform().fromGlobalNed(settings_position);
FRotator spawn_rotation = toFRotator(vehicle_setting.rotation, uu_origin.Rotator());

//spawn vehicle pawn
FActorSpawnParameters pawn_spawn_params;
pawn_spawn_params.Name = FName(vehicle_setting.vehicle_name.c_str());
pawn_spawn_params.SpawnCollisionHandlingOverride =
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
auto vehicle_bp_class = UAirBlueprintLib::LoadClass(
getSettings().pawn_paths.at(getVehiclePawnPathName(vehicle_setting)).pawn_bp);
APawn* spawned_pawn = static_cast<APawn*>(this->GetWorld()->SpawnActor(
vehicle_bp_class, &spawn_position, &spawn_rotation, pawn_spawn_params));

spawned_actors_.Add(spawned_pawn);
pawns.Add(spawned_pawn);

if (vehicle_setting.is_fpv_vehicle)
fpv_pawn = spawned_pawn;
}
}
}

//create API objects for each pawn we have
for (AActor* pawn : pawns)
{
Expand Down