In this example we will look at how to compute flight performance for
a set of birds. We will use the birds described in Hedenström and Alerstam (1992). The pacakge has
limited capabilities for handling multiple birds in a
data.frame
. We first load the data set in the workspace.
This prepared data set already has a format recognized by the bird
constructor, and can therefore be used directly as
Bird(climbing_birds)
.
data(climbing_birds) # Load climbing bird data set
climbing_birds <- climbing_birds#[seq(1,15,3),]
myBirds <- Bird(climbing_birds)
myBirds$coef.profileDragLiftFactor[myBirds$name=='Mute swan'] = 0
# we have to assume that swans has specialized aerofoil, as it otherwise won't be able to fly
# this may be true for other birds too, and should be investigated further...
myBirds[c('name','massTotal','wingSpan','wingArea','wingbeatFrequency')]
## name massTotal wingSpan wingArea wingbeatFrequency
## 1 Mute swan 10.56000 2.23 0.540532609 3.5
## 2 Greylag goose 3.57500 1.64 0.316423529 3.8
## 3 Eider 1.79300 0.94 0.105190476 7.0
## 4 Red-throated diver 1.36400 1.11 0.100991803 5.5
## 5 Brent goose 1.36400 1.15 0.123598131 5.0
## 6 Curlew 0.79200 0.90 0.120895522 5.5
## 7 Wigeon 0.71500 0.80 0.078048780 6.5
## 8 Wood pigeon 0.53900 0.78 0.093600000 5.8
## 9 Oystercatcher 0.52800 0.83 0.079183908 5.7
## 10 Arctic tern 0.12100 0.80 0.057142857 4.1
## 11 Song thrush 0.06588 0.34 0.019266667 10.1
## 12 Dunlin 0.04998 0.40 0.014545455 8.1
## 13 Swift 0.04070 0.45 0.015340909 6.8
## 14 Chaffinch 0.02204 0.26 0.012754717 9.8
## 15 Siskin 0.01140 0.21 0.007474576 11.2
As this data set was used in relation to climb performance, we will
use the function findMaximumClimbRate()
:
myBirds$powerAvailable <- computeAvailablePower(myBirds)
climbperf <- findMaximumClimbRate(myBirds,maximumPower = myBirds$powerAvailable,strokeplane=20)
climbperf[c('speed','climbRate','frequency','amplitude')]
## speed climbRate frequency amplitude
## 1 17.437234 0.27598741 3.5 28.95810
## 2 16.085625 0.07381682 3.8 33.26917
## 3 17.923576 0.27167314 7.0 41.48678
## 4 15.314955 0.41368742 5.5 39.44518
## 5 14.640349 0.40712680 5.0 39.08424
## 6 13.151185 0.64786121 5.5 43.73877
## 7 14.122421 0.68897362 6.5 45.47488
## 8 12.467322 0.74436634 5.8 46.58590
## 9 12.320401 0.76769487 5.7 45.44499
## 10 7.033862 0.89175445 4.1 48.30411
## 11 9.882467 1.77672285 10.1 65.18206
## 12 8.455751 1.40921938 8.1 59.83829
## 13 7.277247 1.46502960 6.8 60.39518
## 14 7.546147 1.76797674 9.8 71.69574
## 15 5.013951 2.30762726 11.2 83.54983
Without prescribing an airspeed, this function searches for the airspeed that maximizes climbrate. Climbrate is computed by adding a component of the weight, \(W\sin\gamma\), to the drag (here \(W\) is the weight, and \(\gamma\) is the climb angle), and then finding the climb angle at which the aerodynamic power requirement matches the available power. This gives a slightly different result than the traditional method of converting the power margin at minimum power speed directly, because the propulsive efficiency depends on the thrust requirement. For comparison:
minpower <- findMinimumPowerSpeed(myBirds,strokeplane=20)
climbperf.trad <- data.frame( # compute traditional climb performance
speed = minpower$speed,
climbRate = (myBirds$powerAvailable-minpower$power)/myBirds$massTotal/9.81
)
climbperf[c('speed','climbRate')]/climbperf.trad # compare
## speed climbRate
## 1 1.0187631 0.8421719
## 2 1.0050750 0.7932620
## 3 1.0154745 0.7406871
## 4 1.0263884 0.7817314
## 5 1.0282111 0.7873369
## 6 1.0512358 0.7836472
## 7 1.0493672 0.7673626
## 8 1.0623172 0.7776499
## 9 1.0618622 0.7891940
## 10 1.1104072 0.8354703
## 11 1.1556532 0.7702182
## 12 1.1405148 0.7948562
## 13 1.1547435 0.8160012
## 14 1.1989975 0.7780880
## 15 0.9010589 0.8540825
The climb performance of these birds was observed by radar tracking. The model can predict the maximum climbrate for these observed speeds:
myBirds$climbSpeed <- climbing_birds$climbSpeed # attach observed climb speeds to the bird data
climbperf2 <- findMaximumClimbRate(
myBirds,computeAvailablePower(myBirds),
speed=myBirds$climbSpeed, # specify observed climb speeds
strokeplane=20
)
climbperf2[c('speed','climbRate','frequency','amplitude','strokeplane')]
## speed climbRate frequency amplitude strokeplane
## 1 16.7 0.27277198 3.5 28.95211 20
## 2 15.9 0.07353519 3.8 33.26125 20
## 3 16.9 0.26065227 7.0 41.39131 20
## 4 17.9 0.34735164 5.5 39.51922 20
## 5 16.4 0.37621073 5.0 39.13836 20
## 6 14.9 0.61239513 5.5 43.78936 20
## 7 20.3 0.25871426 6.5 45.51540 20
## 8 15.5 0.62966622 5.8 46.62685 20
## 9 13.6 0.74683532 5.7 45.47474 20
## 10 9.9 0.74390078 4.1 47.88441 20
## 11 12.4 1.63959372 10.1 64.96896 20
## 12 13.9 0.80656514 8.1 59.09936 20
## 13 10.0 1.29593370 6.8 59.79491 20
## 14 11.2 1.39915854 9.8 70.73258 20
## 15 13.4 0.77087587 11.2 75.39675 20