{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Concise Form of Dimensional EoMs (Undergraduate Version)\n",
"\n",
"\n",
"```{admonition} An update\n",
":class: dropdown\n",
"The following is the derivation that *I* was taught when I was an undergrad - and the derivation captures all the important things that need to be instilled in a good graduate engineer. That is; it captures the physics of the situation and it helps one to understand where different terms come from, and how quantities are interrelated.\n",
"\n",
"However - the methodology below is great _if you already have a set of stability derivatives presented in concise, dimensional form_. In reality, as I have discovered working as an S&C engineer, you'll rarely get this.\n",
"\n",
"So the following is great for understanding how the equations are developed and how we get there, but I'll present a slightly different methodology in the section after this. My coding skills have also improved since I first wrote this website, and I'll write a means to store and convert derivatives in a _slightly-more_ object oriented fashion. Whatever that means.\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {
"tags": [
"remove-input",
"remove-output"
]
},
"source": [
"$$\\newcommand{\\pd}[2]{\\frac{\\partial#1}{\\partial#2}}$$\n",
"$$\\newcommand{\\ppd}[2]{\\frac{\\partial^2#1}{\\partial#2^2}}$$\n",
"$$\\newcommand{\\pppd}[2]{\\frac{\\partial^3#1}{\\partial#2^3}}$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As demonstrated above, the dimensional EoMs are either symmetric (a.k.a. longitudinal), where $u,w,q$ are controlled by $\\theta$ and $\\delta_e$, or asymmetric (a.k.a. lateral/directional) where $v,p,r$ are controlled by $\\delta_a$ and $\\delta_r$. This is a consequence of our assumptions made to remove stability derivatives.\n",
"\n",
"That is, this was _enforced_ by the [assumption of zero cross-coupling](assmption:cross-coupling) rather than being a natural consequence of the physics.\n",
"\n",
"Since these assumptions have been made, the two sets of equations may be treated in isolation from each other and presented in a matrix form. First, look at the symmetric equations:\n",
"\n",
"$$\\color{red}{m\\dot{u}= \\left.\\pd{X}{u}\\right|_0u + \\left.\\pd{X}{w}\\right|_0w - mg\\cdot\\cos\\theta_0\\cdot\\theta^\\prime}$$(eq:fwdspeedeqn)\n",
"\n",
"\n",
"$$\\color{red}{m\\dot{w}= \\left.\\pd{Z}{u}\\right|_0u + \\left.\\pd{Z}{w}\\right|_0w + mU_0q - mg\\cdot\\sin\\Theta_0\\cdot\\theta^\\prime + \\left.\\pd{Z}{\\delta_e}\\right|_0\\delta_e}$$(eq:heaveequation)\n",
"\n",
"\n",
"\n",
"$$\\color{red}{I_{yy}\\dot{q} = \\left.\\pd{M}{u}\\right|_0u+\\left.\\pd{M}{w}\\right|_0w+\\left.\\pd{M}{\\dot{w}}\\right|_0\\dot{w}+\\left.\\pd{M}{q}\\right|_0q+\\left.\\pd{M}{\\delta_e}\\right|_0\\delta_e}$$(eq:pitchmomentequation)\n",
"\n",
"\n",
"\n",
"\n",
"### Longitudinal EoMs\n",
"\n",
"1. The X-Force equation (*forward speed equation*):\n",
"\n",
" Taking Equation {eq}`eq:fwdspeedeqn` and dividing by $m$:\n",
"\n",
" $$\\dot{u} = X_uu + X_ww - g\\cdot\\cos\\theta_0\\theta^\\prime$$(eq:concisex)\n",
" \n",
" where\n",
" \n",
" $$X_u\\triangleq \\frac{1}{m}\\left.\\pd{X}{u}\\right|_0, X_w\\triangleq \\frac{1}{m}\\left.\\pd{X}{w}\\right|_0$$\n",
" \n",
"2. The Z-Force equation (*heave equation*):\n",
"\n",
" Taking Equation {eq}`eq:heaveequation` and dividing by $m$:\n",
"\n",
" $$\\dot{w} = Z_uu + Z_ww + U_eq - g\\cdot\\sin\\theta_0\\cdot\\theta^\\prime + Z_{\\delta_e}\\delta_e$$(eq:concisew)\n",
" \n",
" where\n",
" \n",
" $$Z_u\\triangleq \\frac{1}{m}\\left.\\pd{Z}{u}\\right|_0, Z_w\\triangleq \\frac{1}{m}\\left.\\pd{Z}{w}\\right|_0, Z_{\\delta_e}\\triangleq \\frac{1}{m}\\left.\\pd{Z}{\\delta_e}\\right|_0$$\n",
"\n",
"3. The M-Moment equation (*pitching moment equation*):\n",
"\n",
" If we take Equation {eq}`eq:pitchmomentequation` and divide by $I_{yy}$:\n",
"\n",
" $$\\dot{q} = M_uu + M_ww + M_{\\dot{w}}\\dot{w} + M_qq + M_{\\delta_e}\\delta_e$$\n",
" \n",
" where\n",
" \n",
" $$M_u\\triangleq \\frac{1}{I_{yy}}\\left.\\pd{M}{u}\\right|_0, \\text{and the rest of the pattern should be clear}$$\n",
" \n",
" There is already an expression for $\\dot{w}$, Equation {eq}`eq:concisew`, which may be substituted in:\n",
" \n",
" $$\\dot{q} = M_uu + M_ww + M_{\\dot{w}}\\left(Z_uu + Z_ww + U_eq - g\\cdot\\sin\\theta_0\\cdot\\theta^\\prime + Z_{\\delta_e}\\delta_e \\right) + M_qq + M_{\\delta_e}\\delta_e$$\n",
" \n",
" and can be simplified[^4] to:\n",
" \n",
" $$\\dot{q} = M_u^*u + M_w^*w +M_\\omega^*\\omega + M_q^*q + M_{\\delta_e}^*\\delta_e$$(eq:conciseq)\n",
" \n",
" where\n",
" \n",
" $$\\begin{split}&M_u^*\\triangleq M_u + M_{\\dot{w}}Z_u\\hphantom{======} M_w^*\\triangleq M_w+M_{\\dot{w}}Z_w\\hphantom{======}M_q^*\\triangleq M_q+M_{\\dot{w}}U_0\\\\\n",
"&M_{\\delta_e}^*\\triangleq M_{\\delta_e}+M_{\\dot{w}}Z_{\\delta_e}\\hphantom{======}M_{\\theta}^*\\triangleq-M_{\\dot{w}}g\\sin\\theta_0\n",
" \\end{split}$$(eq:conciseqterms)\n",
"\n",
"4. The linearised Euler pitch equation (*pitch rate kinematic equation*):\n",
"\n",
" $q$ is pitch rate, from Eq {eq}`eq:pitchratekinematic`: \n",
" \n",
" $$\\dot{\\theta}^\\prime = q$$\n",
"\n",
"Now Equations {eq}`eq:concisex`, {eq}`eq:concisew`, {eq}`eq:conciseq`, and {eq}`eq:pitchratekinematic` can be written in matrix form to give the **linearised equation of longitudinal motion in concise form**:\n",
"\n",
"$$\\begin{aligned}\n",
" \\begin{bmatrix} \\dot{u}\\\\\\dot{w}\\\\\\dot{q}\\\\\\dot{\\theta}\\end{bmatrix} &= \\begin{bmatrix}\n",
" X_u & X_w & 0 & -g\\cdot\\cos\\theta_0\\\\\n",
" Z_u & Z_w & U_0 & -g\\cdot\\sin\\theta_0\\\\\n",
" M_u^* & M_w^* & M_q^* & M_\\theta^*\\\\\n",
" 0 & 0 & 1 & 0 \n",
" \\end{bmatrix}\\begin{bmatrix}\n",
" {u}\\\\{w}\\\\{q}\\\\{\\theta} \n",
" \\end{bmatrix} + \\begin{bmatrix}\n",
" 0\\\\Z_{\\delta_e}\\\\M_{\\delta_e}^*\\\\0 \n",
" \\end{bmatrix}\\left[\\delta_e\\right]\\end{aligned}$$(eq:conciselon)\n",
"$$\\dot{\\vec{x}} = A\\vec{x} + B\\vec{u}$$\n",
"\n",
"Which is in state space form. Equation {eq}`eq:conciselon` is a series of simultaneous 1st order ODEs with constant coefficients which may solved to find the longitudinal response ($u,v,q,\\theta$) of an aircraft due to elevator deflection ($\\delta_e$).\n",
"\n",
"[^4]: recalling that _simplify_ often means _make look nicer, but complicate the matter by introducing new terminology_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Lateral/Directional EoMs\n",
"\n",
"The asymmetric or lateral/directional EoMs may be similarly manipulated.\n",
"\n",
"$$\\color{darkgreen}{m\\dot{v}=\\left.\\pd{Y}{v}\\right|_0v - mU_0r+mg\\cdot cos\\theta_0\\cdot\\phi^\\prime\\left.\\pd{Y}{\\delta_r}\\right|_0\\delta_r}$$(eq:sideslipequation)\n",
" \n",
"$$\\color{darkgreen}{I_{xx}\\dot{p} - I_{xz}\\dot{r} = \\left.\\pd{L}{v}\\right|_0v + \\left.\\pd{L}{p}\\right|_0p+\\left.\\pd{L}{r}\\right|_0r+\\left.\\pd{L}{\\delta_r}\\right|_0\\delta_r+\\left.\\pd{L}{\\delta_a}\\right|_0\\delta_a}$$(eq:rollmomentequation)\n",
"\n",
"$$\\color{darkgreen}{I_{zz}\\dot{r}-I_{xz}\\dot{p} = \\left.\\pd{N}{v}\\right|_0v+ \\left.\\pd{N}{p}\\right|_0p + \\left.\\pd{N}{r}\\right|_0r + \\left.\\pd{N}{\\delta_r}\\right|_0\\delta_r+ \\left.\\pd{N}{\\delta_a}\\right|_0\\delta_a}$$(eq:yawmomentequation)\n",
"\n",
"1. The Y-Force equation (*sideslip equation*): Taking Equation {eq}`eq:sideslipequation` and dividing by $m$:\n",
"\n",
" $$\\dot{v} = Y_vv-U_er + g\\cdot\\cos\\theta_0\\phi + Y_{\\delta_r}{\\delta_r}$$\n",
"\n",
" where\n",
" \n",
" $$Y_v\\triangleq\\frac{1}{m}\\pd{Y}{v},\\,Y_{\\delta_r}\\triangleq\\frac{1}{m}\\pd{Y}{\\delta_r}$$\n",
"\n",
"2. The two moment equations are coupled, so need to be decoupled. Dividing Equation {eq}`eq:rollmomentequation` by the rolling moment of inertia, $I_xx$:\n",
"\n",
" $$\\dot{p} = \\frac{I_{xz}}{I_{xx}}\\dot{r} + L_vv + L_pp + L_rr + L_{\\delta_r}{\\delta_r} + L_{\\delta_a}\\delta_a$$(eq:rollingint)\n",
" \n",
" where\n",
" \n",
" $$L_v\\triangleq\\frac{1}{I_{xx}}\\pd{L}{v},\\,L_{p}\\triangleq\\frac{1}{I_{xx}}\\pd{L}{p},\\,\\text{etc.}$$\n",
"\n",
" the same can be performed for {eq}`eq:yawmomentequation`, dividing by the yawing moment of inertia $I_{zz}$:\n",
"\n",
" $$\\dot{r} = \\frac{I_{xz}}{I_{zz}}\\dot{p} + N_vv+N_pp + N_rr + N_{\\delta_r}\\delta_r+N_{\\delta_a}\\delta_a$$(eq:yawingint)\n",
"\n",
" Clearly Equations {eq}`eq:rollingint` and {eq}`eq:yawingint` are coupled, and must be decoupled if we want to use them in standard form. Substituting equation {eq}`eq:yawingint` into {eq}`eq:rollingint`, after a little manipulation (if you do this yourself, I promise you'll understand this subject better), the following is achieved: \n",
"\n",
" $$\\begin{split}\\dot{p}\\left(1-\\frac{I_{xz}^2}{I_{xx}I_{zz}}\\right) &= \\left(L_v + \\frac{I_{xz}}{I_{xx}}N_v\\right)v + \\left(L_p + \\frac{I_{xz}}{I_{xx}}N_p\\right)p+\\left(L_r+\\frac{I_{xz}}{I_{xx}}N_r\\right)r +\\ldots\\\\ &\\left(L_{\\delta_r} + \\frac{I_{xz}}{I_{xx}N_{\\delta_r}}\\right)\\delta_r + \\left(L_{\\delta_a}+\\frac{I_{xz}}{I_{xx}}N_{\\delta_a}\\right)\\delta_a\\end{split}$$\n",
"\n",
" Noting that:\n",
"\n",
" $$1-\\frac{I_{xz}^2}{I_{xx}I_{zz}} = \\frac{I_{xx}I_{zz}-I_{zz}^2}{I_{xx}I_{zz}}$$\n",
"\n",
" hence, the **rolling moment equation** may be weitten as:\n",
"\n",
" $$\\dot{p} = L_v^*v + L_p^*p + L_r^*r+L_{\\delta_r}^*\\delta_r+L_{\\delta_a}^*\\delta_a$$\n",
"\n",
" where:\n",
"\n",
" $$\\begin{gathered}\n",
" L_v^* = \\frac{I_{xx}I_{zz}}{I_{xx}I_{zz}-I_{xz}^2}\\left(L_v+\\frac{I_{xz}}{I_{xx}}N_v\\right) \\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\, L_p^*=\\frac{I_{xx}I_{zz}}{I_{xx}I_{zz}-I_{xz}^2}\\left(L_p+\\frac{I_{xz}}{I_{xx}}N_p\\right)\\\\\n",
" L_r^* = \\frac{I_{xx}I_{zz}}{I_{xx}I_{zz}-I_{xz}^2}\\left(L_r+\\frac{I_{xz}}{I_{xx}}N_r\\right) \\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\, L_{\\delta_r}^*=\\frac{I_{xx}I_{zz}}{I_{xx}I_{zz}-I_{xz}^2}\\left(L_{\\delta_r}+\\frac{I_{xz}}{I_{xx}}N_{\\delta_r}\\right)\\\\\n",
" L_{\\delta_a}^*=\\frac{I_{xx}I_{zz}}{I_{xx}I_{zz}-I_{xz}^2}\\left(L_{\\delta_a}+\\frac{I_{xz}}{I_{xx}}N_{\\delta_a}\\right)\n",
" \\end{gathered}$$\n",
"\n",
" Similarly, by substituting {eq}`eq:rollingint` into {eq}`eq:yawingint`, the **yawing moment equation** is yielded:\n",
"\n",
" $$\\dot{r} = N_v^*v + N_p^*p + N_r^*r + N_{\\delta_r}^*\\delta_r + N_{\\delta_a}^*\\delta_a$$\n",
"\n",
" where:\n",
"\n",
" $$\\begin{gathered}\n",
" N_v^* = \\frac{I_{xx}I_{zz}}{I_{xx}I_{zz}-I_{xz}^2}\\left(N_v+\\frac{I_{xz}}{I_{zz}}L_v\\right) \\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\, N_p^*=\\frac{I_{xx}I_{zz}}{I_{xx}I_{zz}-I_{xz}^2}\\left(N_p+\\frac{I_{xz}}{newI_{zz}}L_p\\right)\\\\\n",
" N_r^* = \\frac{I_{xx}I_{zz}}{I_{xx}I_{zz}-I_{xz}^2}\\left(N_r+\\frac{I_{xz}}{I_{zz}}L_r\\right) \\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\, N_{\\delta_r}^*=\\frac{I_{xx}I_{zz}}{I_{xx}I_{zz}-I_{xz}^2}\\left(N_{\\delta_r}+\\frac{I_{xz}}{I_{zz}}L_{\\delta_r}\\right)\\\\\n",
" N_{\\delta_a}^*=\\frac{I_{xx}I_{zz}}{I_{xx}I_{zz}-I_{xz}^2}\\left(N_{\\delta_a}+\\frac{I_{xz}}{I_{zz}}L_{\\delta_a}\\right) \n",
" \\end{gathered}$$\n",
"\n",
" often $I_{xz}$ is small compared to $I_{xx}$ and $I_{zz}$, so for these circumstances $N_v^*\\simeq N_v$, $L_v^*\\simeq L_v$\n",
"\n",
"\n",
"3. Lastly, the yaw rate and body rate kinematic equations give:\n",
"\n",
" $$\\begin{aligned}\n",
" r &= \\dot{\\psi}\\cos\\theta_0\\\\\n",
" \\implies \\dot{\\psi} &= r\\cdot\\sec\\theta_0\\\\\n",
" p &= \\dot{\\phi}-\\dot{\\psi}\\sin\\theta_0\\\\\n",
" \\implies\\dot{\\phi} &= p + r\\cdot\\tan\\theta_0\n",
" \\end{aligned}$$\n",
"\n",
"So finally, the *linearised lateral/directional equations of motion* may be expressed in *state-space form:*\n",
"\n",
"$$\\begin{bmatrix}\\dot{v}\\\\\\dot{p}\\\\\\dot{r}\\\\\\dot{\\phi}\\\\\\dot{\\psi}\\end{bmatrix}=\\begin{bmatrix}Y_v & 0 & -U_0 & g\\cdot\\cos\\theta_0 & 0\\\\L_v^* & L_p^* & L_r^* & 0 & 0\\\\N_v^* & N_p^* & N_r^* & 0 & 0\\\\0 & 1 & \\tan\\theta_0 & 0 & 0 \\\\ 0 & 0 & \\sec\\theta_0 & 0 & 0\\end{bmatrix}\\begin{bmatrix}v\\\\p\\\\r\\\\\\phi\\\\\\psi\\end{bmatrix}+\\begin{bmatrix}Y_{\\delta_r} & 0\\\\L_{\\delta_r}^* & L_{\\delta_a}^*\\\\N_{\\delta_r}^* & N_{\\delta_a}^*\\\\0 & 0\\\\0 & 0\\end{bmatrix}\\begin{bmatrix}\\delta_r\\\\\\delta_a\\end{bmatrix}$$(eq:conciselat)\n",
"\n",
"These are a series of linear differential equations which may be solved to give the aircraft lateral/directional response to inputs of rudder and aileron. You can observe that only the final equation has terms that involve $\\psi$, and it may solved in isolation.\n",
"\n",
"The two sets of matrix equations, {eq}`eq:conciselon` and {eq}`eq:conciselat`, are known as *the equations of motion in concise form*.\n",
"\n",
"As will prove to be integral to Module 5, these are in **state space form**\n",
"\n",
"$$\\dot{\\vec{x}} = \\boldsymbol{A}\\vec{x} + \\boldsymbol{B}\\vec{u}$$\n",
"\n",
"where \n",
"\n",
"$$\\vec{x} = \\text{the state vector (n)}$$\n",
"$$\\vec{u} = \\text{the control matrix (m)}$$\n",
"$$\\boldsymbol{A} = \\text{the system matrix (n by n)}$$\n",
"$$\\boldsymbol{B} = \\text{the control matrix (n by m)}$$\n",
"\n",
"for a system with $n$ states and $m$ controls. There are three reasons why we write the equations of motion in state space form:\n",
"\n",
"- The aircraft stability characteristics are obtained directly from the system matrix, $\\boldsymbol{A}$ - this will be explored in the final module.\n",
"\n",
"- In studies of aircraft control systems, the state space form is easiest to analyse.\n",
"\n",
"- Since $\\boldsymbol{A}$ and $\\boldsymbol{B}$ are constant matrices, we can numerically integrate the equations of motion (using a Runge-Kutta method) to obtain the **time response** of the aircraft to a given control displacement - we may wish to calculate the longitudinal response (time histories of $u,w,q,\\theta$) to a step change in elevator, $\\delta_e$.\n",
"\n",
"For the longitudinal equations in state space form, we have:\n",
"\n",
"$$\\boldsymbol{A}=\\begin{bmatrix}\n",
" X_u & X_w & 0 & -g\\cdot\\cos\\theta_0\\\\\n",
" Z_u & Z_w & U_0 & -g\\cdot\\sin\\theta_0\\\\\n",
" M_u^* & M_w^* & M_q^* & M_\\theta^*\\\\\n",
" 0 & 0 & 1 & 0 \n",
" \\end{bmatrix}, \\vec{x}=\\begin{bmatrix}\n",
" {u}\\\\{w}\\\\{q}\\\\{\\theta} \n",
" \\end{bmatrix}, \\boldsymbol{B}= \\begin{bmatrix}\n",
" 0\\\\Z_{\\delta_e}\\\\M_{\\delta_e}^*\\\\0 \n",
" \\end{bmatrix}, \\vec{u}=\\left[\\delta_e\\right]$$\n",
"\n",
"For the lateral/directional equations in state space form:\n",
"\n",
"$$\\boldsymbol{A}=\\begin{bmatrix}Y_v & 0 & -U_0 & g\\cdot\\cos\\theta_0 & 0\\\\L_v^* & L_p^* & L_r^* & 0 & 0\\\\N_v^* & N_p^* & N_r^* & 0 & 0\\\\0 & 1 & \\tan\\theta_0 & 0 & 0 \\\\ 0 & 0 & \\sec\\theta_0 & 0 & 0\\end{bmatrix}, \\vec{x} = \\begin{bmatrix}v\\\\p\\\\r\\\\\\phi\\\\\\psi\\end{bmatrix}, \\boldsymbol{B}=\\begin{bmatrix}Y_{\\delta_r} & Y_{\\delta_a}\\\\L_{\\delta_r}^* & L_{\\delta_a}^*\\\\N_{\\delta_r}^* & N_{\\delta_a}^*\\\\0 & 0\\\\0 & 0\\end{bmatrix}, \\vec{u}=\\begin{bmatrix}\\delta_r\\\\\\delta_a\\end{bmatrix}$$\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Some aircraft may have derivatives listed that have been neglected in the preceding - for example, you may find an aircraft with a nonzero $C_{D_q}$, which is the nondimensional form of $X_q$. You can hopefully appreciate that it can be readily re-inserted into the longitudinal equations of motion by choosing the logical place to insert into the system matrix:\n",
"\n",
"$$\\boldsymbol{A}=\\begin{bmatrix}\n",
" X_u & X_w & \\color{red}{X_q} & -g\\cdot\\cos\\theta_0\\\\\n",
" Z_u & Z_w & U_0 & -g\\cdot\\sin\\theta_0\\\\\n",
" M_u^* & M_w^* & M_q^* & M_\\theta^*\\\\\n",
" 0 & 0 & 1 & 0 \n",
" \\end{bmatrix}$$\n",
" \n",
"Similarly, if you have an aircraft with a $C_{X_{\\delta_e}}$ and hence $\\cdot X_{\\delta_e}$ term, then this would be inserted into the control matrix\n",
"\n",
"$$\\boldsymbol{B}= \\begin{bmatrix}\n",
" \\color{red}{X_{\\delta_e}}\\\\Z_{\\delta_e}\\\\M_{\\delta_e}^*\\\\0 \n",
" \\end{bmatrix}$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Units\n",
"\n",
"As we'll discover, it's useful to know the dimensions of the different derivatives. Rather than writing them all out, the following guide will help:\n",
"\n",
"#### Force Derivative wrt Velocity Perturbation\n",
"\n",
"This is the terms like $X_u$ or $Z_w$. These all have units of $\\left[\\text{T}^{-1}\\right]$ or $s^{-1}$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"celltoolbar": "Tags",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}